Make WordPress Core

Ticket #38034: 38034.6.diff

File 38034.6.diff, 4.7 KB (added by boonebgorges, 6 years ago)
  • src/wp-includes/class-wp-query.php

    diff --git src/wp-includes/class-wp-query.php src/wp-includes/class-wp-query.php
    index e569e02ef1..0f38c6479b 100644
    class WP_Query { 
    15461546                        'menu_order',
    15471547                        'comment_count',
    15481548                        'rand',
     1549                        'post__in',
     1550                        'post_parent__in',
     1551                        'post_name__in',
    15491552                );
    15501553
    15511554                $primary_meta_key   = '';
    class WP_Query { 
    15761579                        return false;
    15771580                }
    15781581
     1582                $orderby_clause = '';
     1583
    15791584                switch ( $orderby ) {
    15801585                        case 'post_name':
    15811586                        case 'post_author':
    class WP_Query { 
    16031608                        case 'meta_value_num':
    16041609                                $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0";
    16051610                                break;
     1611                        case 'post__in':
     1612                                if ( ! empty( $this->query_vars['post__in'] ) ) {
     1613                                        $orderby_clause = "FIELD({$wpdb->posts}.ID," . implode( ',', array_map( 'absint', $this->query_vars['post__in'] ) ) . ')';
     1614                                }
     1615                                break;
     1616                        case 'post_parent__in':
     1617                                if ( ! empty( $this->query_vars['post_parent__in'] ) ) {
     1618                                        $orderby_clause = "FIELD( {$wpdb->posts}.post_parent," . implode( ', ', array_map( 'absint', $this->query_vars['post_parent__in'] ) ) . ' )';
     1619                                }
     1620                                break;
     1621                        case 'post_name__in':
     1622                                if ( ! empty( $this->query_vars['post_name__in'] ) ) {
     1623                                        $post_name__in = array_map( 'sanitize_title_for_query', $this->query_vars['post_name__in'] );
     1624                                        $post_name__in_string = "'" . implode( "','", $post_name__in ) . "'";
     1625                                        $orderby_clause = "FIELD( {$wpdb->posts}.post_name," . $post_name__in_string . ' )';
     1626                                }
     1627                                break;
    16061628                        default:
    16071629                                if ( array_key_exists( $orderby, $meta_clauses ) ) {
    16081630                                        // $orderby corresponds to a meta_query clause.
    class WP_Query { 
    22392261                        $q['order'] = $rand ? '' : $this->parse_order( $q['order'] );
    22402262                }
    22412263
     2264                // These values of orderby should ignore the 'order' parameter.
     2265                $force_asc = array( 'post__in', 'post_name__in', 'post_parent__in' );
     2266                if ( isset( $q['orderby'] ) && in_array( $q['orderby'], $force_asc, true ) ) {
     2267                        $q['order'] = '';
     2268                }
     2269
    22422270                // Order by.
    22432271                if ( empty( $q['orderby'] ) ) {
    22442272                        /*
    class WP_Query { 
    22522280                        }
    22532281                } elseif ( 'none' == $q['orderby'] ) {
    22542282                        $orderby = '';
    2255                 } elseif ( $q['orderby'] == 'post__in' && ! empty( $post__in ) ) {
    2256                         $orderby = "FIELD( {$wpdb->posts}.ID, $post__in )";
    2257                 } elseif ( $q['orderby'] == 'post_parent__in' && ! empty( $post_parent__in ) ) {
    2258                         $orderby = "FIELD( {$wpdb->posts}.post_parent, $post_parent__in )";
    2259                 } elseif ( $q['orderby'] == 'post_name__in' && ! empty( $post_name__in ) ) {
    2260                         $orderby = "FIELD( {$wpdb->posts}.post_name, $post_name__in )";
    22612283                } else {
    22622284                        $orderby_array = array();
    22632285                        if ( is_array( $q['orderby'] ) ) {
  • tests/phpunit/tests/post/query.php

    diff --git tests/phpunit/tests/post/query.php tests/phpunit/tests/post/query.php
    index 3e95e73605..1112c87e04 100644
    class Tests_Post_Query extends WP_UnitTestCase { 
    174174                $this->assertSame( $ordered, wp_list_pluck( $q->posts, 'ID' ) );
    175175        }
    176176
     177        /**
     178         * @ticket 38034
     179         */
     180        public function test_orderby_post__in_array() {
     181                $posts = self::factory()->post->create_many( 4 );
     182
     183                $ordered = array( $posts[2], $posts[0], $posts[3] );
     184
     185                $q = new WP_Query( array(
     186                        'post_type' => 'any',
     187                        'post__in' => $ordered,
     188                        'orderby' => array( 'post__in' => 'ASC' ),
     189                ) );
     190                $this->assertSame( $ordered, wp_list_pluck( $q->posts, 'ID' ) );
     191        }
     192
     193        /**
     194         * @ticket 38034
     195         */
     196        public function test_orderby_post__in_array_with_implied_order() {
     197                $posts = self::factory()->post->create_many( 4 );
     198
     199                $ordered = array( $posts[2], $posts[0], $posts[3] );
     200
     201                $q = new WP_Query( array(
     202                        'post_type' => 'any',
     203                        'post__in' => $ordered,
     204                        'orderby' => 'post__in',
     205                ) );
     206                $this->assertSame( $ordered, wp_list_pluck( $q->posts, 'ID' ) );
     207        }
     208
    177209        function test_post__in_attachment_ordering() {
    178210                $post_id    = self::factory()->post->create();
    179211                $att_ids    = array();
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-posts-controller.php tests/phpunit/tests/rest-api/rest-posts-controller.php
    index 074f5437e7..ee01eb717e 100644
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    291291                $data     = $response->get_data();
    292292                $this->assertEquals( 2, count( $data ) );
    293293                $this->assertEquals( $id1, $data[0]['id'] );
    294                 $this->assertPostsOrderedBy( "FIELD( {posts}.ID, $id1,$id3 )" );
     294                $this->assertPostsOrderedBy( "FIELD({posts}.ID,$id1,$id3)" );
    295295                // Invalid include should error
    296296                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
    297297                $request->set_param( 'include', 'invalid' );