WordPress.org

Make WordPress Core

Ticket #37038: 37038.2.patch

File 37038.2.patch, 5.6 KB (added by spacedmonkey, 3 years ago)
  • src/wp-includes/class-wp-tax-query.php

     
    600600         * @global wpdb $wpdb The WordPress database abstraction object.
    601601         *
    602602         * @param array  $query           The single query. Passed by reference.
    603          * @param string $resulting_field The resulting field. Accepts 'slug', 'name', 'term_taxonomy_id',
     603         * @param string $fields The resulting field. Accepts 'slug', 'name', 'term_taxonomy_id',
    604604         *                                or 'term_id'. Default 'term_id'.
    605605         */
    606         public function transform_query( &$query, $resulting_field ) {
     606        public function transform_query( &$query, $fields ) {
    607607                global $wpdb;
    608608
    609                 if ( empty( $query['terms'] ) )
     609                if ( empty( $query['terms'] ) ) {
    610610                        return;
     611                }
    611612
    612                 if ( $query['field'] == $resulting_field )
     613                if ( $query['field'] == $fields ) {
    613614                        return;
     615                }
    614616
    615                 $resulting_field = sanitize_key( $resulting_field );
     617                $fields = sanitize_key( $fields );
    616618
     619                $args = array(
     620                        'taxonomy'               => $query['taxonomy'],
     621                        'update_term_meta_cache' => false,
     622                        'hide_empty'             => false,
     623                        'fields'                 => $fields
     624                );
     625
    617626                switch ( $query['field'] ) {
    618627                        case 'slug':
     628                                foreach ( $query['terms'] as &$term ) {
     629                                        /*
     630                                         * 0 is the $term_id parameter. We don't have a term ID yet, but it doesn't
     631                                         * matter because `sanitize_term_field()` ignores the $term_id param when the
     632                                         * context is 'db'.
     633                                         */
     634                                        $term = "'" . esc_sql( sanitize_term_field( $query['field'], $term, 0, $query['taxonomy'], 'db' ) ) . "'";
     635                                }
     636
     637                                $terms        = implode( ",", $query['terms'] );
     638                                $args['slug'] = $terms;
     639                                break;
    619640                        case 'name':
    620641                                foreach ( $query['terms'] as &$term ) {
    621642                                        /*
     
    626647                                        $term = "'" . esc_sql( sanitize_term_field( $query['field'], $term, 0, $query['taxonomy'], 'db' ) ) . "'";
    627648                                }
    628649
    629                                 $terms = implode( ",", $query['terms'] );
    630 
    631                                 $terms = $wpdb->get_col( "
    632                                         SELECT $wpdb->term_taxonomy.$resulting_field
    633                                         FROM $wpdb->term_taxonomy
    634                                         INNER JOIN $wpdb->terms USING (term_id)
    635                                         WHERE taxonomy = '{$query['taxonomy']}'
    636                                         AND $wpdb->terms.{$query['field']} IN ($terms)
    637                                 " );
     650                                $terms        = implode( ",", $query['terms'] );
     651                                $args['name'] = $terms;
    638652                                break;
    639653                        case 'term_taxonomy_id':
    640                                 $terms = implode( ',', array_map( 'intval', $query['terms'] ) );
    641                                 $terms = $wpdb->get_col( "
    642                                         SELECT $resulting_field
    643                                         FROM $wpdb->term_taxonomy
    644                                         WHERE term_taxonomy_id IN ($terms)
    645                                 " );
     654                                $terms                    = implode( ',', array_map( 'intval', $query['terms'] ) );
     655                                $args['term_taxonomy_id'] = $terms;
    646656                                break;
    647657                        default:
    648                                 $terms = implode( ',', array_map( 'intval', $query['terms'] ) );
    649                                 $terms = $wpdb->get_col( "
    650                                         SELECT $resulting_field
    651                                         FROM $wpdb->term_taxonomy
    652                                         WHERE taxonomy = '{$query['taxonomy']}'
    653                                         AND term_id IN ($terms)
    654                                 " );
     658                                $terms           = implode( ',', array_map( 'intval', $query['terms'] ) );
     659                                $args['include'] = $terms;
    655660                }
     661                $args['number']  = count( $terms );
     662                $term_list = get_terms( $args );
    656663
    657                 if ( 'AND' == $query['operator'] && count( $terms ) < count( $query['terms'] ) ) {
     664                if ( is_wp_error( $term_list ) ) {
     665                        $query = $term_list;
     666                        return;
     667                }
     668
     669                if ( 'AND' == $query['operator'] && count( $term_list ) < count( $query['terms'] ) ) {
    658670                        $query = new WP_Error( 'Inexistent terms' );
    659671                        return;
    660672                }
    661673
    662                 $query['terms'] = $terms;
    663                 $query['field'] = $resulting_field;
     674                $query['terms'] = $term_list;
     675                $query['field'] = $fields;
    664676        }
    665677}
  • src/wp-includes/class-wp-term-query.php

     
    183183                        'count'                  => false,
    184184                        'name'                   => '',
    185185                        'slug'                   => '',
     186                        'term_taxonomy_id'       => '',
    186187                        'hierarchical'           => true,
    187188                        'search'                 => '',
    188189                        'name__like'             => '',
     
    473474                        }
    474475                }
    475476
     477                if ( ! empty( $args['term_taxonomy_id'] ) ) {
     478                        if ( is_array( $args['term_taxonomy_id'] ) ) {
     479                                $term_taxonomy_id = array_map( 'intval', $args['term_taxonomy_id'] );
     480                                $this->sql_clauses['where']['term_taxonomy_id'] = "tt.term_taxonomy_id IN ('" . implode( "', '", $term_taxonomy_id ) . "')";
     481                        } else {
     482                                $term_taxonomy_id = intval( $args['term_taxonomy_id'] );
     483                                $this->sql_clauses['where']['term_taxonomy_id'] = "tt.term_taxonomy_id = '$term_taxonomy_id'";
     484                        }
     485                }
     486
    476487                if ( ! empty( $args['name__like'] ) ) {
    477488                        $this->sql_clauses['where']['name__like'] = $wpdb->prepare( "t.name LIKE %s", '%' . $wpdb->esc_like( $args['name__like'] ) . '%' );
    478489                }
     
    541552                        case 'names':
    542553                                $selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' );
    543554                                break;
     555                        case 'term_taxonomy_id':
     556                                $selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.term_taxonomy_id', 'tt.taxonomy' );
     557                                break;
    544558                        case 'count':
    545559                                $orderby = '';
    546560                                $order = '';
     
    692706                        foreach ( $terms as $term ) {
    693707                                $_terms[] = $term->term_id;
    694708                        }
    695                 } elseif ( 'names' == $_fields ) {
     709                } elseif ( 'term_taxonomy_id' == $_fields ) {
    696710                        foreach ( $terms as $term ) {
     711                                $_terms[] = $term->term_taxonomy_id;
     712                        }
     713                }elseif ( 'names' == $_fields ) {
     714                        foreach ( $terms as $term ) {
    697715                                $_terms[] = $term->name;
    698716                        }
    699717                } elseif ( 'id=>name' == $_fields ) {