Make WordPress Core


Ignore:
Timestamp:
09/19/2023 04:15:52 PM (21 months ago)
Author:
spacedmonkey
Message:

Themes: Improve performance of get_block_theme_folders function

This commit enhances the performance of the get_block_theme_folders function by introducing a new method called get_block_template_folders within the WP_Theme class. Previously, this function suffered from poor performance due to repeated file lookups using file_exists. The new method implements basic caching, storing the result in the theme's cache, similar to how block themes are cached in the block_theme property (see [55236]).

Additionally, this change improves error handling by checking if a theme exists before attempting to look up the file. It also enhances test coverage.

Props spacedmonkey, thekt12, swissspidy, flixos90, costdev, mukesh27.
Fixes #58319.

File:
1 edited

Legend:

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

    r56523 r56621  
    196196
    197197    /**
     198     * Block template folders.
     199     *
     200     * @since 6.4.0
     201     * @var string[]
     202     */
     203    private $block_template_folders;
     204
     205    /**
     206     * Default values for template folders.
     207     *
     208     * @since 6.4.0
     209     * @var string[]
     210     */
     211    private $default_template_folders = array(
     212        'wp_template'      => 'templates',
     213        'wp_template_part' => 'parts',
     214    );
     215
     216    /**
    198217     * Flag for whether the themes cache bucket should be persistently cached.
    199218     *
     
    263282
    264283        if ( is_array( $cache ) ) {
    265             foreach ( array( 'block_theme', 'errors', 'headers', 'template' ) as $key ) {
     284            foreach ( array( 'block_template_folders', 'block_theme', 'errors', 'headers', 'template' ) as $key ) {
    266285                if ( isset( $cache[ $key ] ) ) {
    267286                    $this->$key = $cache[ $key ];
     
    288307                $this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) );
    289308            }
    290             $this->template    = $this->stylesheet;
    291             $this->block_theme = false;
     309            $this->template               = $this->stylesheet;
     310            $this->block_theme            = false;
     311            $this->block_template_folders = $this->default_template_folders;
    292312            $this->cache_add(
    293313                'theme',
    294314                array(
    295                     'block_theme' => $this->block_theme,
    296                     'headers'     => $this->headers,
    297                     'errors'      => $this->errors,
    298                     'stylesheet'  => $this->stylesheet,
    299                     'template'    => $this->template,
     315                    'block_template_folders' => $this->block_template_folders,
     316                    'block_theme'            => $this->block_theme,
     317                    'headers'                => $this->headers,
     318                    'errors'                 => $this->errors,
     319                    'stylesheet'             => $this->stylesheet,
     320                    'template'               => $this->template,
    300321                )
    301322            );
     
    305326            return;
    306327        } elseif ( ! is_readable( $this->theme_root . '/' . $theme_file ) ) {
    307             $this->headers['Name'] = $this->stylesheet;
    308             $this->errors          = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) );
    309             $this->template        = $this->stylesheet;
    310             $this->block_theme     = false;
     328            $this->headers['Name']        = $this->stylesheet;
     329            $this->errors                 = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) );
     330            $this->template               = $this->stylesheet;
     331            $this->block_theme            = false;
     332            $this->block_template_folders = $this->default_template_folders;
    311333            $this->cache_add(
    312334                'theme',
    313335                array(
    314                     'block_theme' => $this->block_theme,
    315                     'headers'     => $this->headers,
    316                     'errors'      => $this->errors,
    317                     'stylesheet'  => $this->stylesheet,
    318                     'template'    => $this->template,
     336                    'block_template_folders' => $this->block_template_folders,
     337                    'block_theme'            => $this->block_theme,
     338                    'headers'                => $this->headers,
     339                    'errors'                 => $this->errors,
     340                    'stylesheet'             => $this->stylesheet,
     341                    'template'               => $this->template,
    319342                )
    320343            );
     
    346369                'theme',
    347370                array(
    348                     'block_theme' => $this->is_block_theme(),
    349                     'headers'     => $this->headers,
    350                     'errors'      => $this->errors,
    351                     'stylesheet'  => $this->stylesheet,
     371                    'block_template_folders' => $this->get_block_template_folders(),
     372                    'block_theme'            => $this->is_block_theme(),
     373                    'headers'                => $this->headers,
     374                    'errors'                 => $this->errors,
     375                    'stylesheet'             => $this->stylesheet,
    352376                )
    353377            );
     
    379403                    'theme',
    380404                    array(
    381                         'block_theme' => $this->block_theme,
    382                         'headers'     => $this->headers,
    383                         'errors'      => $this->errors,
    384                         'stylesheet'  => $this->stylesheet,
    385                         'template'    => $this->template,
     405                        'block_template_folders' => $this->get_block_template_folders(),
     406                        'block_theme'            => $this->block_theme,
     407                        'headers'                => $this->headers,
     408                        'errors'                 => $this->errors,
     409                        'stylesheet'             => $this->stylesheet,
     410                        'template'               => $this->template,
    386411                    )
    387412                );
     
    420445                    'theme',
    421446                    array(
    422                         'block_theme' => $this->is_block_theme(),
    423                         'headers'     => $this->headers,
    424                         'errors'      => $this->errors,
    425                         'stylesheet'  => $this->stylesheet,
    426                         'template'    => $this->template,
     447                        'block_template_folders' => $this->get_block_template_folders(),
     448                        'block_theme'            => $this->is_block_theme(),
     449                        'headers'                => $this->headers,
     450                        'errors'                 => $this->errors,
     451                        'stylesheet'             => $this->stylesheet,
     452                        'template'               => $this->template,
    427453                    )
    428454                );
     
    448474                    'theme',
    449475                    array(
    450                         'block_theme' => $_child->is_block_theme(),
    451                         'headers'     => $_child->headers,
    452                         'errors'      => $_child->errors,
    453                         'stylesheet'  => $_child->stylesheet,
    454                         'template'    => $_child->template,
     476                        'block_template_folders' => $_child->get_block_template_folders(),
     477                        'block_theme'            => $_child->is_block_theme(),
     478                        'headers'                => $_child->headers,
     479                        'errors'                 => $_child->errors,
     480                        'stylesheet'             => $_child->stylesheet,
     481                        'template'               => $_child->template,
    455482                    )
    456483                );
     
    468495                        'theme',
    469496                        array(
    470                             'block_theme' => $this->is_block_theme(),
    471                             'headers'     => $this->headers,
    472                             'errors'      => $this->errors,
    473                             'stylesheet'  => $this->stylesheet,
    474                             'template'    => $this->template,
     497                            'block_template_folders' => $this->get_block_template_folders(),
     498                            'block_theme'            => $this->is_block_theme(),
     499                            'headers'                => $this->headers,
     500                            'errors'                 => $this->errors,
     501                            'stylesheet'             => $this->stylesheet,
     502                            'template'               => $this->template,
    475503                        )
    476504                    );
     
    489517        if ( ! is_array( $cache ) ) {
    490518            $cache = array(
    491                 'block_theme' => $this->is_block_theme(),
    492                 'headers'     => $this->headers,
    493                 'errors'      => $this->errors,
    494                 'stylesheet'  => $this->stylesheet,
    495                 'template'    => $this->template,
     519                'block_theme'            => $this->is_block_theme(),
     520                'block_template_folders' => $this->get_block_template_folders(),
     521                'headers'                => $this->headers,
     522                'errors'                 => $this->errors,
     523                'stylesheet'             => $this->stylesheet,
     524                'template'               => $this->template,
    496525            );
    497526            // If the parent theme is in another root, we'll want to cache this. Avoids an entire branch of filesystem calls above.
     
    780809            wp_cache_delete( $key . '-' . $this->cache_hash, 'themes' );
    781810        }
    782         $this->template          = null;
    783         $this->textdomain_loaded = null;
    784         $this->theme_root_uri    = null;
    785         $this->parent            = null;
    786         $this->errors            = null;
    787         $this->headers_sanitized = null;
    788         $this->name_translated   = null;
    789         $this->block_theme       = null;
    790         $this->headers           = array();
     811        $this->template               = null;
     812        $this->textdomain_loaded      = null;
     813        $this->theme_root_uri         = null;
     814        $this->parent                 = null;
     815        $this->errors                 = null;
     816        $this->headers_sanitized      = null;
     817        $this->name_translated        = null;
     818        $this->block_theme            = null;
     819        $this->block_template_folders = null;
     820        $this->headers                = array();
    791821        $this->__construct( $this->stylesheet, $this->theme_root );
    792822    }
     
    17161746
    17171747    /**
     1748     * Returns the folder names of the block template directories.
     1749     *
     1750     * @since 6.4.0
     1751     *
     1752     * @return string[] {
     1753     *     Folder names used by block themes.
     1754     *
     1755     *     @type string $wp_template      Theme-relative directory name for block templates.
     1756     *     @type string $wp_template_part Theme-relative directory name for block template parts.
     1757     * }
     1758     */
     1759    public function get_block_template_folders() {
     1760        // Return set/cached value if available.
     1761        if ( isset( $this->block_template_folders ) ) {
     1762            return $this->block_template_folders;
     1763        }
     1764
     1765        $this->block_template_folders = $this->default_template_folders;
     1766
     1767        $stylesheet_directory = $this->get_stylesheet_directory();
     1768        // If the theme uses deprecated block template folders.
     1769        if ( file_exists( $stylesheet_directory . '/block-templates' ) || file_exists( $stylesheet_directory . '/block-template-parts' ) ) {
     1770            $this->block_template_folders = array(
     1771                'wp_template'      => 'block-templates',
     1772                'wp_template_part' => 'block-template-parts',
     1773            );
     1774        }
     1775        return $this->block_template_folders;
     1776    }
     1777
     1778    /**
    17181779     * Enables a theme for all sites on the current network.
    17191780     *
Note: See TracChangeset for help on using the changeset viewer.