Make WordPress Core


Ignore:
Timestamp:
10/09/2023 05:05:31 PM (14 months ago)
Author:
flixos90
Message:

Editor: Improve performance of wp_render_elements_support().

By skipping iterations in block supports when not necessary, this changeset improves performance of the function notably.

The performance enhancement leads to even a notable improvement for overall page load time: For example, the Twenty Twenty-Four home page loads ~2% faster with this changeset.

Props dmsnell, spacedmonkey, costdev, hellofromTonya, aaronrobertshaw.
Fixes #59544.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/block-supports/elements.php

    r56709 r56807  
    3232 */
    3333function wp_render_elements_support( $block_content, $block ) {
    34     if ( ! $block_content || empty( $block['attrs'] ) ) {
     34    if ( ! $block_content || ! isset( $block['attrs']['style']['elements'] ) ) {
    3535        return $block_content;
    3636    }
     
    4242            'skip'  => wp_should_skip_block_supports_serialization( $block_type, 'color', 'button' ),
    4343            'paths' => array(
    44                 'style.elements.button.color.text',
    45                 'style.elements.button.color.background',
    46                 'style.elements.button.color.gradient',
     44                array( 'button', 'color', 'text' ),
     45                array( 'button', 'color', 'background' ),
     46                array( 'button', 'color', 'gradient' ),
    4747            ),
    4848        ),
     
    5050            'skip'  => wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' ),
    5151            'paths' => array(
    52                 'style.elements.link.color.text',
    53                 'style.elements.link.:hover.color.text',
     52                array( 'link', 'color', 'text' ),
     53                array( 'link', ':hover', 'color', 'text' ),
    5454            ),
    5555        ),
     
    5757            'skip'  => wp_should_skip_block_supports_serialization( $block_type, 'color', 'heading' ),
    5858            'paths' => array(
    59                 'style.elements.heading.color.text',
    60                 'style.elements.heading.color.background',
    61                 'style.elements.heading.color.gradient',
    62                 'style.elements.h1.color.text',
    63                 'style.elements.h1.color.background',
    64                 'style.elements.h1.color.gradient',
    65                 'style.elements.h2.color.text',
    66                 'style.elements.h2.color.background',
    67                 'style.elements.h2.color.gradient',
    68                 'style.elements.h3.color.text',
    69                 'style.elements.h3.color.background',
    70                 'style.elements.h3.color.gradient',
    71                 'style.elements.h4.color.text',
    72                 'style.elements.h4.color.background',
    73                 'style.elements.h4.color.gradient',
    74                 'style.elements.h5.color.text',
    75                 'style.elements.h5.color.background',
    76                 'style.elements.h5.color.gradient',
    77                 'style.elements.h6.color.text',
    78                 'style.elements.h6.color.background',
    79                 'style.elements.h6.color.gradient',
     59                array( 'heading', 'color', 'text' ),
     60                array( 'heading', 'color', 'background' ),
     61                array( 'heading', 'color', 'gradient' ),
     62                array( 'h1', 'color', 'text' ),
     63                array( 'h1', 'color', 'background' ),
     64                array( 'h1', 'color', 'gradient' ),
     65                array( 'h2', 'color', 'text' ),
     66                array( 'h2', 'color', 'background' ),
     67                array( 'h2', 'color', 'gradient' ),
     68                array( 'h3', 'color', 'text' ),
     69                array( 'h3', 'color', 'background' ),
     70                array( 'h3', 'color', 'gradient' ),
     71                array( 'h4', 'color', 'text' ),
     72                array( 'h4', 'color', 'background' ),
     73                array( 'h4', 'color', 'gradient' ),
     74                array( 'h5', 'color', 'text' ),
     75                array( 'h5', 'color', 'background' ),
     76                array( 'h5', 'color', 'gradient' ),
     77                array( 'h6', 'color', 'text' ),
     78                array( 'h6', 'color', 'background' ),
     79                array( 'h6', 'color', 'gradient' ),
    8080            ),
    8181        ),
     
    9090    }
    9191
    92     $element_colors_set = 0;
     92    $elements_style_attributes = $block['attrs']['style']['elements'];
    9393
    9494    foreach ( $element_color_properties as $element_config ) {
     
    9898
    9999        foreach ( $element_config['paths'] as $path ) {
    100             if ( null !== _wp_array_get( $block['attrs'], explode( '.', $path ), null ) ) {
    101                 ++$element_colors_set;
     100            if ( null !== _wp_array_get( $elements_style_attributes, $path, null ) ) {
     101                /*
     102                 * It only takes a single custom attribute to require that the custom
     103                 * class name be added to the block, so once one is found there's no
     104                 * need to continue looking for others.
     105                 *
     106                 * As is done with the layout hook, this code assumes that the block
     107                 * contains a single wrapper and that it's the first element in the
     108                 * rendered output. That first element, if it exists, gets the class.
     109                 */
     110                $tags = new WP_HTML_Tag_Processor( $block_content );
     111                if ( $tags->next_tag() ) {
     112                    $tags->add_class( wp_get_elements_class_name( $block ) );
     113                }
     114
     115                return $tags->get_updated_html();
    102116            }
    103117        }
    104118    }
    105119
    106     if ( ! $element_colors_set ) {
    107         return $block_content;
    108     }
    109 
    110     // Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
    111     // Add the class name to the first element, presuming it's the wrapper, if it exists.
    112     $tags = new WP_HTML_Tag_Processor( $block_content );
    113     if ( $tags->next_tag() ) {
    114         $tags->add_class( wp_get_elements_class_name( $block ) );
    115     }
    116 
    117     return $tags->get_updated_html();
     120    // If no custom attributes were found then there's nothing to modify.
     121    return $block_content;
    118122}
    119123
Note: See TracChangeset for help on using the changeset viewer.