好的,你会认为这是一段相当简单的代码,但它没有用。
下面的代码没有被破坏,它只是不能正常工作。
好的,在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.com
:bob.dougal@gmail.com, bob.dougal@company.com, bob.dougal@hotmail.com
因为' IN '没有按照它的意图行事。
代码来自http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
由于
答案 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'
)
)
));