好吧,你可能会认为这是一段相当琐碎的代码,但它不起作用。
下面的代码没有被破坏,只是没有正常工作。
好的,在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.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
感谢
我相信这可能是因为您将多个电子邮件地址存储在一个密钥中,而不是将多个密钥分别存储一个电子邮件地址。
因此,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 = 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'
)
)
));