将META_QUERY与关系OR和ORDERBY META_VALUE一起使用的WP_QUERY不起作用

时间:2014-03-05 作者:Fredy31

我已经与一个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

1 个回复
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\'
     )
  )
));
您的设置太复杂,无法让我准确地测试它,所以请您自己尝试并让我知道。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post