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

时间:2013-12-10 11:15:30

标签: php wordpress

好的,你会认为这是一段相当简单的代码,但它没有用。

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


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

此meta_key的内容只是电子邮件地址。

以下是内容的一些例子..

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


由于

2 个答案:

答案 0 :(得分:2)

我相信这可能会发生,因为您在一个密钥中存储了多个电子邮件地址,而不是每个密钥都有一个电子邮件地址。

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

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

你应该小心,因为这会导致不稳定的结果。例如,如果$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。这也只能保证完全匹配。

答案 1 :(得分:1)

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