From ec98d203ed1eda18a540de40560295cf9a480328 Mon Sep 17 00:00:00 2001 From: David Baumwald Date: Thu, 27 Oct 2022 16:37:55 +0000 Subject: [PATCH] Themes: Ensure custom global styles are imported properly. This change removes caching of global styles for logged in users, allowing "wp_global_styles" custom post type to be imported completely, regardless of any previously cached data. This change now relies on the lower-level native WP_Query cache invalidation methods for the global styles post type. Follow-up to [52275], [54186]. Props anariel-design, bernhard-reiter, andrewserong, spacedmonkey, andraganescu, peterwilsoncc, oandregal, hellofromTonya. Reviewed by hellofromTonya. Merges [54706] to the 6.1 branch. Fixes #56901. git-svn-id: https://develop.svn.wordpress.org/branches/6.1@54707 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-theme-json-resolver.php | 13 ------ .../tests/theme/wpThemeJsonResolver.php | 45 ++++++++++++++++--- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/wp-includes/class-wp-theme-json-resolver.php b/src/wp-includes/class-wp-theme-json-resolver.php index 18b997561c..ee153eb657 100644 --- a/src/wp-includes/class-wp-theme-json-resolver.php +++ b/src/wp-includes/class-wp-theme-json-resolver.php @@ -423,17 +423,6 @@ class WP_Theme_JSON_Resolver { ), ); - $cache_key = sprintf( 'wp_global_styles_%s', md5( serialize( $args ) ) ); - $post_id = (int) get_transient( $cache_key ); - // Special case: '-1' is a results not found. - if ( -1 === $post_id && ! $create_post ) { - return $user_cpt; - } - - if ( $post_id > 0 && in_array( get_post_status( $post_id ), (array) $post_status_filter, true ) ) { - return get_post( $post_id, ARRAY_A ); - } - $global_style_query = new WP_Query(); $recent_posts = $global_style_query->query( $args ); if ( count( $recent_posts ) === 1 ) { @@ -456,8 +445,6 @@ class WP_Theme_JSON_Resolver { $user_cpt = get_post( $cpt_post_id, ARRAY_A ); } } - $cache_expiration = $user_cpt ? DAY_IN_SECONDS : HOUR_IN_SECONDS; - set_transient( $cache_key, $user_cpt ? $user_cpt['ID'] : -1, $cache_expiration ); return $user_cpt; } diff --git a/tests/phpunit/tests/theme/wpThemeJsonResolver.php b/tests/phpunit/tests/theme/wpThemeJsonResolver.php index 9e7e26cae2..524fade2d8 100644 --- a/tests/phpunit/tests/theme/wpThemeJsonResolver.php +++ b/tests/phpunit/tests/theme/wpThemeJsonResolver.php @@ -12,6 +12,13 @@ */ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase { + /** + * Administrator ID. + * + * @var int + */ + protected static $administrator_id; + /** * Theme root directory. * @@ -64,6 +71,13 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase { public static function set_up_before_class() { parent::set_up_before_class(); + self::$administrator_id = self::factory()->user->create( + array( + 'role' => 'administrator', + 'user_email' => 'administrator@example.com', + ) + ); + static::$property_blocks_cache = new ReflectionProperty( WP_Theme_JSON_Resolver::class, 'blocks_cache' ); static::$property_blocks_cache->setAccessible( true ); static::$property_blocks_cache_orig_value = static::$property_blocks_cache->getValue(); @@ -620,6 +634,7 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase { * @covers WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles */ function test_get_user_data_from_wp_global_styles_does_not_use_uncached_queries() { + wp_set_current_user( self::$administrator_id ); $theme = wp_get_theme(); WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme ); add_filter( 'query', array( $this, 'filter_db_query' ) ); @@ -629,23 +644,41 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase { WP_Theme_JSON_Resolver::clean_cached_data(); } $query_count = count( $this->queries ) - $query_count; - $this->assertSame( 0, $query_count, 'Unexpected SQL queries detected for the wp_global_style post type' ); + $this->assertSame( 0, $query_count, 'Unexpected SQL queries detected for the wp_global_style post type prior to creation.' ); $user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme ); - $this->assertEmpty( $user_cpt ); + $this->assertEmpty( $user_cpt, 'User CPT is expected to be empty.' ); $user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme, true ); - $this->assertNotEmpty( $user_cpt ); + $this->assertNotEmpty( $user_cpt, 'User CPT is expected not to be empty.' ); $query_count = count( $this->queries ); for ( $i = 0; $i < 3; $i ++ ) { $new_user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme ); WP_Theme_JSON_Resolver::clean_cached_data(); - $this->assertSameSets( $user_cpt, $new_user_cpt ); + $this->assertSameSets( $user_cpt, $new_user_cpt, "User CPTs do not match on run {$i}." ); } $query_count = count( $this->queries ) - $query_count; - $this->assertSame( 0, $query_count, 'Unexpected SQL queries detected for the wp_global_style post type' ); - remove_filter( 'query', array( $this, 'filter_db_query' ) ); + $this->assertSame( 1, $query_count, 'Unexpected SQL queries detected for the wp_global_style post type after creation.' ); + } + + /** + * @covers WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles + */ + function test_get_user_data_from_wp_global_styles_does_not_use_uncached_queries_for_logged_out_users() { + $theme = wp_get_theme(); + WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme ); + add_filter( 'query', array( $this, 'filter_db_query' ) ); + $query_count = count( $this->queries ); + for ( $i = 0; $i < 3; $i++ ) { + WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme ); + WP_Theme_JSON_Resolver::clean_cached_data(); + } + $query_count = count( $this->queries ) - $query_count; + $this->assertSame( 0, $query_count, 'Unexpected SQL queries detected for the wp_global_style post type prior to creation.' ); + + $user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme ); + $this->assertEmpty( $user_cpt, 'User CPT is expected to be empty.' ); } /**