WordPress.org

Make WordPress Core

Ticket #42252: 42252.3.diff

File 42252.3.diff, 6.2 KB (added by spacedmonkey, 3 years ago)
  • src/wp-includes/class-wp-query.php

     
    968968                        }
    969969                }
    970970
     971
    971972                if ( !empty($qv['post_type']) ) {
    972973                        if ( is_array($qv['post_type']) )
    973974                                $qv['post_type'] = array_map('sanitize_key', $qv['post_type']);
     
    22572258                        $where .= " AND {$wpdb->posts}.post_type = 'post'";
    22582259                        $post_type_object = get_post_type_object ( 'post' );
    22592260                }
    2260 
    22612261                $edit_cap = 'edit_post';
    22622262                $read_cap = 'read_post';
    22632263
  • src/wp-includes/class-wp-site-query.php

     
    240240                 */
    241241                do_action_ref_array( 'pre_get_sites', array( &$this ) );
    242242
    243                 // $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
    244                 $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
    245 
    246                 // Ignore the $fields argument as the queried result will be the same regardless.
    247                 unset( $_args['fields'] );
     243                $cache_key = $this->get_cache_key( $this->query_vars );
    248244
    249                 $key = md5( serialize( $_args ) );
    250                 $last_changed = wp_cache_get_last_changed( 'sites' );
    251 
    252                 $cache_key = "get_sites:$key:$last_changed";
    253245                $cache_value = wp_cache_get( $cache_key, 'sites' );
    254246
    255247                if ( false === $cache_value ) {
     
    698690                        return 'DESC';
    699691                }
    700692        }
     693
     694        /**
     695         * Generates the cache key to lookup query results for a specific set of arguments.
     696         *
     697         * @since 5.0.0
     698         *
     699         * @param array $query_vars Array of WP_Site_Query arguments. See WP_Site_Query::__construct().
     700         * @return string Cache key to use for the lookup.
     701         */
     702        protected function get_cache_key( $query_vars ) {
     703                // $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
     704                $_args = wp_array_slice_assoc( $query_vars, array_keys( $this->query_var_defaults ) );
     705
     706                // Ignore the $fields argument as the queried result will be the same regardless.
     707                unset( $_args['fields'] );
     708
     709                // Ignore the $update_site_cache as it does not affect the query.
     710                unset( $_args['update_site_cache'] );
     711
     712                // Use the same cache key for array lookups with one element and single value lookups.
     713                $single_multi_mappings = array(
     714                        'ID'         => 'site__in',
     715                        'network_id' => 'network__in',
     716                        'domain'     => 'domain__in',
     717                        'path'       => 'path__in',
     718                        'lang_id'    => 'lang__in',
     719                );
     720                foreach ( $single_multi_mappings as $single_var => $multi_var ) {
     721                        if ( empty( $_args[ $single_var ] ) && isset( $_args[ $multi_var ] ) && is_array( $_args[ $multi_var ] ) && count( $_args[ $multi_var ] ) === 1 ) {
     722                                $_args[ $single_var ] = array_pop( $_args[ $multi_var ] );
     723                                $_args[ $multi_var ]  = '';
     724                        }
     725                }
     726
     727                $key                 = md5( serialize( $_args ) );
     728                $used_args           = array_filter( $_args );
     729                $params              = array( 'domain', 'path', 'network_id' );
     730                $array_keys          = array_intersect( $params, array_keys( $used_args ) );
     731                $last_changed_prefix = array();
     732                $counter             = count( $array_keys );
     733                if ( $counter > 0 ) {
     734                        foreach ( $params as $param ) {
     735                                if ( ! isset( $used_args[ $param ] ) || empty( $used_args[ $param ] ) ) {
     736                                        if ( $counter > 1 ) {
     737                                                break;
     738                                        }
     739                                        continue;
     740                                }
     741                                $last_changed_prefix[$param] = $used_args[ $param ];
     742                        }
     743                }
     744                $last_changed_key = 'last_changed';
     745                if ( $last_changed_prefix ) {
     746                        $last_changed_prefix = md5( serialize( $last_changed_prefix ) );
     747                        $last_changed_key    = $last_changed_prefix . '_last_changed';
     748                }
     749                $last_changed = wp_cache_get_last_changed( 'sites', $last_changed_key );
     750
     751                return "get_sites:$key:$last_changed";
     752        }
    701753}
  • src/wp-includes/functions.php

     
    57105710 * Get last changed date for the specified cache group.
    57115711 *
    57125712 * @since 4.7.0
     5713 * @since 5.0.0 Now supports the $prefix parameter.
    57135714 *
    5714  * @param string $group Where the cache contents are grouped.
     5715 * @param string $group  Where the cache contents are grouped.
     5716 * @param string $key Optional. Key to look for a specific last changed key. Default empty string.
    57155717 *
    57165718 * @return string $last_changed UNIX timestamp with microseconds representing when the group was last changed.
    57175719 */
    5718 function wp_cache_get_last_changed( $group ) {
    5719         $last_changed = wp_cache_get( 'last_changed', $group );
     5720function wp_cache_get_last_changed( $group, $key = '' ) {
     5721        if ( empty( $key ) ) {
     5722                $key = 'last_changed';
     5723        }
     5724        $last_changed = wp_cache_get( $key, $group );
    57205725
    57215726        if ( ! $last_changed ) {
    57225727                $last_changed = microtime();
    5723                 wp_cache_set( 'last_changed', $last_changed, $group );
     5728                wp_cache_set( $key, $last_changed, $group );
    57245729        }
    57255730
    57265731        return $last_changed;
  • src/wp-includes/ms-blogs.php

     
    447447                        'blog_id' => $blog_id,
    448448                        'domain'  => null,
    449449                        'path'    => null,
     450                        'site_id' => get_current_network_id(),
    450451                ) );
    451452        }
    452453
     
    473474         */
    474475        do_action( 'clean_site_cache', $blog_id, $blog, $domain_path_key );
    475476
    476         wp_cache_set( 'last_changed', microtime(), 'sites' );
     477        $current_time = microtime();
     478
     479        $last_changed_keys   = array( 'last_changed' );
     480        $params              = array( 'domain', 'path', 'site_id' );
     481        $last_changed_prefix = array();
     482        foreach ( $params as $param ) {
     483                $last_changed_keys[]           = md5( serialize( array( $param => $blog->$param ) ) ) . '_last_changed';
     484                $last_changed_prefix[ $param ] = $blog->$param;
     485                $key                           = md5( serialize( $last_changed_prefix ) );
     486                $last_changed_keys[]           = $key . '_last_changed';
     487        }
     488
     489        $last_changed_keys = array_unique( $last_changed_keys );
     490        foreach ( $last_changed_keys as $last_changed_key ) {
     491                wp_cache_set( $last_changed_key, $current_time, 'sites' );
     492        }
    477493
    478494        /**
    479495         * Fires after the blog details cache is cleared.