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/src/wp-includes/class-wp-term-query.php

    r41162 r41377  
    552552        }
    553553
     554        $do_distinct = false;
     555
     556        /*
     557         * Duplicate terms are generally removed when necessary after the database query.
     558         * But when a LIMIT clause is included in the query, we let MySQL enforce
     559         * distinctness so the count is correct.
     560         */
     561        if ( ! empty( $limits ) && 'all_with_object_id' !== $args['fields'] ) {
     562            $do_distinct = true;
     563        }
    554564
    555565        if ( ! empty( $args['search'] ) ) {
     
    569579            $join .= $mq_sql['join'];
    570580            $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $mq_sql['where'] );
    571             $distinct .= "DISTINCT";
    572 
     581            $do_distinct = true;
    573582        }
    574583
     
    632641        $where = implode( ' AND ', $this->sql_clauses['where'] );
    633642
     643        $distinct = $do_distinct ? 'DISTINCT' : '';
     644
    634645        /**
    635646         * Filters the terms query SQL clauses.
Note: See TracChangeset for help on using the changeset viewer.