WP_QUERY筛选器和ORDER BY META ORDER BY错误的连接表

时间:2012-03-28 作者:paulbennett

我正在尝试使用meta\\u值过滤和排序Wordpress查询,但是ORDER BY 部分查询似乎在错误的表上工作。

此处的查询参数为:

array(12) {
  ["post_type"]=>"op-events"
  ["paged"]=>1
  ["meta_query"]=>
  array(2) {
    ["relation"]=>"OR"
    [0]=>
    array(4) {
      ["key"]=>"_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0"
      ["value"]=>"2012-03-28"
      ["compare"]=>">"
      ["type"]=>"DATE"
    }
  }
  ["meta_key"]=>"_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0"
  ["orderby"]=>"meta_value"
  ["order"]=>"ASC"
}
想法是在今天之后按日期过滤,然后按日期升序排列帖子。通常我可能会手动构建此查询,但您会看到“\\u simple\\u fields”meta\\u键,这是因为这些字段是由simple fields插件创建的,因此我不知道它们的键是什么。

生成的查询结果为:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* 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) 
WHERE 1=1 
AND wp_posts.post_type = \'op-events\' 
AND
(
    wp_posts.post_status = \'publish\' 
    OR wp_posts.post_status = \'private\'
) 
AND
(
    wp_postmeta.meta_key = \'_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0\' 
    OR
    (
        mt1.meta_key = \'_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0\' 
        AND CAST(mt1.meta_value AS DATE) > \'2012-03-28\'
    )
) 
GROUP BY wp_posts.ID 
ORDER BY wp_postmeta.meta_value ASC 
LIMIT 0, 10
由于某些原因,此查询没有按正确的顺序返回行,我唯一能想到的是ORDER BY wp_postmeta.meta_value ASC 该行实际上应该由my1订购。meta\\u值。

有人能解释一下吗?

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

注意:只需简单阅读,否则我可能会误解你的问题。

JOIN 在…上meta_query/post\\u元表很漂亮。。。嗯,有趣(?)。。。你会的JOIN 您添加的每个键的表(再次)-这是一个已知的问题(在trac上读取)。详细地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). 和ORDER BY wp_postmeta.meta_value ASC 是否与相同ORDER BY mt1.meta_value ASC.

您可以尝试使用posts_clauses or posts_orderby filter 更改ORDER BY 声明:

function wpse_change_orderby( $orderby )
{
    return \'ORDER BY DATE ASC\';
}
add_filter( \'posts_orderby\', \'wpse_change_orderby\' );

结束

相关推荐

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

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