Make WordPress Core


Ignore:
Timestamp:
09/13/2017 02:47:07 PM (7 years ago)
Author:
boonebgorges
Message:

Taxonomy: Force a DISTINCT term query when result count matters.

Generally, duplicate terms returned by a term query are eliminated in PHP,
after the database query takes place. This technique doesn't work properly
when the query parameters specify the number of results, since the results
of a SELECT ... LIMIT x... query may be deduplicated to a count less than
x. In these cases, we force the original query to be DISTINCT.

Props elvishp2006.
Fixes #41796.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/term/query.php

    r40513 r41377  
    428428        $this->assertEquals( array( $term_ids[1], $term_ids[0], 1 ), wp_list_pluck( $terms, 'term_id' ) );
    429429    }
     430
     431    /**
     432     * @ticket 41796
     433     */
     434    public function test_number_should_work_with_object_ids() {
     435        register_taxonomy( 'wptests_tax', 'post' );
     436
     437        $term_1 = self::factory()->term->create( array(
     438            'taxonomy' => 'wptests_tax',
     439        ) );
     440        $term_2 = self::factory()->term->create( array(
     441            'taxonomy' => 'wptests_tax',
     442        ) );
     443
     444        $post_1 = self::factory()->post->create();
     445        $post_2 = self::factory()->post->create();
     446
     447        wp_set_object_terms( $post_1, array( $term_1, $term_2 ), 'wptests_tax' );
     448        wp_set_object_terms( $post_2, array( $term_1 ), 'wptests_tax' );
     449
     450        $q = new WP_Term_Query( array(
     451            'taxonomy' => 'wptests_tax',
     452            'object_ids' => array( $post_1, $post_2 ),
     453            'number' => 2,
     454        ) );
     455
     456        $this->assertEqualSets( array( $term_1, $term_2 ), wp_list_pluck( $q->terms, 'term_id' ) );
     457    }
     458
     459    /**
     460     * @ticket 41796
     461     */
     462    public function test_number_should_work_with_object_ids_and_all_with_object_id() {
     463        register_taxonomy( 'wptests_tax', 'post' );
     464
     465        $term_1 = self::factory()->term->create( array(
     466            'taxonomy' => 'wptests_tax',
     467        ) );
     468        $term_2 = self::factory()->term->create( array(
     469            'taxonomy' => 'wptests_tax',
     470        ) );
     471
     472        $post_1 = self::factory()->post->create();
     473        $post_2 = self::factory()->post->create();
     474
     475        wp_set_object_terms( $post_1, array( $term_1, $term_2 ), 'wptests_tax' );
     476        wp_set_object_terms( $post_2, array( $term_1 ), 'wptests_tax' );
     477
     478        $q = new WP_Term_Query( array(
     479            'taxonomy' => 'wptests_tax',
     480            'object_ids' => array( $post_1, $post_2 ),
     481            'fields' => 'all_with_object_id',
     482            'number' => 2,
     483        ) );
     484
     485        $this->assertEqualSets( array( $term_1, $term_1 ), wp_list_pluck( $q->terms, 'term_id' ) );
     486    }
    430487}
Note: See TracChangeset for help on using the changeset viewer.