Make WordPress Core

Ticket #38034: 38034.2.diff

File 38034.2.diff, 2.5 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..2c044f3649 100644
    class WP_Query { 
    15461546                        'menu_order',
    15471547                        'comment_count',
    15481548                        'rand',
     1549                        'post__in',
    15491550                );
    15501551
    15511552                $primary_meta_key   = '';
    class WP_Query { 
    16031604                        case 'meta_value_num':
    16041605                                $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0";
    16051606                                break;
     1607                        case 'post__in':
     1608                                if ( ! empty( $this->query_vars['post__in'] ) ) {
     1609                                        $orderby_clause = "FIELD({$wpdb->posts}.ID," . implode( ',', array_map( 'absint', $this->query_vars['post__in'] ) ) . ')';
     1610                                }
     1611                                break;
    16061612                        default:
    16071613                                if ( array_key_exists( $orderby, $meta_clauses ) ) {
    16081614                                        // $orderby corresponds to a meta_query clause.
    class WP_Query { 
    22522258                        }
    22532259                } elseif ( 'none' == $q['orderby'] ) {
    22542260                        $orderby = '';
    2255                 } elseif ( $q['orderby'] == 'post__in' && ! empty( $post__in ) ) {
    2256                         $orderby = "FIELD( {$wpdb->posts}.ID, $post__in )";
    22572261                } elseif ( $q['orderby'] == 'post_parent__in' && ! empty( $post_parent__in ) ) {
    22582262                        $orderby = "FIELD( {$wpdb->posts}.post_parent, $post_parent__in )";
    22592263                } elseif ( $q['orderby'] == 'post_name__in' && ! empty( $post_name__in ) ) {
  • 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();