Make WordPress Core

Changeset 53650

Timestamp:
07/05/2022 12:07:48 AM (2 years ago)
Author:
peterwilsoncc
Message:

Taxonomy: Fix caching issues in WP_Term_Query class.

Introduced [52836] when passing child_of or pad_counts parameters to get_terms or WP_Term_Query class, the array
of terms received by the query, was not correctly cached. This change simplifies the logic in WP_Term_Query and
ensures terms are correctly cached. This change also, improves performance, by only caching an array of term ids where
possible.

Additionally, the database version bump included in this patch is also required for #55890 to initialize the user count
on single sites.

Props denishua, spacedmonkey, oztaser, peterwilsoncc, SergeyBiryukov, georgestephanis, jnz31, knutsp, mukesh27, costdev,
tharsheblows.
Merges [53496] to the 6.0 branch.
Fixes #55837, #55890.

--This line, and those below, will be ignored--

_M .
M src/wp-includes/class-wp-term-query.php
M src/wp-includes/version.php
M tests/phpunit/tests/term/getTerms.php

Location:
branches/6.0
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/6.0

  • branches/6.0/src/wp-includes/class-wp-term-query.php

    r53309 r53650  
    771771        $cache_args = wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) );
    772772
    773         unset( $cache_args['pad_counts'], $cache_args['update_term_meta_cache'] );
     773        unset( $cache_args['update_term_meta_cache'] );
    774774
    775775        if ( 'count' !== $_fields && 'all_with_object_id' !== $_fields ) {
     
    784784        if ( false !== $cache ) {
    785785            if ( 'ids' === $_fields ) {
    786                 $term_ids = wp_list_pluck( $cache, 'term_id' );
    787                 $cache    = array_map( 'intval', $term_ids );
     786                $cache = array_map( 'intval', $cache );
    788787            } elseif ( 'count' !== $_fields ) {
    789                 $term_ids = wp_list_pluck( $cache, 'term_id' );
     788                if ( ( 'all_with_object_id' === $_fields && ! empty( $args['object_ids'] ) ) || ( 'all' === $_fields && $args['pad_counts'] ) ) {
     789                    $term_ids = wp_list_pluck( $cache, 'term_id' );
     790                } else {
     791                    $term_ids = array_map( 'intval', $cache );
     792                }
    790793                _prime_term_caches( $term_ids, $args['update_term_meta_cache'] );
    791794                $term_objects = $this->populate_terms( $cache );
     
    850853        }
    851854
    852         /*
    853          * When querying for terms connected to objects, we may get
    854          * duplicate results. The duplicates should be preserved if
    855          * `$fields` is 'all_with_object_id', but should otherwise be
    856          * removed.
    857          */
    858         if ( ! empty( $args['object_ids'] ) && 'all_with_object_id' !== $_fields ) {
    859             $_tt_ids = array();
    860             $_terms  = array();
    861             foreach ( $terms as $term ) {
    862                 if ( isset( $_tt_ids[ $term->term_id ] ) ) {
    863                     continue;
    864                 }
    865 
    866                 $_tt_ids[ $term->term_id ] = 1;
    867                 $_terms[]                  = $term;
    868             }
    869 
    870             $terms = $_terms;
    871         }
    872 
    873855        // Hierarchical queries are not limited, so 'offset' and 'number' must be handled now.
    874         if ( $hierarchical && $number && is_array( $terms ) ) {
    875             if ( $offset >= count( $terms ) ) {
    876                 $terms        = array();
     856        if ( $hierarchical && $number && is_array( $term_objects ) ) {
     857            if ( $offset >= count( $term_objects ) ) {
    877858                $term_objects = array();
    878859            } else {
    879                 $terms        = array_slice( $terms, $offset, $number, true );
    880860                $term_objects = array_slice( $term_objects, $offset, $number, true );
    881861            }
     
    888868        }
    889869
    890         wp_cache_add( $cache_key, $terms, 'terms' );
    891         $terms = $this->format_terms( $term_objects, $_fields );
    892 
    893         $this->terms = $terms;
     870        if ( 'all_with_object_id' === $_fields && ! empty( $args['object_ids'] ) ) {
     871            $term_cache = array();
     872            foreach ( $term_objects as $term ) {
     873                $object            = new stdClass();
     874                $object->term_id   = $term->term_id;
     875                $object->object_id = $term->object_id;
     876                $term_cache[]      = $object;
     877            }
     878        } elseif ( 'all' === $_fields && $args['pad_counts'] ) {
     879            $term_cache = array();
     880            foreach ( $term_objects as $term ) {
     881                $object          = new stdClass();
     882                $object->term_id = $term->term_id;
     883                $object->count   = $term->count;
     884                $term_cache[]    = $object;
     885            }
     886        } else {
     887            $term_cache = wp_list_pluck( $term_objects, 'term_id' );
     888        }
     889        wp_cache_add( $cache_key, $term_cache, 'terms' );
     890        $this->terms = $this->format_terms( $term_objects, $_fields );
     891
    894892        return $this->terms;
    895893    }
     
    11201118                    $term->object_id = (int) $term_data->object_id;
    11211119                }
     1120
     1121
     1122
    11221123            } else {
    11231124                $term = get_term( $term_data );
  • branches/6.0/src/wp-includes/version.php

    r53446 r53650  
    2424 * @global int $wp_db_version
    2525 */
    26 $wp_db_version = 51917;
     26$wp_db_version = 5;
    2727
    2828/**
  • branches/6.0/tests/phpunit/tests/term/getTerms.php

    r53309 r53650  
    745745        );
    746746        $this->assertCount( 1, $terms );
     747
     748
     749
     750
     751
     752
     753
     754
     755
     756
     757
     758
     759
     760
     761
     762
     763
     764
     765
     766
     767
    747768    }
    748769
     
    25912612
    25922613    /**
     2614
     2615
     2616
     2617
     2618
     2619
     2620
     2621
     2622
     2623
     2624
     2625
     2626
     2627
     2628
     2629
     2630
     2631
     2632
     2633
     2634
     2635
     2636
     2637
     2638
     2639
     2640
     2641
     2642
     2643
     2644
     2645
     2646
     2647
     2648
     2649
     2650
     2651
     2652
     2653
     2654
     2655
     2656
     2657
     2658
     2659
     2660
     2661
     2662
     2663
     2664
     2665
     2666
     2667
     2668
     2669
     2670
     2671
     2672
     2673
     2674
     2675
     2676
     2677
     2678
     2679
     2680
     2681
     2682
     2683
    25932684     * @ticket 20635
    25942685     */
     
    30983189                    'taxonomy' => self::$taxonomy,
    30993190                    'fields'   => 'slugs',
    3100                 ),
    3101             ),
    3102             'meta cache off, pad count on  vs meta cache on, pad count off' => array(
    3103                 array(
    3104                     'taxonomy'               => self::$taxonomy,
    3105                     'pad_counts'             => true,
    3106                     'update_term_meta_cache' => false,
    3107                 ),
    3108                 array(
    3109                     'taxonomy' => self::$taxonomy,
    3110                     'fields'   => 'ids',
    31113191                ),
    31123192            ),
Note: See TracChangeset for help on using the changeset viewer.