首页 > 解决方案 > 根据序列化的元值获取帖子

问题描述

我有一系列帖子,并且都有一个值为“所有者”的 meta_key 和一个带有序列化数据的 meta_value,例如“a:3:{i:0;s:3:”325”;i:1;s:2 :"41";i:2;s:2:"29";}"

元密钥owner

元值a:3:{i:0;s:3:"325";i:1;s:2:"41";i:2;s:2:"29";}

我试图弄清楚如何正确使用get_posts()来返回所有具有 meta_key 值的帖子,owner并且 meta_value 包含特定值,例如41

    $args = array(
        'post_type' => 'rp_applications',
        'nopaging' => true,
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'compare' => '=',
                'key' => 'archived',
                'value' => '0000-00-00'
            ),
            array(
                'compare' => '=',
                'key' => 'owner',
                'value' => ???? WHAT DO I PUT HERE ????
            )
        )
    );

    $applications = get_posts($args);

标签: wordpress

解决方案


听起来您应该将“所有者”存储为分类术语而不是元数据。它还将为您提供更轻松、更快的查询能力。

也就是说,绝对有可能做你想做的事。不过我会保持谨慎,因为postmeta默认情况下该表未编制索引,因此对它运行元查询的大型表会大大降低您的网站速度。如果表格变得非常大,您可能需要考虑向表格添加部分索引(或者再次切换到分类术语而不是为此发布元数据)。

如果您仍然关心使用元查询,请查看docs中提供compare选项。WP_Meta_Query()

可用选项之一是REGEXP,因此您可以执行以下操作:

$args = array(
    'post_type' => 'rp_applications',
    'nopaging' => true,
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'compare' => 'REGEXP',
            'key'     => 'owner',
            'value'   => sprintf( 'a:\d:{i:0;s:\d:"\d.*?";i:1;s:%d:"%d".*', strlen($owner_id), $owner_id )
        ),
        array(
            'compare' => '=',
            'key'     => 'archived',
            'value'   => '0000-00-00'
        )
    )
);

当然,此方法仅适用于每个序列化数据的格式相同的情况,如果不是,您需要调整正则表达式 - 但这应该足以让您开始!


推荐阅读