根据序列化元值获取帖子

时间:2021-01-24 00:30:33

标签: wordpress

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

meta_key owner

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

我正在尝试弄清楚如何正确使用 get_posts() 返回所有具有值为 owner 的 meta_key 和包含特定值(例如 41)的 meta_value 的帖子

    $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);

1 个答案:

答案 0 :(得分:0)

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

也就是说,绝对可以做您想做的事。不过我会很谨慎,因为默认情况下 postmeta未编入索引,因此运行元查询的大表会大大减慢您的网站的速度。如果表甚至会很大,您可能需要考虑向表添加部分索引(或者再次切换到分类术语而不是为此发布元数据)。

如果您仍然想使用元查询,请查看可用的 compare 选项 in the WP_Meta_Query() docs

可用选项之一是 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'
        )
    )
);

当然,这种方法只有在序列化数据的格式相同时才有效,否则您需要调整正则表达式 - 但这应该足以让您开始!

相关问题