WordPress.org

Make WordPress Core

Ticket #25344: 25344.4.patch

File 25344.4.patch, 18.8 KB (added by johnjamesjacoby, 8 months ago)

Same as .3, but fully implements update_network_meta_cache into _prime_network_caches() and update_network_cache()

  • src/wp-includes/class-wp-network-query.php

    diff --git src/wp-includes/class-wp-network-query.php src/wp-includes/class-wp-network-query.php
    index 1bf38ad..e5e42fa 100644
     
    119119         *     @type array        $path__not_in         Array of paths to exclude affiliated networks for. Default empty. 
    120120         *     @type string       $search               Search term(s) to retrieve matching networks for. Default empty. 
    121121         *     @type bool         $update_network_cache Whether to prime the cache for found networks. Default true. 
     122         *     @type bool         $update_network_meta_cache  Whether to update the network meta cache. Default true. 
    122123         * } 
    123124         */ 
    124125        public function __construct( $query = '' ) { 
     
    140141                        'path__not_in'         => '', 
    141142                        'search'               => '', 
    142143                        'update_network_cache' => true, 
     144                        'update_network_meta_cache' => true, 
    143145                ); 
    144146 
    145147                if ( ! empty( $query ) ) { 
     
    248250                } 
    249251 
    250252                if ( $this->query_vars['update_network_cache'] ) { 
    251                         _prime_network_caches( $network_ids ); 
     253                        _prime_network_caches( $network_ids, $this->query_vars['update_network_meta_cache'] ); 
    252254                } 
    253255 
    254256                // Fetch full network objects from the primed cache. 
  • src/wp-includes/functions.php

    diff --git src/wp-includes/functions.php src/wp-includes/functions.php
    index ee214e9..0fe64ca 100644
     
    44404440                // If the current network has an ID of 1, assume it is the main network. 
    44414441                $main_network_id = 1; 
    44424442        } else { 
    4443                 $_networks = get_networks( array( 'fields' => 'ids', 'number' => 1 ) ); 
     4443                $_networks = get_networks( array( 
     4444                        'fields'                    => 'ids', 
     4445                        'number'                    => 1, 
     4446                        'update_network_meta_cache' => false 
     4447                ) ); 
    44444448                $main_network_id = array_shift( $_networks ); 
    44454449        } 
    44464450 
  • src/wp-includes/ms-blogs.php

    diff --git src/wp-includes/ms-blogs.php src/wp-includes/ms-blogs.php
    index 01bb986..ee32e98 100644
     
    842842                        if ( is_array( $global_groups ) ) { 
    843843                                wp_cache_add_global_groups( $global_groups ); 
    844844                        } else { 
    845                                 wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     845                                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    846846                        } 
    847847                        wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) ); 
    848848                } 
     
    916916                        if ( is_array( $global_groups ) ) { 
    917917                                wp_cache_add_global_groups( $global_groups ); 
    918918                        } else { 
    919                                 wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     919                                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    920920                        } 
    921921                        wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) ); 
    922922                } 
     
    11921192 * cache using the network group with the key using the ID of the networks. 
    11931193 * 
    11941194 * @since 4.6.0 
     1195 * @since 4.8.0 Introduced the `$update_meta_cache` parameter. 
    11951196 * 
    1196  * @param array $networks Array of network row objects. 
     1197 * @param array $networks          Array of network row objects. 
     1198 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true. 
    11971199 */ 
    1198 function update_network_cache( $networks ) { 
     1200function update_network_cache( $networks, $update_meta_cache = true ) { 
    11991201        foreach ( (array) $networks as $network ) { 
    12001202                wp_cache_add( $network->id, $network, 'networks' ); 
     1203        } 
     1204 
     1205        if ( $update_meta_cache ) { 
     1206                update_networkmeta_cache( wp_list_pluck( $networks, 'id' ) ); 
    12011207        } 
    12021208} 
    12031209 
     
    12051211 * Adds any networks from the given IDs to the cache that do not already exist in cache. 
    12061212 * 
    12071213 * @since 4.6.0 
     1214 * @since 4.8.0 Introduced the `$update_meta_cache` parameter. 
    12081215 * @access private 
    12091216 * 
    12101217 * @see update_network_cache() 
    12111218 * @global wpdb $wpdb WordPress database abstraction object. 
    12121219 * 
    1213  * @param array $network_ids Array of network IDs. 
     1220 * @param array $network_ids       Array of network IDs. 
     1221 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true. 
    12141222 */ 
    1215 function _prime_network_caches( $network_ids ) { 
     1223function _prime_network_caches( $network_ids, $update_meta_cache = true ) { 
    12161224        global $wpdb; 
    12171225 
    12181226        $non_cached_ids = _get_non_cached_ids( $network_ids, 'networks' ); 
    1219         if ( !empty( $non_cached_ids ) ) { 
    1220                 $fresh_networks = $wpdb->get_results( sprintf( "SELECT $wpdb->site.* FROM $wpdb->site WHERE id IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) ); 
     1227        if ( ! empty( $non_cached_ids ) ) { 
     1228                $fresh_networks = $wpdb->get_results( sprintf( "SELECT * FROM {$wpdb->site} WHERE id IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) ); 
    12211229 
    1222                 update_network_cache( $fresh_networks ); 
     1230                update_network_cache( $fresh_networks, $update_meta_cache ); 
    12231231        } 
    12241232} 
    12251233 
  • src/wp-includes/ms-functions.php

    diff --git src/wp-includes/ms-functions.php src/wp-includes/ms-functions.php
    index a562cdf..8cceacd 100644
     
    25132513         */ 
    25142514        return apply_filters( 'subdirectory_reserved_names', $names ); 
    25152515} 
     2516 
     2517/** 
     2518 * Add metadata to a network. 
     2519 * 
     2520 * @since 4.8.0 
     2521 * 
     2522 * @param int    $id         Network ID. 
     2523 * @param string $meta_key   Metadata name. 
     2524 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar. 
     2525 * @param bool   $unique     Optional. Whether the same key should not be added. 
     2526 *                           Default false. 
     2527 * @return int|false Meta ID on success, false on failure. 
     2528 */ 
     2529function add_network_meta( $id, $meta_key, $meta_value, $unique = false ) { 
     2530        return add_metadata( 'site', $id, $meta_key, $meta_value, $unique ); 
     2531} 
     2532 
     2533/** 
     2534 * Remove from a network, metadata matching key and/or value. 
     2535 * 
     2536 * You can match based on the key, or key and value. Removing based on key and 
     2537 * value, will keep from removing duplicate metadata with the same key. It also 
     2538 * allows removing all metadata matching key, if needed. 
     2539 * 
     2540 * @since 4.8.0 
     2541 * 
     2542 * @param int    $id         Network ID. 
     2543 * @param string $meta_key   Metadata name. 
     2544 * @param mixed  $meta_value Optional. Metadata value. Must be serializable if 
     2545 *                           non-scalar. Default empty. 
     2546 * @return bool True on success, false on failure. 
     2547 */ 
     2548function delete_network_meta( $id, $meta_key, $meta_value = '' ) { 
     2549        return delete_metadata( 'site', $id, $meta_key, $meta_value ); 
     2550} 
     2551 
     2552/** 
     2553 * Retrieve from a network, metadata value by key. 
     2554 * 
     2555 * @since 4.8.0 
     2556 * 
     2557 * @param int    $id        Network ID. 
     2558 * @param string $meta_key  Optional. The meta key to retrieve. By default, returns 
     2559 *                          data for all keys. Default empty. 
     2560 * @param bool   $single    Optional. Whether to return a single value. Default false. 
     2561 * @return mixed Will be an array if $single is false. Will be value of meta data 
     2562 *               field if $single is true. 
     2563 */ 
     2564function get_network_meta( $id, $meta_key = '', $single = false ) { 
     2565        return get_metadata( 'site', $id, $meta_key, $single ); 
     2566} 
     2567 
     2568/** 
     2569 * Update metadata for a network ID, and/or key, and/or value. 
     2570 * 
     2571 * Use the $prev_value parameter to differentiate between meta fields with the 
     2572 * same key and network ID. 
     2573 * 
     2574 * If the meta field for the network does not exist, it will be added. 
     2575 * 
     2576 * @since 4.8.0 
     2577 * 
     2578 * @param int    $id         Network ID. 
     2579 * @param string $meta_key   Metadata key. 
     2580 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar. 
     2581 * @param mixed  $prev_value Optional. Previous value to check before removing. 
     2582 *                           Default empty. 
     2583 * @return int|bool Meta ID if the key didn't exist, true on successful update, 
     2584 *                  false on failure. 
     2585 */ 
     2586function update_network_meta( $id, $meta_key, $meta_value, $prev_value = '' ) { 
     2587        return update_metadata( 'site', $id, $meta_key, $meta_value, $prev_value ); 
     2588} 
     2589 
     2590/** 
     2591 * Updates metadata cache for list of network IDs. 
     2592 * 
     2593 * Performs SQL query to retrieve the metadata for the network IDs and updates the 
     2594 * metadata cache for the posts. Therefore, the functions, which call this 
     2595 * function, do not need to perform SQL queries on their own. 
     2596 * 
     2597 * @since 4.8.0 
     2598 * 
     2599 * @param array $network_ids List of network IDs. 
     2600 * @return array|false Returns false if there is nothing to update or an array 
     2601 *                     of metadata. 
     2602 */ 
     2603function update_networkmeta_cache( $network_ids) { 
     2604        return update_meta_cache( 'site', $network_ids ); 
     2605} 
  • src/wp-includes/option.php

    diff --git src/wp-includes/option.php src/wp-includes/option.php
    index d58ae69..0a08fdb 100644
     
    207207 * 
    208208 * @global wpdb $wpdb WordPress database abstraction object. 
    209209 * 
    210  * @param int $site_id Optional site ID for which to query the options. Defaults to the current site. 
     210 * @param int $network_id Optional network ID for which to query the options. Defaults to the current site. 
    211211 */ 
    212 function wp_load_core_site_options( $site_id = null ) { 
     212function wp_load_core_site_options( $network_id = null ) { 
    213213        global $wpdb; 
    214214 
    215215        if ( ! is_multisite() || wp_using_ext_object_cache() || wp_installing() ) 
    216216                return; 
    217217 
    218         if ( empty($site_id) ) 
    219                 $site_id = $wpdb->siteid; 
    220  
    221         $core_options = array('site_name', 'siteurl', 'active_sitewide_plugins', '_site_transient_timeout_theme_roots', '_site_transient_theme_roots', 'site_admins', 'can_compress_scripts', 'global_terms_enabled', 'ms_files_rewriting' ); 
    222  
    223         $core_options_in = "'" . implode("', '", $core_options) . "'"; 
    224         $options = $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE meta_key IN ($core_options_in) AND site_id = %d", $site_id) ); 
    225  
    226         foreach ( $options as $option ) { 
    227                 $key = $option->meta_key; 
    228                 $cache_key = "{$site_id}:$key"; 
    229                 $option->meta_value = maybe_unserialize( $option->meta_value ); 
    230  
    231                 wp_cache_set( $cache_key, $option->meta_value, 'site-options' ); 
     218        if ( empty( $network_id ) ) { 
     219                $network_id = $wpdb->siteid; 
    232220        } 
     221        update_networkmeta_cache( $network_id ); 
    233222} 
    234223 
    235224/** 
     
    10911080 * @return mixed Value set for the option. 
    10921081 */ 
    10931082function get_network_option( $network_id, $option, $default = false ) { 
    1094         global $wpdb; 
    10951083 
    10961084        if ( $network_id && ! is_numeric( $network_id ) ) { 
    10971085                return false; 
     
    11271115                return $pre; 
    11281116        } 
    11291117 
    1130         // prevent non-existent options from triggering multiple queries 
    1131         $notoptions_key = "$network_id:notoptions"; 
    1132         $notoptions = wp_cache_get( $notoptions_key, 'site-options' ); 
    1133  
    1134         if ( isset( $notoptions[ $option ] ) ) { 
    1135  
    1136                 /** 
    1137                  * Filters a specific default network option. 
    1138                  * 
    1139                  * The dynamic portion of the hook name, `$option`, refers to the option name. 
    1140                  * 
    1141                  * @since 3.4.0 
    1142                  * @since 4.4.0 The `$option` parameter was added. 
    1143                  * @since 4.7.0 The `$network_id` parameter was added. 
    1144                  * 
    1145                  * @param mixed  $default    The value to return if the site option does not exist 
    1146                  *                           in the database. 
    1147                  * @param string $option     Option name. 
    1148                  * @param int    $network_id ID of the network. 
    1149                  */ 
    1150                 return apply_filters( "default_site_option_{$option}", $default, $option, $network_id ); 
    1151         } 
     1118        /** 
     1119         * Filters a specific default network option. 
     1120         * 
     1121         * The dynamic portion of the hook name, `$option`, refers to the option name. 
     1122         * 
     1123         * @since 3.4.0 
     1124         * @since 4.4.0 The `$option` parameter was added. 
     1125         * @since 4.7.0 The `$network_id` parameter was added. 
     1126         * 
     1127         * @param mixed  $default    The value to return if the site option does not exist 
     1128         *                           in the database. 
     1129         * @param string $option     Option name. 
     1130         * @param int    $network_id ID of the network. 
     1131         */ 
     1132        $default = apply_filters( 'default_site_option_' . $option, $default, $option, $network_id ); 
    11521133 
    11531134        if ( ! is_multisite() ) { 
    1154                 /** This filter is documented in wp-includes/option.php */ 
    1155                 $default = apply_filters( 'default_site_option_' . $option, $default, $option, $network_id ); 
    11561135                $value = get_option( $option, $default ); 
    11571136        } else { 
    1158                 $cache_key = "$network_id:$option"; 
    1159                 $value = wp_cache_get( $cache_key, 'site-options' ); 
    1160  
    1161                 if ( ! isset( $value ) || false === $value ) { 
    1162                         $row = $wpdb->get_row( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $network_id ) ); 
    1163  
    1164                         // Has to be get_row instead of get_var because of funkiness with 0, false, null values 
    1165                         if ( is_object( $row ) ) { 
    1166                                 $value = $row->meta_value; 
    1167                                 $value = maybe_unserialize( $value ); 
    1168                                 wp_cache_set( $cache_key, $value, 'site-options' ); 
    1169                         } else { 
    1170                                 if ( ! is_array( $notoptions ) ) { 
    1171                                         $notoptions = array(); 
    1172                                 } 
    1173                                 $notoptions[ $option ] = true; 
    1174                                 wp_cache_set( $notoptions_key, $notoptions, 'site-options' ); 
    1175  
    1176                                 /** This filter is documented in wp-includes/option.php */ 
    1177                                 $value = apply_filters( 'default_site_option_' . $option, $default, $option, $network_id ); 
    1178                         } 
     1137                $value = get_network_meta( $network_id, $option, true ); 
     1138                if ( empty( $value ) ) { 
     1139                        $value = $default; 
    11791140                } 
    11801141        } 
    11811142 
     
    12131174 * @return bool False if option was not added and true if option was added. 
    12141175 */ 
    12151176function add_network_option( $network_id, $option, $value ) { 
    1216         global $wpdb; 
    12171177 
    12181178        if ( $network_id && ! is_numeric( $network_id ) ) { 
    12191179                return false; 
     
    12441204         */ 
    12451205        $value = apply_filters( "pre_add_site_option_{$option}", $value, $option, $network_id ); 
    12461206 
    1247         $notoptions_key = "$network_id:notoptions"; 
    1248  
    12491207        if ( ! is_multisite() ) { 
    12501208                $result = add_option( $option, $value, '', 'no' ); 
    12511209        } else { 
    1252                 $cache_key = "$network_id:$option"; 
    1253  
    1254                 // Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query 
    1255                 $notoptions = wp_cache_get( $notoptions_key, 'site-options' ); 
    1256                 if ( ! is_array( $notoptions ) || ! isset( $notoptions[ $option ] ) ) { 
    1257                         if ( false !== get_network_option( $network_id, $option, false ) ) { 
    1258                                 return false; 
    1259                         } 
    1260                 } 
    1261  
    1262                 $value = sanitize_option( $option, $value ); 
    1263  
    1264                 $serialized_value = maybe_serialize( $value ); 
    1265                 $result = $wpdb->insert( $wpdb->sitemeta, array( 'site_id'    => $network_id, 'meta_key'   => $option, 'meta_value' => $serialized_value ) ); 
    1266  
    1267                 if ( ! $result ) { 
    1268                         return false; 
    1269                 } 
    1270  
    1271                 wp_cache_set( $cache_key, $value, 'site-options' ); 
    1272  
    1273                 // This option exists now 
    1274                 $notoptions = wp_cache_get( $notoptions_key, 'site-options' ); // yes, again... we need it to be fresh 
    1275                 if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) { 
    1276                         unset( $notoptions[ $option ] ); 
    1277                         wp_cache_set( $notoptions_key, $notoptions, 'site-options' ); 
    1278                 } 
     1210                $result = add_network_meta( $network_id, $option, $value ); 
    12791211        } 
    12801212 
    12811213        if ( $result ) { 
     
    13271259 * @return bool True, if succeed. False, if failure. 
    13281260 */ 
    13291261function delete_network_option( $network_id, $option ) { 
    1330         global $wpdb; 
    13311262 
    13321263        if ( $network_id && ! is_numeric( $network_id ) ) { 
    13331264                return false; 
     
    13571288        if ( ! is_multisite() ) { 
    13581289                $result = delete_option( $option ); 
    13591290        } else { 
    1360                 $row = $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM {$wpdb->sitemeta} WHERE meta_key = %s AND site_id = %d", $option, $network_id ) ); 
    1361                 if ( is_null( $row ) || ! $row->meta_id ) { 
    1362                         return false; 
    1363                 } 
    1364                 $cache_key = "$network_id:$option"; 
    1365                 wp_cache_delete( $cache_key, 'site-options' ); 
    1366  
    1367                 $result = $wpdb->delete( $wpdb->sitemeta, array( 'meta_key' => $option, 'site_id' => $network_id ) ); 
     1291                $result = delete_network_meta( $network_id, $option ); 
    13681292        } 
    13691293 
    13701294        if ( $result ) { 
     
    14151339 * @return bool False if value was not updated and true if value was updated. 
    14161340 */ 
    14171341function update_network_option( $network_id, $option, $value ) { 
    1418         global $wpdb; 
    14191342 
    14201343        if ( $network_id && ! is_numeric( $network_id ) ) { 
    14211344                return false; 
     
    14571380                return add_network_option( $network_id, $option, $value ); 
    14581381        } 
    14591382 
    1460         $notoptions_key = "$network_id:notoptions"; 
    1461         $notoptions = wp_cache_get( $notoptions_key, 'site-options' ); 
    1462         if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) { 
    1463                 unset( $notoptions[ $option ] ); 
    1464                 wp_cache_set( $notoptions_key, $notoptions, 'site-options' ); 
    1465         } 
    1466  
    14671383        if ( ! is_multisite() ) { 
    14681384                $result = update_option( $option, $value, 'no' ); 
    14691385        } else { 
    1470                 $value = sanitize_option( $option, $value ); 
    1471  
    1472                 $serialized_value = maybe_serialize( $value ); 
    1473                 $result = $wpdb->update( $wpdb->sitemeta, array( 'meta_value' => $serialized_value ), array( 'site_id' => $network_id, 'meta_key' => $option ) ); 
    1474  
    1475                 if ( $result ) { 
    1476                         $cache_key = "$network_id:$option"; 
    1477                         wp_cache_set( $cache_key, $value, 'site-options' ); 
    1478                 } 
     1386                $value  = sanitize_option( $option, $value ); 
     1387                $result = update_network_meta( $network_id, $option, $value ); 
    14791388        } 
    14801389 
    14811390        if ( $result ) { 
  • tests/phpunit/includes/testcase.php

    diff --git tests/phpunit/includes/testcase.php tests/phpunit/includes/testcase.php
    index c77511d..37e75d7 100644
     
    301301                        $wp_object_cache->__remoteset(); 
    302302                } 
    303303                wp_cache_flush(); 
    304                 wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     304                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    305305                wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) ); 
    306306        } 
    307307 
  • tests/phpunit/tests/cache.php

    diff --git tests/phpunit/tests/cache.php tests/phpunit/tests/cache.php
    index 6c2eb77..6a27080 100644
     
    2222                global $wp_object_cache; 
    2323                $cache_class = get_class( $wp_object_cache ); 
    2424                $cache = new $cache_class(); 
    25                 $cache->add_global_groups( array( 'global-cache-test', 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     25                $cache->add_global_groups( array( 'global-cache-test', 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    2626                return $cache; 
    2727        } 
    2828