在pre_get_posts回调中使用数组值对meta_query执行自定义post meta

时间:2014-12-11 03:27:02

标签: wordpress

我有一个包含数组值的自定义post元

代码:

update_post_meta($post_id,'custom_meta_key',array('val1','val2','val3','val4'));

现在我想将一个回调挂钩回 pre_get_posts 来修改查询

代码:

add_action('pre_get_posts','foo');

function foo ($q){

    if ( ! $q->is_main_query() ) return;

    if ( ! $q->is_post_type_archive() ) return;

    if ( ! is_admin() ) {

        $q->set('meta_query',array(
            array(
                'key'       =>  'custom_meta_key',
                'value'     =>  array('val1','val3'),
                'compare'   =>  'IN'
            )
        ));

    }

    remove_action( 'pre_get_posts','foo');

}

我希望仅使用' val1' ' custom_meta_key' 帖子元获取帖子>' VAL3'

但结果为空白,页面根本不会返回任何项目。

这一定是因为update_post_meta在保存时序列化了数组? 我想要实现的目标是什么?

1 个答案:

答案 0 :(得分:1)

为了实现我的目标,我需要改变我坚持发布元的方式。

我必须使用add_post_meta

,而不是使用update_post_meta

这样才能实现

    $q->set('meta_query',array(
        array(
            'key'       =>  'custom_meta_key',
            'value'     =>  array('val1','val3'),
            'compare'   =>  'IN'
        )
    ));

我需要这样做

delete_post_meta($post->id,'custom_meta_key');

add_post_meta($post->id,'custom_meta_key','val1');
add_post_meta($post->id,'custom_meta_key','val2');

我首先执行delete_post_meta以防止post meta的值重复(我已将回调附加到save_post钩子)

然后我为每个值

添加add_post_meta

现在custom_meta_key将具有数组值(' val1',' val2'),上述代码将有效。

另外,update_post_meta会对数组进行序列化,但是当用作WP_Query的元查询的参数时,它不会反序列化数组字符串,这就是为什么我的代码上面的代码不能解决的问题。工作

我通过这样做证实了这一点

update_post_meta($post->id,'custom_meta_key',array('val1'))

array(
        'key'       =>  'custom_meta_key',
        'value'     =>  serialize(array('val1')),
        'compare'   =>  'IN'
    )

并且有效

referrences:

update_post_meta

add_post_meta

delete_post_meta