排序:使用orderby meta_value_num然后按标题排序的自定义查询


8

我尝试运行自定义帖子类型查询以匹配以下条件:
首先按年份降序对电影进行排序,
然后按名称标题(在“年内”进行排序)。

所需的输出:
电影标题A,2006
电影标题Z,2006
...
电影标题A,1996
电影标题Z,1996

我使用以下代码:

$wp_query = new WP_Query();
$wp_query->query( array(
'post_type' => 'movies', 
                      'distribution' => 'companyA', 
                      'meta_key' => 'year',
                      'orderby' => 'meta_value_num title',  
                      'order' => 'DESC', 
                      'posts_per_page' => -1, 
                      'post_status' => 'publish',
));

我尝试了几件事,但我只能得到这个“反”结果:

电影A,1996
电影Z,1996
...
电影A,2006
电影Z,2006

如果我更改DESC,ASC,则仅更改标题排序。但我需要将其应用于年份而不是标题。

使用两个ord​​erby值是正确的方法吗?还是我必须使用meta_query或自定义SQL?

提前谢谢!

这是从中得到的SQL查询 $GLOBALS['wp_query']->request

SELECT wp_posts。*
FROM wp_posts
       INNER JOIN wp_term_relationships
               ON(wp_posts.id = wp_term_relationships.object_id)
       INNER JOIN wp_postmeta
               ON(wp_posts.id = wp_postmeta.post_id)
WHERE 1 =
       AND(wpterm_type ) WHERE 1 = AND(wpterm
       。 ='电影'
       AND(wp_posts.post_status ='publish')
       AND(wp_postmeta.meta_key ='year')
GROUP BY wp_posts.id
ORDER BY wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

Answers:


1

这非常粗糙,但是应该按年份(meta_value)然后按标题对帖子进行排序。它确实取决于查询的设置方式,因此它仅适用于以下查询或类似查询。

function alter_order_wpse_103181($order,$qry) {
  remove_filter('posts_orderby','alter_order',1,2);
  $order = explode(',',$order);
  $order = implode( ' ASC,',$order);
  return $order;
}
add_filter('posts_orderby','alter_order_wpse_103181',1,2);

$q = new WP_Query();
$q->query( array(
  'post_type' => 'movies', 
  'distribution' => 'companyA', 
  'meta_key' => 'year',
  'orderby' => 'meta_value_num title',  
  'order' => 'ASC', 
  'posts_per_page' => -1, 
  'post_status' => 'publish',
));
var_dump($q->request);

有用!非常感谢你。我改变ASC到DESC尽管在alter_order功能到A排序到Z
kyii

ASC应该做空AZ;DESC应该排序ZA。
s_ha_dum 2013年

1

你的问题是没有那么多与orderbyorder。虽然orderby接受多个值并且您的用法看起来还可以,但order 接受ASC DESC

消毒后order附加到orderby处理输出。如果我理解逻辑上的正确性,则意味着在多个orderby参数中,order将适用于所列的最后一个。

尝试反转orderby'title meta_value_num'默认标题,然后order将标题应用于年份而不是标题。


谢谢rarst。但不幸的是,如果我反转值,我会得到排序顺序,只是AZ忽略了meta_value_num(根据事实来猜测,无论ORDER是DESC还是ASC都是相同的顺序)
kyii 2013年

@kyii我不确定“相同的顺序,无论如何”是什么意思?
2013年

抱歉。如果我按照您的建议进行反转,则会得到职位的AZ顺序,尽管我order =>将查询形式ASC中的参数更改为DESC并返回,但该顺序保持不变。所以我想meta_value_num不适用。因此,您对ORDER和ORDERBY相互作用的逻辑的有趣观点也许有所不同?还是我做错了?
kyii 2013年

@kyii不确定...我将尝试以不同组合转储结果查询。但是我认为您最终需要修改SQL,这种逻辑对于更复杂的排序过于严格。
拉斯特2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.