[wp-trac] [WordPress Trac] #58806: Unexpected ordering result when ordering based on multiple clauses

WordPress Trac noreply at wordpress.org
Fri Jul 14 08:17:52 UTC 2023


#58806: Unexpected ordering result when ordering based on multiple clauses
--------------------------+-----------------------------
 Reporter:  pelentak      |      Owner:  (none)
     Type:  defect (bug)  |     Status:  new
 Priority:  normal        |  Milestone:  Awaiting Review
Component:  Query         |    Version:  6.2.2
 Severity:  normal        |   Keywords:
  Focuses:                |
--------------------------+-----------------------------
 I am not sure if this is a bug or this is a mis-understanding from my side
 on how the ordering works but
 Consider the following `WP_Query`:
 {{{#!php
 <?php
 $query = new WP_Query(
     [
         'fields' => 'ids',
         'post_type' => 'post',
         'post_status' => 'publish',
         'posts_per_page' => -1,
         'meta_query' => [
             'relation' => 'OR',
             'sticky_clause' => [
                 'key' => '_sticky',
                 'type' => 'UNSIGNED',
             ],
             [
                 'key' => '_sticky',
                 'compare' => 'NOT EXISTS',
             ],
         ],
         'orderby' => [
             'sticky_clause' => 'desc',
             'title' => 'asc',
         ],
     ]
 );
 }}}

 The expected behavior is that the query should show posts that have a
 `_sticky` meta first, then shows the rest of the posts sorted by their
 title alphabetically.
 However it doesn't happen.


 {{{
 array(7) {
   [0]=>
   string(20) "A guide to WordPress"
   [1]=>
   string(27) "Brotherhood of creativeness"
   [2]=>
   string(30) "Gather all information you can"
   [3]=>
   string(16) "Yet another post"
   [4]=>
   string(12) "Hello world!"
   [5]=>
   string(36) "Opera browser released a new version"
   [6]=>
   string(27) "Zebras are cool and relaxed"
 }
 }}}

 In the above output of post titles, the `"Hello World!"` has `_sticky`
 meta, but the sorting isn't correct (nor alphabetically and nor by
 `_sticky` meta first)

 This is the SQL query generated by this query:

 {{{#!php
 SELECT
   wp_posts.ID
 FROM
   wp_posts
   LEFT JOIN wp_postmeta ON (
     wp_posts.ID = wp_postmeta.post_id
   )
   LEFT JOIN wp_postmeta AS mt1 ON (
     wp_posts.ID = mt1.post_id
     AND mt1.meta_key = '_sticky'
   )
 WHERE
   1 = 1
   AND (
     wp_postmeta.meta_key = '_sticky'
     OR mt1.post_id IS NULL
   )
   AND wp_posts.post_type = 'post'
   AND (
     (wp_posts.post_status = 'publish')
   )
 GROUP BY
   wp_posts.ID
 ORDER BY
   CAST(
     wp_postmeta.meta_value AS UNSIGNED
   ) DESC,
   wp_posts.post_title ASC
 }}}

 If I am not wrong the issue happens at the position `ORDER BY
 CAST(wp_postmeta.meta_value AS UNSIGNED) DESC`, it should use the alias
 instead of the table name here (should be `mt1.meta_value`)

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/58806>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list