我已经与一个bug斗争了几个小时,似乎找不到我的错误。WordPress中是否存在关系类型为“OR”的bug?
$evenements = new WP_Query(array(
\'post_type\' => \'evenements\',
\'orderby\' => \'meta_value\',
\'meta_key\' => \'startDate\',
\'order\' => \'ASC\',
\'meta_query\' => array(
\'relation\' => \'OR\',
array(
\'key\' => \'startDate\',
\'value\' => date(\'Ymd\'),
\'compare\' => \'>=\',
),
array(
\'key\' => \'endDate\',
\'value\' => date(\'Ymd\'),
\'compare\' => \'>=\',
),
),
));
奇怪的是,如果我把关系放在“AND”上,它就会按预期工作。如果这两种说法都是真的,那么帖子就会出现。如果我把关系放在“或”上,所有的帖子都会显示出来,而且由于某种原因,甚至命令也不能正常工作。即使将“顺序”从“ASC”更改为“DESC”,也不会更改结果的顺序。
为了理解这个查询,下面是我要做的详细信息:
我想展示正在进行或未来的活动。这两个元是事件开始的日期(startDate)和事件结束的日期(endDate)。
因此,如果开始日期高于或等于今天(如果今天发生了事件),或者结束日期高于或等于今天,请显示帖子。
第二部分(带结束日期)是为了显示正在进行的事件,我不能删除第一部分(带开始日期),因为如果事件只持续一天,客户端将只输入startDate元。
我丢弃了来自插件的bug,因为我禁用了所有插件,bug仍然存在。
这是我得到的如果echo $evenements->request
.
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts
INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id)
JOIN wp_icl_translations t
ON wp_posts.ID = t.element_id AND t.element_type = \'post_evenements\'
JOIN wp_icl_languages l ON t.language_code=l.code AND l.active=1
WHERE 1=1
AND wp_posts.post_type = \'evenements\'
AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\')
AND (
wp_postmeta.meta_key = \'startDate\'
OR ( mt1.meta_key = \'startDate\' AND CAST(mt1.meta_value AS CHAR) >= \'20140305\' )
OR ( mt2.meta_key = \'endDate\' AND CAST(mt2.meta_value AS CHAR) >= \'20140305\' )
)
AND t.language_code=\'fr\'
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value ASC
LIMIT 0, 10
SO网友:gmazzap
问题是,WordPress得到的所有帖子都有一个“startDate”元键,而不管元值是多少。
您可以理解请求的这一部分:
...
AND (
wp_postmeta.meta_key = \'startDate\'
OR ( mt1.meta_key = \'startDate\' AND CAST(mt1.meta_value AS CHAR) >= \'20140305\' )
OR ( mt2.meta_key = \'endDate\' AND CAST(mt2.meta_value AS CHAR) >= \'20140305\' )
)
...
因此,如果一篇文章有一个meta\\u键“startDate”,它将被返回。
这种行为的罪魁祸首是\'meta_key\'
论点
...
new WP_Query( array(
\'post_type\' => \'evenements\',
\'orderby\' => \'meta_value\',
\'meta_key\' => \'startDate\', // <-- this is the culprit
...
然而,如果您删除它,您将无法按元值排序,因为有时WordPress是。。。(我不知道英语术语,请自己完成句子)。
解决方案是(应该)将元查询的第一部分(关于开始日期)作为参数(而不是meta_query
), 第二部分(关于结束日期)在内meta_query
阵列:
$evenements = new WP_Query(array(
\'post_type\' => \'evenements\',
\'meta_key\' => \'startDate\',
\'meta_value\' => date(\'Ymd\'),
\'meta_type\' => \'NUMERIC\',
\'meta_compare\' => \'>=\',
\'orderby\' => \'meta_value\',
\'order\' => \'ASC\',
\'meta_query\' => array(
\'relation\' => \'OR\',
array (
\'key\' => \'endDate\',
\'value\' => date(\'Ymd\'),
\'compare\' => \'>=\',
\'type\' => \'NUMERIC\'
)
)
));
您的设置太复杂,无法让我准确地测试它,所以请您自己尝试并让我知道。