WordPress.org

Make WordPress Core

Ticket #37189: 37189.patch

File 37189.patch, 5.6 KB (added by spacedmonkey, 4 years ago)
  • src/wp-includes/class-wp-term-query.php

     
    585585
    586586                $selects = array();
    587587                switch ( $args['fields'] ) {
    588                         case 'all':
    589                         case 'all_with_object_id' :
    590                         case 'tt_ids' :
    591                         case 'slugs' :
    592                                 $selects = array( 't.*', 'tt.*' );
    593                                 if ( 'all_with_object_id' === $args['fields'] && ! empty( $args['object_ids'] ) ) {
    594                                         $selects[] = 'tr.object_id';
    595                                 }
    596                                 break;
    597                         case 'ids':
    598                         case 'id=>parent':
    599                                 $selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.taxonomy' );
    600                                 break;
    601                         case 'names':
    602                                 $selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' );
    603                                 break;
    604588                        case 'count':
    605589                                $orderby = '';
    606590                                $order = '';
    607591                                $selects = array( 'COUNT(*)' );
    608592                                break;
    609                         case 'id=>name':
    610                                 $selects = array( 't.term_id', 't.name', 'tt.count', 'tt.taxonomy' );
    611                                 break;
    612                         case 'id=>slug':
    613                                 $selects = array( 't.term_id', 't.slug', 'tt.count', 'tt.taxonomy' );
     593                        default:
     594                                $selects = array( 't.*', 'tt.*' );
     595                                if ( 'all_with_object_id' === $args['fields'] && ! empty( $args['object_ids'] ) ) {
     596                                        $selects[] = 'tr.object_id';
     597                                }
    614598                                break;
     599
    615600                }
    616601
    617602                $_fields = $args['fields'];
     
    672657
    673658                $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}";
    674659
    675                 // $args can be anything. Only use the args defined in defaults to compute the key.
    676                 $key = md5( serialize( wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) ) ) . serialize( $taxonomies ) . $this->request );
     660                // $args can be anything. Only use the args defined in defaults to compute the key;
     661                $_args = wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) );
     662                unset( $_args['fields'] );
     663                $key = md5( serialize( $_args ) . serialize( $taxonomies ) . $this->request );
    677664                $last_changed = wp_cache_get_last_changed( 'terms' );
    678665                $cache_key = "get_terms:$key:$last_changed";
    679666                $cache = wp_cache_get( $cache_key, 'terms' );
    680667                if ( false !== $cache ) {
    681                         if ( 'all' === $_fields ) {
    682                                 $cache = array_map( 'get_term', $cache );
     668                        $_terms = array();
     669                        if ( ! in_array( $_fields, array( 'ids', 'count' ) ) ) {
     670                                $terms = array_map( 'get_term', $cache );
     671                                if ( 'id=>parent' == $_fields ) {
     672                                        foreach ( $terms as $term ) {
     673                                                $_terms[ $term->term_id ] = $term->parent;
     674                                        }
     675                                }  elseif ( 'tt_ids' == $_fields ) {
     676                                        foreach ( $terms as $term ) {
     677                                                $_terms[] = (int) $term->term_taxonomy_id;
     678                                        }
     679                                } elseif ( 'names' == $_fields ) {
     680                                        foreach ( $terms as $term ) {
     681                                                $_terms[] = $term->name;
     682                                        }
     683                                } elseif ( 'slugs' == $_fields ) {
     684                                        foreach ( $terms as $term ) {
     685                                                $_terms[] = $term->slug;
     686                                        }
     687                                } elseif ( 'id=>name' == $_fields ) {
     688                                        foreach ( $terms as $term ) {
     689                                                $_terms[ $term->term_id ] = $term->name;
     690                                        }
     691                                } elseif ( 'id=>slug' == $_fields ) {
     692                                        foreach ( $terms as $term ) {
     693                                                $_terms[ $term->term_id ] = $term->slug;
     694                                        }
     695                                } else {
     696                                        $_terms = $terms;
     697                                }
     698                        } else {
     699                                $_terms = $cache;
    683700                        }
    684701
    685                         $this->terms = $cache;
     702                        $this->terms = $_terms;
    686703                        return $this->terms;
    687704                }
    688705
    689706                if ( 'count' == $_fields ) {
    690707                        $count = $wpdb->get_var( $this->request );
    691708                        wp_cache_set( $cache_key, $count, 'terms' );
     709
    692710                        return $count;
    693711                }
    694712
    695                 $terms = $wpdb->get_results( $this->request );
    696                 if ( 'all' == $_fields || 'all_with_object_id' === $_fields ) {
    697                         update_term_cache( $terms );
    698                 }
     713                $terms    = $wpdb->get_results( $this->request );
     714                $term_ids = wp_list_pluck( $terms, 'term_id' );
     715                $term_ids = array_map( 'intval', $term_ids );
     716
     717                update_term_cache( $terms );
     718                $terms = array_map( 'get_term', $terms );
    699719
    700720                // Prime termmeta cache.
    701721                if ( $args['update_term_meta_cache'] ) {
    702                         $term_ids = wp_list_pluck( $terms, 'term_id' );
    703722                        update_termmeta_cache( $term_ids );
    704723                }
    705724
    706725                if ( empty( $terms ) ) {
    707726                        wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS );
     727
    708728                        return array();
    709729                }
    710730
     731
    711732                if ( $child_of ) {
    712733                        foreach ( $taxonomies as $_tax ) {
    713734                                $children = _get_term_hierarchy( $_tax );
     
    758779                                }
    759780
    760781                                $_tt_ids[ $term->term_id ] = 1;
    761                                 $_terms[] = $term;
     782                                $_terms[]                  = $term;
    762783                        }
    763784
    764785                        $terms = $_terms;
     
    808829                        }
    809830                }
    810831
    811                 wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS );
    812832
    813                 if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) {
    814                         $terms = array_map( 'get_term', $terms );
    815                 }
     833                wp_cache_add( $cache_key, $term_ids, 'terms', DAY_IN_SECONDS );
     834
    816835
    817836                $this->terms = $terms;
     837
    818838                return $this->terms;
    819839        }
    820840
  • src/wp-includes/class-wp-term.php

     
    134134
    135135                // If there isn't a cached version, hit the database.
    136136                if ( ! $_term || ( $taxonomy && $taxonomy !== $_term->taxonomy ) ) {
     137
    137138                        // Grab all matching terms, in case any are shared between taxonomies.
    138139                        $terms = $wpdb->get_results( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id = %d", $term_id ) );
    139140                        if ( ! $terms ) {
    140141                                return false;
    141142                        }
     143                        $_term = false;
    142144
    143145                        // If a taxonomy was specified, find a match.
    144146                        if ( $taxonomy ) {
     147
    145148                                foreach ( $terms as $match ) {
    146149                                        if ( $taxonomy === $match->taxonomy ) {
    147150                                                $_term = $match;