如何使用数组作为meta_field来创建meta_Query?

时间:2012-06-15 作者:mike23

以下是我的查询的参数:

$args = array(
    \'post_type\' => \'news\',
    \'meta_query\' => array(
        array(
            \'key\' => \'topics\',
            \'value\' => \'sports\',
        )
    )
);
topics 是字符串,但是not 当它是数组时。我希望此查询在topics 例如array( \'sports\', \'nonprofit\', etc. )

有没有办法用数组作为meta\\u键来构建元查询?

5 个回复
最合适的回答,由SO网友:Johannes Pille 整理而成

如果数据库中的值是字符串,并且要向查询提供多个值,则向查询提供一个可能值的数组:

$args = array(
    \'post_type\' => \'news\',
    \'meta_query\' => array(
        array(
            \'key\' => \'topics\',
            \'value\' => array ( \'sports\', \'nonprofit\', \'community\' ),
            \'compare\' => \'IN\'
        )
    )
);
如果数据库中的值是多个主题的数组,并且您希望在该数组中搜索单个主题(请注意,数据库中的数组可以这样检索,但以序列化形式存在于数据库中,也可以是字符串),则在序列化数据数组中搜索特定值:

$args = array(
    \'post_type\' => \'news\',
    \'meta_query\' => array(
        array(
            \'key\' => \'topics\',
            \'value\' => \'sports\',
            \'compare\' => \'LIKE\'
        )
    )
);
使用“LIKE”作为比较值并不像您希望的那样明确,但它是最好的选择。

除此之外,您唯一的其他选择是检索所有具有meta\\u键的帖子;“主题”;手动设置并迭代它们,或者换句话说,检查循环中的值,并在所述条件下显示帖子。

EDIT 2021

虽然仍然有效,但上述答案已有9年历史
Have a look at @sMyle\'s and at @Kaji\'s excellent answers as well.

SO网友:sMyles

从Johannes的反应来看,由于它是一个序列化的数组,如果您碰巧存储了类似于用户id的内容(这是我的情况),那么您可能需要以稍微不同的方式来处理它。

正在保存Post meta,如下所示:

array( "1", "23", "99");
是的,它们是整数,但通过update_post_meta 它们被保存为字符串。

\'meta_query\' => array(
            array(
                    \'key\'     => \'my_meta_key\',
                    \'value\'   => serialize( strval( 1 ) ),
                    \'compare\' => \'LIKE\'
                )
            )
因此,实际上您正在与所要查找的序列化字符串版本进行类似的比较。

EDIT 2022:

如果保存的不是字符串(另存为整数),并且您使用serialize( intval( $value ) ) , 您会遇到与索引而不是值匹配的潜在问题。

例如:

array( 1234, 5678 );
保存方式如下:

a:1:{i:0;i:1234;i:1;i:5678;}
如果您使用serialize( intval( 1 ) ) 在元查询中,您将匹配i:1; 这是索引,不是值,所以be careful
SO网友:Kaji

与@sMyles的回答相比,还有一点小小的改进。

我曾经遇到过这样的情况,ID被存储为字符串(例如从表单输入中获取的字符串)和整数(例如。update_post_meta($post_id, authorized_users\', array(get_current_user_id()));). 这有点像众所周知的wp_set_object_terms() 您可以使用术语ID来设置术语,但如果您不先将它们转换为整数,则有大约50%的机会创建以这些数字作为名称的新术语。

这可能会导致它们以完全不同的方式存储在序列化数组中,从我的测试站点数据库中的一个案例摘录中可以看出:

a:1:{i:0;s:1:"1";} // \'s\' for \'string\', also note the double quotes
a:1:{i:0;i:1;} // \'i\' for \'integer\', no quotes
当通过print_r() 将渲染为

Array
(
    [0] => 1
)
为了解决这个问题,我对meta_query 通过添加relation 以及将值转换为整数而不是字符串的查询的另一个版本。

以下是最终结果:

        \'meta_query\' => array(
            \'relation\' => \'OR\', // Lets it know that either of the following is acceptable
            array(
                \'key\' => \'bcm_enm_authorized_users\',
                \'value\'   => serialize(strval(get_current_user_id())), // Saved as string
                \'compare\' => \'LIKE\'
            ),
            array(
                \'key\' => \'bcm_enm_authorized_users\',
                \'value\'   => serialize(intval(get_current_user_id())), // Saved as integer
                \'compare\' => \'LIKE\'
            ),
        ),
EDIT: 刚刚意识到,此方法可能会与数组索引发生冲突,这可能会允许某些人非法访问不在数组中但其用户ID显示为索引的材质。因此,如果您讨论了这个问题,那么这个方法可以工作,但更好的做法是确保您要搜索的任何值在保存之前都转换为字符串,以便您可以使用@sMyles方法。

SO网友:Julian Stark

我今天遇到了类似的事情。我必须查询具有多个相关用户(数组)的ACF(高级自定义字段)关系字段。

通过php更新字段后,查询不起作用。通过ACF UI更新后,查询工作正常。

问题是,我的php代码将关系值设置为int值,UI将其设置为字符串值。为了确保这两种方法都有效,我现在使用此查询(适用于此处的示例):

$args = array(
    \'post_type\' => \'news\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'topics\',
            \'value\' => \'1;\',  // works for int-array
            \'compare\' => \'LIKE\'
        ),
        array(
            \'key\' => \'topics\',
            \'value\' => \'"1"\',  // works for string-array
            \'compare\' => \'LIKE\'
        ),
    )
);

SO网友:Ha Doan Ngoc

我赞成约翰内斯的回答。然而,我想改进这一点,因为使用该meta\\u查询,您将遇到如下情况

您的价值是

array(\'sports\',\'movies\', \'sports2\');
搜索时

$args = array(
    \'post_type\' => \'news\',
    \'meta_query\' => array(
        array(
            \'key\' => \'topics\',
            \'value\' => \'sports\',
            \'compare\' => \'LIKE\'
        )
    )
);
然后,结果将同时返回“sport”和“sport2”。

要解决此问题,请将meta\\u查询参数更改为

$args = array(
    \'post_type\' => \'news\',
    \'meta_query\' => array(
        array(
            \'key\' => \'topics\',
            \'value\' => \'sports";\',
            \'compare\' => \'LIKE\'
        )
    )
);
这是因为该值在数据库中是序列化的,并且每个项都将用分号分隔。因此,上述参数将起作用

如果值中的项目是数字,则只需删除双引号“

$args = array(
        \'post_type\' => \'news\',
        \'meta_query\' => array(
            array(
                \'key\' => \'topics\',
                \'value\' => \'1;\',
                \'compare\' => \'LIKE\'
            )
        )
    );

结束

相关推荐

如何使用AJAX和$wp_Query过滤静态发布页面

我不知所措,我发现了几个与此相关的悬而未决的问题。我有一个静态贴子页面,侧栏中有一个搜索表单。我想做的是键入一个关键字,然后“过滤”(使用ajax返回)只过滤适合搜索的帖子。我还希望它被分页。我找到了几种操纵的方法$wp_query 这样我就可以对ajax调用使用相同的循环。不幸的是当我看global $wp_query 在函数中。在我的回调操作所在的php中,它基本上是null或初始化为默认参数。我在本地调试所有东西,我想知道这是否会影响任何东西。我还没有确认,但除非显式地发生了什么事情(比如导航到新页