[wp-trac] [WordPress Trac] #17125: orderby is ignored on some pages/queries

WordPress Trac wp-trac at lists.automattic.com
Wed Apr 13 16:45:48 UTC 2011


#17125: orderby is ignored on some pages/queries
------------------------------+-----------------------------
 Reporter:  majestictreefrog  |      Owner:
     Type:  defect (bug)      |     Status:  new
 Priority:  normal            |  Milestone:  Awaiting Review
Component:  Query             |    Version:  3.1
 Severity:  major             |   Keywords:
------------------------------+-----------------------------
 This has happened on both 3.1 and 3.1.1


 For example, take the following code (bug was reproduced with this) as a
 sample category.php code. This is specifically reproduced when viewing a
 subcategory of a larger category, but could be reproduced on multiple
 category pages.
 {{{
 <html>
 <head></head>
 <body>
 <?php

 $newOrder=array(
                 'meta_key'=>'post-order',
                 'orderby'=>'meta_value_num',
                 'order'=>'ASC'
 );
 $newOrder=array_merge( $wp_query->query, $newOrder);
 print_r($newOrder);
 query_posts($newOrder);
 ?><pre><?php
 print_r($wp_query);
 ?></pre><?php
 if (have_posts()) :while (have_posts()) :the_post();

         the_title();
         echo " ->>>";
         echo get_post_meta($post->ID, 'post-order', true);
         the_content();

 endwhile;endif;

 get_footer();
 ?>
 </body>
 </html>
 }}}

 yes, the code includes some reporting/debug statements.  Assuming there is
 a custom meta field: post-order.  This contains a number that is the order
 in which posts are to be displayed (e.g. 1, 2, 40, 1020, etc).

 This query should return posts ordered by post-order.

 the print_r($wp_query) statement returned the following SQL statement as
 what was run:

 {{{
 [request] => SELECT wp_posts.* FROM wp_posts INNER JOIN
 wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
 WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (25,70,71,72,73)
 ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR
 wp_posts.post_status = 'private') GROUP BY wp_posts.ID
 }}}

 (25 is main category, 70, 71,72,73 are subcategories)
 The CORRECT query would be:

 {{{
 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=1  AND
 (wp_term_relationships.term_taxonomy_id IN (25,70,71,72,73) ) AND
  wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR
 wp_posts.post_status = 'private') AND wp_postmeta.meta_key =
 'post-order' GROUP BY wp_posts.ID  order by 0+wp_postmeta.meta_value
 }}}

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/17125>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list