2016-01-21 73 views
0

我想输出一个指南列表,其中每个指南都有投票和评级。所以我想通过评分和投票来对指南列表进行排序。Wordpress - WP_Query Multiple OrderBy Meta_Key

例子:

Guide Name  Rating Votes 
Guide1   10  3 
Guide2   10  2 
Guide3   10  1 
Guide4   9   6 
Guide5   9   2 

所以我有2 meta_key与被

omvp_vote_rating and omvp_total_vote 

我已经尝试了很多很多的方式来订购指南得到它的工作,但还没有得到它尚未。还有一个办法,我几乎都有它的工作,但问题是,我不能让它通过meta_key订购,通过正常的田间像comment_count, modified, date, rand (random), title ... 所以在这里我只能订购这是我的代码

$args = array(
     'post_type' => 'guides', 
     'meta_key' => 'omvp_vote_rating', 
     'post_status' => 'publish', 
     'posts_per_page' => 20, 
     'meta_query' => array(
      array(
       'key' => 'omvp_vote_rating', 
       'compare' => '>=', 
       'value' => 0 
      ), 
      array(
       'key' => 'omvp_total_vote', 
       'compare' => '>=', 
       'value' => 0 
      ), 
     ), 
     'orderby' => array(
      'title' => 'ASC', //<- This is working 
      'omvp_total_vote' => 'DESC' //<- This is not working 
     ), 
    ); 
$wp_query = new WP_Query($args); 

回答

2

您可以通过自定义选择查询来代替。

$query = "SELECT * FROM $wpdb->posts 
LEFT JOIN $wpdb->postmeta AS rating ON(
$wpdb->posts.ID = rating.post_id 
AND rating.meta_key = 'omvp_vote_rating' 
) 
LEFT JOIN $wpdb->postmeta AS vote ON(
$wpdb->posts.ID = vote.post_id 
AND vote.meta_key = 'omvp_total_vote' 
) 
WHERE $wpdb->term_taxonomy.term_id = 3 

AND $wpdb->posts.post_status = 'publish' 
ORDER BY rating.meta_value, vote.meta_value ASC LIMIT 0,20" 

$posts = $wpdb->get_results($query, object); 
+0

嘿,我设法使它像这样的查询工作。问题是用户可能会选择另一个orderby,例如order by Title。在我的代码中,当用户Orderby Title时,ip使用正常的WP_Query($ args)和'orderby'=>'title'。我的问题是当用户决定按标题排序或按排序排序时,我的循环组合正在改变,所以它从“if($ posts-> have_posts()):while(...”到“if($ pageposts ):global $ post; foreach($ pageposts ...“,我真的不知道该如何处理它 –

+0

如果我明白你的问题是正确的,你可以把if-else条件放在orderby字段上 –

+0

是啊我正确理解,但事情是我必须多次复制此查询,以便它适合发送的下拉值中的每个需要 –

0

这是可能。

试试这个:

'order'  => 'DESC', 
'orderby' => 'omvp_vote_rating omvp_total_vote' 

这将降基于为了omvp_vote_ratingomvp_total_vote所有指南排序。

有关更多参考,请参见wp_queryorderorderby参数。

+0

我试过了,顺序似乎没有起作用。当我尝试这种方法时,该列表是无序的。 –