Make WordPress Core

Changeset 58025


Ignore:
Timestamp:
04/19/2024 05:57:43 PM (8 months ago)
Author:
joemcgill
Message:

Themes: Cache block theme patterns in a transient.

This extends the benefits of persistent caching added in [56978] for block theme patterns to sites that are not using a persistent object cache. By default, these caches expire using the value of the WP_Theme::cache_expiration property. The transient cache TTL can be overridden using the newly introduced wp_theme_files_cache_ttl filter.

Props thekt12, joemcgill, flixos90, peterwilsoncc, spacedmonkey.
See #59600, #59719.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-theme.php

    r57847 r58025  
    19731973     *
    19741974     * @since 6.4.0
     1975     * @since 6.6.0 Uses transients to cache regardless of site environment.
    19751976     *
    19761977     * @return array|false Returns an array of patterns if cache is found, otherwise false.
     
    19801981            return false;
    19811982        }
    1982         $pattern_data = wp_cache_get( 'wp_theme_patterns_' . $this->stylesheet, 'theme_files' );
     1983
     1984        $pattern_data = get_site_transient( 'wp_theme_files_patterns-' . $this->cache_hash );
     1985
    19831986        if ( is_array( $pattern_data ) && $pattern_data['version'] === $this->get( 'Version' ) ) {
    19841987            return $pattern_data['patterns'];
     
    19911994     *
    19921995     * @since 6.4.0
     1996     * @since 6.6.0 Uses transients to cache regardless of site environment.
    19931997     *
    19941998     * @param array $patterns Block patterns data to set in cache.
     
    19992003            'patterns' => $patterns,
    20002004        );
    2001         wp_cache_set( 'wp_theme_patterns_' . $this->stylesheet, $pattern_data, 'theme_files' );
     2005
     2006        /**
     2007         * Filters the cache expiration time for theme files.
     2008         *
     2009         * @since 6.6.0
     2010         *
     2011         * @param int    $cache_expiration Cache expiration time in seconds.
     2012         * @param string $cache_type       Type of cache being set.
     2013         */
     2014        $cache_expiration = (int) apply_filters( 'wp_theme_files_cache_ttl', self::$cache_expiration, 'theme_block_patterns' );
     2015
     2016        // We don't want to cache patterns infinitely.
     2017        if ( $cache_expiration <= 0 ) {
     2018            _doing_it_wrong(
     2019                __METHOD__,
     2020                sprintf(
     2021                    /* translators: %1$s: The filter name.*/
     2022                    __( 'The %1$s filter must return an integer value greater than 0.' ),
     2023                    '<code>wp_theme_files_cache_ttl</code>'
     2024                ),
     2025                '6.6.0'
     2026            );
     2027
     2028            $cache_expiration = self::$cache_expiration;
     2029        }
     2030
     2031        set_site_transient( 'wp_theme_files_patterns-' . $this->cache_hash, $pattern_data, $cache_expiration );
    20022032    }
    20032033
     
    20062036     *
    20072037     * @since 6.4.0
     2038     * @since 6.6.0 Uses transients to cache regardless of site environment.
    20082039     */
    20092040    public function delete_pattern_cache() {
    2010         wp_cache_delete( 'wp_theme_patterns_' . $this->stylesheet, 'theme_files' );
     2041        delete_site_transient( 'wp_theme_files_patterns-' . $this->cache_hash );
    20112042    }
    20122043
  • trunk/tests/phpunit/tests/theme/wpThemeGetBlockPatterns.php

    r57608 r58025  
    1313 */
    1414class Tests_Theme_WPThemeGetBlockPatterns extends WP_UnitTestCase {
     15    /**
     16     * The initial cache object.
     17     *
     18     * @var object
     19     */
     20    private $initial_cache_object;
     21
     22    public function set_up() {
     23        parent::set_up();
     24
     25        $this->initial_cache_object = wp_using_ext_object_cache();
     26    }
     27
     28    public function tear_down() {
     29        wp_using_ext_object_cache( $this->initial_cache_object );
     30        parent::tear_down();
     31    }
    1532
    1633    public static function wpSetUpBeforeClass() {
     
    3855
    3956        return $pattern_cache;
     57    }
     58
     59    /**
     60     * Test helper to access the private cache_hash propery of a theme.
     61     *
     62     * @param WP_Theme $wp_theme A WP_Theme object.
     63     * @return array|false Returns an array of patterns if cache is found, otherwise false.
     64     */
     65    private function get_cache_hash( $wp_theme ) {
     66        $reflection = new ReflectionProperty( get_class( $wp_theme ), 'cache_hash' );
     67        $reflection->setAccessible( true );
     68        $cache_hash = $reflection->getValue( $wp_theme );
     69        $reflection->setAccessible( false );
     70        return $cache_hash;
    4071    }
    4172
     
    197228        );
    198229    }
     230
     231    /**
     232     * @ticket 59600
     233     *
     234     * @covers WP_Theme::delete_pattern_cache
     235     */
     236    public function test_delete_pattern_cache_non_obj_cache() {
     237        // Ensure object cache is disabled.
     238        wp_using_ext_object_cache( false );
     239
     240        $theme = wp_get_theme( 'block-theme-patterns' );
     241
     242        $this->assertTrue( $theme->exists(), 'The test theme could not be found.' );
     243
     244        $theme->get_block_patterns();
     245
     246        $this->assertSameSets(
     247            array(
     248                'cta.php' => array(
     249                    'title'       => 'Centered Call To Action',
     250                    'slug'        => 'block-theme-patterns/cta',
     251                    'description' => '',
     252                    'categories'  => array( 'call-to-action' ),
     253                ),
     254            ),
     255            $this->get_pattern_cache( $theme ),
     256            'The cache for block theme patterns should match the expected.'
     257        );
     258        $theme->delete_pattern_cache();
     259        $this->assertFalse(
     260            $this->get_pattern_cache( $theme ),
     261            'The cache for block theme patterns should have been cleared.'
     262        );
     263    }
     264
     265    /**
     266     * Check if the pattern cache is stored in transient if object cache is not present.
     267     *
     268     * @ticket 59600
     269     */
     270    public function test_pattern_transient_cache_for_non_cache_site() {
     271        // Ensure object cache is disabled.
     272        wp_using_ext_object_cache( false );
     273
     274        $theme = wp_get_theme( 'block-theme-patterns' );
     275        $theme->get_block_patterns();
     276
     277        $transient_key   = 'wp_theme_files_patterns-' . $this->get_cache_hash( $theme );
     278        $transient_value = get_site_transient( $transient_key );
     279
     280        $this->assertSameSets(
     281            array(
     282                'cta.php' => array(
     283                    'title'       => 'Centered Call To Action',
     284                    'slug'        => 'block-theme-patterns/cta',
     285                    'description' => '',
     286                    'categories'  => array( 'call-to-action' ),
     287                ),
     288            ),
     289            $transient_value['patterns'],
     290            'The transient value should match the expected.'
     291        );
     292
     293        $this->assertNotEmpty(
     294            $this->get_pattern_cache( $theme ),
     295            'The cache for block theme patterns is empty.'
     296        );
     297    }
    199298}
Note: See TracChangeset for help on using the changeset viewer.