WP_Query orderby meta_key和id

时间:2013-11-28 17:39:23

标签: wordpress

我正在尝试通过meta_value和ID让wp_query获取最后的x个帖子。 prop_featured值可以是1或0。我希望获得帖子列表,其中prop_featured = 1作为第一个,然后其他按ID排序。  这是我的arg数组:

           $args = array(
            'post_type'         => $type,
            'post_status'       => 'publish',
            'paged'             => 0,
            'posts_per_page'    => 10,
            'meta_key'          => 'prop_featured',
            'orderby'           => 'meta_value ID',
            'order'             => 'DESC'

        );

我也尝试使用过滤器

         function my_order($orderby) { 
         global $wpdb; 
         $orderby = 'wp_postmeta.meta_value, wp_posts.ID DESC';
         return $orderby;
         } 

   add_filter( 'posts_orderby', 'my_order' ); 
   $recent_posts = new WP_Query($args);
   remove_filter( 'posts_orderby', 'my_order' ); 

3 个答案:

答案 0 :(得分:1)

在我看来,最简单的解决方案是用数组替换你的初始orderby,如下所示:

$args = array(
    'post_type'      => $type,
    'post_status'    => 'publish',
    'paged'          => 0,
    'posts_per_page' => 10,
    'meta_key'       => 'prop_featured',
    'orderby'        => array( 'meta_value_num' => 'DESC', 'ID' => 'DESC' )
);

答案 1 :(得分:0)

尝试将'orderby' => 'meta_value ID',替换为'orderby' => 'meta_value_num ID',

答案 2 :(得分:0)

解决方案是使用过滤器。我的错误是我没有在每个参数之后下订单 而不是wp_postmeta.meta_value,wp_posts.ID DESC'它应该是'wp_postmeta.meta_value DESC,wp_posts.ID DESC';

这是正确的代码:

      add_filter( 'posts_orderby', 'my_order' ); 
      $recent_posts = new WP_Query($args);
      remove_filter( 'posts_orderby', 'my_order' ); 

     function my_order($orderby) { 
       global $wpdb; 
       $orderby = 'wp_postmeta.meta_value DESC, wp_posts.ID DESC';
     return $orderby;
      } 

希望它有所帮助。