使用wordpress get_posts函数中的meta_query检查元键字符串中是否存在字符串


Check if string exists in meta key string using meta_query check in wordpress get_posts function

好吧,你可能会认为这是一段相当琐碎的代码,但它不起作用。

下面的代码没有被破坏,只是没有正常工作。


好的,在wordpress中,我的自定义帖子类型中有一个自定义字段:个人,这个自定义字段有一个meta_key:login_email

这个元密钥的内容只是电子邮件地址。

下面是一些内容的例子。。

bob.dougal@gmail.com, bob.dougal@company.com, bob.dougal@hotmail.com

或。。

bob.dougal@gmail.com, bob.dougal@hotmail.com

甚至只是一个电子邮件字符串。。

bob.dougal@hotmail.com

好的,现在您看到了自定义字段的字符串内容。我可以解释我正在努力实现的目标。

我有这个变量。。。$current_user_email = $current_user->user_login;

这是一个单一的电子邮件地址字符串。

然后我需要查找此电子邮件地址是否存在于meta_key内容中。我就是这样做的…

$lastposts = get_posts(array(
    'posts_per_page'    => 1,
    'post_type'         => 'individual',
    'post_status'       => 'private',
    'meta_query'        => array(
        array(
            'key' => 'login_email',
            'value' => $current_user_email,
            'compare' => 'IN'
        )
    )
));


在我上面的例子中,如果我回显$current_user_email,它会输出bob.dougal@company.com

但是即使bob.dougal@company.com存在于这样的自定义字段中。。。bob.dougal@gmail.com, bob.dougal@company.com, bob.dougal@hotmail.com,我的get_post不返回任何内容。

如果我转到帖子编辑器,从自定义字段中删除所有其他电子邮件,使bob.dougal@company.com是自定义字段中唯一的文本,那么上面的查询就可以了!

我的问题是,如何让meta_query在包含以下字符串的meta_key中找到bob.dougal@company.combob.dougal@gmail.com, bob.dougal@company.com, bob.dougal@hotmail.com

因为"IN"没有做它应该做的事。


代码取自http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters


感谢

我相信这可能是因为您将多个电子邮件地址存储在一个密钥中,而不是将多个密钥分别存储一个电子邮件地址。

因此,IN将无法工作,因为它会检查给定值是否存在于一组可能性中(类似于PHP in_array()的工作方式)。

您需要做的是用LIKE替换IN。这将检查整个字符串中是否存在您的电子邮件地址并返回匹配项。

不过你应该小心,因为这可能会导致不稳定的结果。例如,如果$current_user_email = bob.dougal@company.com;,则以下所有情况都为真-

bob.dougal@gmail.com, 1bob.dougal@company.com, bob.dougal@hotmail.com
bob.dougal@gmail.com, 12bob.dougal@company.com, bob.dougal@hotmail.com
bob.dougal@gmail.com, 123bob.dougal@company.com, bob.dougal@hotmail.com

我承认这是不可能的,但这就是为什么不应该使用字符串来存储多个值。我强烈建议使用多个键(可以有多个具有相同名称的键),然后可以在查询中使用IN。这也只能保证精确匹配。

$current_user_email是一个字符串。所以把这个字符串转换成一个数组:
$current_user_email = explode(", ", $current_user_email);
$lastposts = get_posts(array(
    'posts_per_page' => 1,
    'post_type' => 'individual',
    'post_status' => 'private',
    'meta_query' => array(
         array(
             'key' => 'login_email',
             'value' => $current_user_email,
             'compare' => 'IN'
         )
    )
));