Wp_Query中的2个orderby,带有2个自定义字段

时间:2013-06-02 作者:user2410522

我用两个“orderby”和wp\\u查询来显示酒店(我创建的分类法),但我没有成功。

结果如下:

Hotel 1 :       2 persons          5 stars
Hotel 2 :       2 persons          4 stars
Hotel 3 :       2 persons          3 stars
Hotel 4 :       3 persons          5 stars
Hotel 5 :       5 persons          5 stars
Hotel 6:        10 persons         2 stars
Hotel 7:        10 persons         1 star
第一个“order by”是指人数(第一个中最大的),第二个“order by”是指星级(因此,如果多家酒店的人数相同,星级最高的酒店将排在第一)。

下面是我的代码。我尝试在带有meta\\u query的数组中添加一个数组,但没有成功。

$args=
            array(
                                    \'post_type\' => \'hotel\',
                                    \'Services\' => $Services,
                                    \'Town\' => $Town, 
                                    \'meta_key\' => \'Number_persons\',
                                    \'orderby\' => \'meta_value_num\',
                                    \'order\' => \'ASC\',   
                                    \'meta_query\' => array(
                                                           array(
                                                               \'meta_key\' => \'Rating\',
                                                               \'orderby\' => \'meta_value\',
                                                               \'order\' => \'DESC\',   
                                                           )
                                                       )
                 );


$the_query = new WP_Query( $args );
非常感谢:)

1 个回复
SO网友:s_ha_dum

如果你看一下法典WP_Query 你会注意到orderby is not a valid parameter for a meta_query, nor is order, and in fact nor is meta_key.

但即使解决了,我也不认为你能做你想做的事WP_Query. A.meta_query 是一个WHERE 子句元素,这使它成为一种搜索,我认为这不是您想要的。如果你所有的帖子都设置了这些键EXISTS 可能会让你有一部分的方法,但它会排除任何没有这些键的东西。类似这样:

\'meta_query\' => array(
    array(
        \'key\' => \'Rating\',
        \'compare\' => \'EXISTS\'
    ),
    array(
        \'key\' => \'Number_persons\',
        \'compare\' => \'EXISTS\'
    )
)
但订购仍然是一个问题,我看不到解决方法,除了在posts_orderby.

function double_meta_posts_orderby($orderby) {
  global $wpdb;
  return " {$wpdb->postmeta}.meta_value, mt1.meta_value";
}
把这些放在一起。。。

$args = array(
\'post_type\' => \'hotel\',
    \'Services\' => $Services,
    \'Town\' => $Town, 
    \'meta_query\' => array(
  array(
        \'key\' => \'Number_persons\',
        \'compare\' => \'EXISTS\'
      ),
      array(
        \'key\' => \'Rating\',
        \'compare\' => \'EXISTS\'
      ),    
)
);
add_filter(\'posts_orderby\',\'double_meta_posts_orderby\');
$query = new WP_Query( $args );
remove_filter(\'posts_orderby\',\'double_meta_posts_orderby\');
同样,只有当您的所有帖子都有那些meta\\u键时,这才有效。您可以使用posts_joins 您可以自己加入元表,也可以删除WHERE 包含的子句。。。

function kill_where($where) {
  return \'\';
}
add_filter(\'posts_where\',\'kill_where\');
请注意,您正在添加过滤器,然后在查询运行后立即将其删除。如果您想避免这种需要,请查看this answer 其他选项,或使过滤器自动删除。。。

function double_meta_posts_orderby($orderby) {
  remove_filter(\'posts_orderby\',\'double_meta_posts_orderby\');
  global $wpdb;
  return " {$wpdb->postmeta}.meta_value, mt1.meta_value";
}

结束

相关推荐

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

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