LIKE %...% Meta Query

时间:2013-02-08 作者:Troy

我有一个序列化数组作为元值,我正在尝试运行WP Query,它在序列化数组中找到一个特定的值。

以下是序列化数组字段的示例:

a:6:{i:0;s:3:"173";i:1;s:3:"172";i:2;s:3:"171";i:3...
这是我的查询,但它不起作用:ID也是我正在搜索的数字。

$practiceArgs = array(
    \'post_type\' => \'attorney\',
    \'post_status\' => \'publish\',
    \'posts_per_page\' => -1,
    \'meta_query\' => array(
                        array(
                              \'key\' => \'practice_area\',
                              \'value\' => $post->ID,
                              \'compare\' => \'LIKE\',
                              \'type\' => \'NUMERIC\'
                              )
                        )
);
我试过使用\'value\' => \'%\'.$post-ID.\'%\' 在我的查询中,但它似乎不起作用。

有人有过这方面的工作经验吗?

4 个回复
最合适的回答,由SO网友:Darren Felton 整理而成

我今天遇到了同样的问题。在我们两种情况下,实际上都有一个很好的解决方案。因为我们正在搜索的序列化数据只是ID,并且它们总是包装在引号中,所以我们只需要将引号作为查询的一部分。这消除了在搜索结果中遇到误报的问题。

您只需将元查询修改为以下内容:

array(
    \'key\' => \'practice_area\',
    \'value\' => \'"\'.$post->ID.\'"\',
    \'compare\' => \'LIKE\',
)
这样,它将搜索整个ID,包括序列化数组中ID前后的双引号。不包括误报。

SO网友:Tomas Buteler

我曾经遇到过这个问题,但这绝对不是一个好地方。你这样做你会never 有一个一致的结果——您的搜索将出现大量误报(即搜索post ID 43将返回143、243、1431、1432等)。

在我看来,你有两个选择:

重新思考保存元数据的方式;将数组用于仅在呈现帖子时需要的数据,而不用于需要查询以筛选帖子的数据。对于后者,请在db中使用单独的元键——这样速度更快,查询更容易编码,而且您可以放心,您将完全控制查询返回的内容。不要担心在PostMeta表中使用太多的行:这就是它们存在的原因"id:43,id:54,foo:bar,id:57,", 然后搜索\'id:{post_ID},\' (请注意,为了在LIKE搜索中安全地使用双通配符,所有值都应以逗号结尾。这有点像黑客,但它比您现在要使用的更可靠。关于它的价值,关于最初的问题,WP在使用query_posts, 所以你什么都不用做。

SO网友:Christian Oviedo Gabarda

Wordpress LIKE不像Mysql LIKE,所以“value”=>“%”$post-ID.“%”不起作用。

您可以尝试REGEXP版本。例如:

\'meta_query\' => array(
    array(
        \'key\'       => \'attorney\',
        \'value\'     => \'^\'.$post-ID,
        \'compare\'   => \'REGEXP\',
    )
)
应搜索律师以$post ID值开头的所有元素。

SO网友:s_ha_dum

您不能使用LIKE 具有numeric (至少我很确定你不能)。numeric 将尝试转换整个value 到一个数字。这将失败,因为它不是一个数字。这是第一个错误。

其次,要获得文字%, 你需要加倍%%. 注:我不记得了meta_query 严格来说。我是根据% 通过$wpdb->prepare 但我认为是一样的。Edit: 这似乎只适用于$wpdb->prepare. 代码已编辑。

我还没有测试这个,因为我需要在数据库中设置一些东西,现在没有时间,但我认为它会起作用。

$practiceArgs = array(
    \'post_type\' => \'attorney\',
    \'post_status\' => \'publish\',
    \'posts_per_page\' => -1,
    \'meta_query\' => array(
      array(
        \'key\' => \'practice_area\',
        \'value\' => $post->ID,
        \'compare\' => \'LIKE\'
      )
    )
);
我希望这就是你需要的推动力。如果不起作用,我会重新访问。

Edit: 我将您的(损坏的)序列化数组插入到我的数据库中,并运行上面的代码。如果我正确设置了所有内容(meta\\u字段、帖子类型等),那么上面的代码就可以正常工作。如果这对你不起作用,你就有别的事情要做——也许你认为应该在没有比赛的地方举行比赛。

我假设你的每个“律师”职位都会有这样的数组。如果你这样做了,那应该行得通。我可能倾向于多重practice_area 行,而不是使用序列化数组。= 是比LIKE, 尤其是当您使用通配符时,您的结果应该更准确。索引(MySQL数据库)也应该工作得更好。

结束

相关推荐