Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Theme JSON: cached resolved URIs
  • Loading branch information
ramonjd committed Oct 21, 2024
1 parent 9de0f74 commit bd36ced
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 10 deletions.
34 changes: 26 additions & 8 deletions src/wp-includes/class-wp-theme-json-resolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,14 @@ class WP_Theme_JSON_Resolver {
*/
protected static $theme_json_file_cache = array();

/**
* Cache for resolved files per theme.
*
* @since 6.8.0
* @var array
*/
protected static $resolved_theme_uris_cache = array();

/**
* Processes a file that adheres to the theme.json schema
* and returns an array with its contents, or a void array if none found.
Expand Down Expand Up @@ -739,20 +747,22 @@ protected static function get_file_path_from_theme( $file_name, $template = fals
* and `$i18n_schema` variables to reset.
* @since 6.1.0 Added the `$blocks` and `$blocks_cache` variables
* to reset.
* @since 6.8.0 Added the `$resolved_theme_uris_cache` variable to reset.
*/
public static function clean_cached_data() {
static::$core = null;
static::$blocks = null;
static::$blocks_cache = array(
static::$core = null;
static::$blocks = null;
static::$blocks_cache = array(
'core' => array(),
'blocks' => array(),
'theme' => array(),
'user' => array(),
);
static::$theme = null;
static::$user = null;
static::$user_custom_post_type_id = null;
static::$i18n_schema = null;
static::$theme = null;
static::$user = null;
static::$user_custom_post_type_id = null;
static::$i18n_schema = null;
static::$resolved_theme_uris_cache = array();
}

/**
Expand Down Expand Up @@ -849,6 +859,7 @@ public static function get_style_variations( $scope = 'theme' ) {
*
* @since 6.6.0
* @since 6.7.0 Resolve relative paths in block styles.
* @since 6.8.0 Added caching for resolved theme URIs.
*
* @param WP_Theme_JSON $theme_json A theme json instance.
* @return array An array of resolved paths.
Expand All @@ -860,6 +871,11 @@ public static function get_resolved_theme_uris( $theme_json ) {
return $resolved_theme_uris;
}

$current_stylesheet_directory = get_stylesheet_directory();
if ( $current_stylesheet_directory && ! empty( static::$resolved_theme_uris_cache[ $current_stylesheet_directory ] ) ) {
return static::$resolved_theme_uris_cache[ $current_stylesheet_directory ];
}

$theme_json_data = $theme_json->get_raw_data();
/*
* The same file convention when registering web fonts.
Expand Down Expand Up @@ -914,7 +930,9 @@ public static function get_resolved_theme_uris( $theme_json ) {
}
}
}

if ( $current_stylesheet_directory ) {
static::$resolved_theme_uris_cache[ $current_stylesheet_directory ] = $resolved_theme_uris;
}
return $resolved_theme_uris;
}

Expand Down
31 changes: 29 additions & 2 deletions tests/phpunit/tests/theme/wpThemeJsonResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,20 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
*/
private static $property_blocks_cache_orig_value;

/**
* WP_Theme_JSON_Resolver::$resolved_theme_uris_cache property.
*
* @var ReflectionProperty
*/
private static $property_resolved_theme_uris_cache;

/**
* Original value of the WP_Theme_JSON_Resolver::$resolved_theme_uris_cache property.
*
* @var array
*/
private static $property_resolved_theme_uris_cache_orig_value;

/**
* WP_Theme_JSON_Resolver::$core property.
*
Expand Down Expand Up @@ -83,11 +97,16 @@ public static function set_up_before_class() {
static::$property_core = new ReflectionProperty( WP_Theme_JSON_Resolver::class, 'core' );
static::$property_core->setAccessible( true );
static::$property_core_orig_value = static::$property_core->getValue();

static::$property_resolved_theme_uris_cache = new ReflectionProperty( WP_Theme_JSON_Resolver::class, 'resolved_theme_uris_cache' );
static::$property_resolved_theme_uris_cache->setAccessible( true );
static::$property_resolved_theme_uris_cache_orig_value = static::$property_resolved_theme_uris_cache->getValue();
}

public static function tear_down_after_class() {
static::$property_blocks_cache->setValue( null, static::$property_blocks_cache_orig_value );
static::$property_core->setValue( null, static::$property_core_orig_value );
static::$property_resolved_theme_uris_cache->setValue( null, static::$property_resolved_theme_uris_cache_orig_value );
parent::tear_down_after_class();
}

Expand Down Expand Up @@ -1322,11 +1341,13 @@ public function test_resolve_theme_file_uris() {
}

/**
* Tests that them uris are resolved and bundled with other metadata in an array.
* Tests that them uris are resolved and bundled with other metadata in an array
* and cached.
*
* @covers WP_Theme_JSON_Resolver::get_resolved_theme_uris
* @ticket 61273
* @ticket 61588
* @ticket 62261
*/
public function test_get_resolved_theme_uris() {
$theme_json = new WP_Theme_JSON(
Expand Down Expand Up @@ -1381,7 +1402,13 @@ public function test_get_resolved_theme_uris() {

$actual = WP_Theme_JSON_Resolver::get_resolved_theme_uris( $theme_json );

$this->assertSame( $expected_data, $actual );
$this->assertSame( $expected_data, $actual, 'Resolved theme uris do not match.' );

// Test that resolved theme uris are cached.
$current_stylesheet_directory = get_stylesheet_directory();
$expected_cache_data = array( "$current_stylesheet_directory" => $actual );

$this->assertSame( $expected_cache_data, static::$property_resolved_theme_uris_cache->getValue(), 'Resolved theme uris cache data does not match.' );
}

/**
Expand Down

0 comments on commit bd36ced

Please sign in to comment.