From f8bdacb6fc23e0e259a4a6af5187f67d5c6fbb84 Mon Sep 17 00:00:00 2001 From: Tonya Mork Date: Wed, 25 Jan 2023 19:36:58 +0000 Subject: [PATCH] Themes: Add static cache variable to wp_theme_has_theme_json(). For performance, a static variable is added to `wp_theme_has_theme_json()` to cache the boolean result of determining if a theme (or its parent) has a `theme.json` file. This cache avoids the overhead of calling `get_stylesheet_directory()` and `get_template_directory()` each time `wp_theme_has_theme_json()` is invoked. The cache is lean, non-persistent, and encapsulated within the function (i.e. function scope and not available externally). The cache is ignored when: * `WP_DEBUG` is on to avoid interrupting theme developer's workflow and for extender automated test suites. * `WP_RUN_CORE_TESTS` is on to ensure each Core test exercises the checking code. Follow-up to [55092], [55086]. Props oandregal, azaozz, costdev, dmsnell, flixos90, hellofromTonya, Otto42, spacedmonkey. Fixes #56975. git-svn-id: https://develop.svn.wordpress.org/trunk@55138 602fd350-edb4-49c9-b593-d223f7449a82 --- .../global-styles-and-settings.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/wp-includes/global-styles-and-settings.php b/src/wp-includes/global-styles-and-settings.php index c625166524..a0b91a4d21 100644 --- a/src/wp-includes/global-styles-and-settings.php +++ b/src/wp-includes/global-styles-and-settings.php @@ -264,6 +264,26 @@ function wp_add_global_styles_for_blocks() { * @return bool Returns true if theme or its parent has a theme.json file, false otherwise. */ function wp_theme_has_theme_json() { + static $theme_has_support = null; + + if ( + null !== $theme_has_support && + /* + * Ignore static cache when `WP_DEBUG` is enabled. Why? To avoid interfering with + * the theme developer's workflow. + * + * @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core. + */ + ! WP_DEBUG && + /* + * Ignore cache when automated test suites are running. Why? To ensure + * the static cache is reset between each test. + */ + ! ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS ) + ) { + return $theme_has_support; + } + // Does the theme have its own theme.json? $theme_has_support = is_readable( get_stylesheet_directory() . '/theme.json' );