Make WordPress Core


Ignore:
Timestamp:
02/28/2026 12:12:59 AM (7 weeks ago)
Author:
johnjamesjacoby
Message:

Cache API: Handle numerically-keyed global_groups when switching sites.

This commit protects against another multisite cache edge-case where a persistent object-cache drop-in plugin (namely memcached) may use a numerically-keyed global_groups array instead of 'key' => true like the default object-cache class, and includes the following changes:

  • Use wp_is_numeric_array() inside of wp_cache_switch_to_blog_fallback() so that the global group names array are always properly formatted regardless of the caching back-end in use
  • Add private helper methods to Tests_Multisite_WpCacheSwitchToBlogFallback to properly format global group names, and tweak a few tests to make them more resilient to different caching back-ends

Follow up to r61760.

See #23290.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/ms-blogs.php

    r61760 r61772  
    615615    $non_persistent_groups = false;
    616616
    617     if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) {
    618         $global_groups         = array_keys( $wp_object_cache->global_groups );
    619         $all_groups            = array_fill_keys( array_keys( $wp_object_cache->cache ), true );
    620         $non_persistent_groups = array_keys( array_diff_key( $all_groups, $wp_object_cache->global_groups ) );
     617    if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) && is_array( $wp_object_cache->global_groups ) ) {
     618
     619        // Get the global groups as they are.
     620        $group_names = $wp_object_cache->global_groups;
     621
     622        // Get global group keys if non-numeric array.
     623        if ( ! wp_is_numeric_array( $group_names ) ) {
     624            $group_names = array_keys( $group_names );
     625        }
     626
     627        $global_groups = $group_names;
     628
     629        /*
     630         * Non-persistent groups: Check for no_mc_groups first (memcached drop-in).
     631         * Fall back to cache structure (default cache).
     632         */
     633        if ( isset( $wp_object_cache->no_mc_groups ) && is_array( $wp_object_cache->no_mc_groups ) && ! empty( $wp_object_cache->no_mc_groups ) ) {
     634            $non_persistent_groups = $wp_object_cache->no_mc_groups;
     635        } elseif ( isset( $wp_object_cache->cache ) && is_array( $wp_object_cache->cache ) ) {
     636            $all_groups            = array_keys( $wp_object_cache->cache );
     637            $non_persistent_groups = array_values( array_diff( $all_groups, $global_groups ) );
     638        }
    621639    }
    622640
Note: See TracChangeset for help on using the changeset viewer.