Make WordPress Core

Ticket #38034: 38034.diff

File 38034.diff, 2.4 KB (added by boonebgorges, 8 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 baefec75b4..4da3a80768 100644
    class WP_Query { 
    15081508                $allowed_keys = array(
    15091509                        'post_name', 'post_author', 'post_date', 'post_title', 'post_modified',
    15101510                        'post_parent', 'post_type', 'name', 'author', 'date', 'title', 'modified',
    1511                         'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand',
     1511                        'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand', 'post__in',
    15121512                );
    15131513
    15141514                $primary_meta_key = '';
    class WP_Query { 
    15661566                        case 'meta_value_num':
    15671567                                $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0";
    15681568                                break;
     1569                        case 'post__in':
     1570                                if ( ! empty( $this->query_vars['post__in'] ) ) {
     1571                                        $orderby_clause = "FIELD({$wpdb->posts}.ID," . implode( ',', array_map( 'absint', $this->query_vars['post__in'] ) ) . ')';
     1572                                }
     1573                                break;
    15691574                        default:
    15701575                                if ( array_key_exists( $orderby, $meta_clauses ) ) {
    15711576                                        // $orderby corresponds to a meta_query clause.
    class WP_Query { 
    21672172                        }
    21682173                } elseif ( 'none' == $q['orderby'] ) {
    21692174                        $orderby = '';
    2170                 } elseif ( $q['orderby'] == 'post__in' && ! empty( $post__in ) ) {
    2171                         $orderby = "FIELD( {$wpdb->posts}.ID, $post__in )";
    21722175                } elseif ( $q['orderby'] == 'post_parent__in' && ! empty( $post_parent__in ) ) {
    21732176                        $orderby = "FIELD( {$wpdb->posts}.post_parent, $post_parent__in )";
    21742177                } 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 6ae8114607..3e87379c4f 100644
    class Tests_Post_Query extends WP_UnitTestCase { 
    139139                $this->assertSame( $ordered, wp_list_pluck( $q->posts, 'ID' ) );
    140140        }
    141141
     142        /**
     143         * @ticket 38034
     144         */
     145        public function test_orderby_post__in_array() {
     146                $posts = self::factory()->post->create_many( 4 );
     147
     148                $ordered = array( $posts[2], $posts[0], $posts[3] );
     149
     150                $q = new WP_Query( array(
     151                        'post_type' => 'any',
     152                        'post__in' => $ordered,
     153                        'orderby' => array( 'post__in' => 'ASC' ),
     154                ) );
     155                $this->assertSame( $ordered, wp_list_pluck( $q->posts, 'ID' ) );
     156        }
     157
    142158        function test_post__in_attachment_ordering() {
    143159                $post_id = self::factory()->post->create();
    144160                $att_ids = array();