Make WordPress Core


Ignore:
Timestamp:
09/26/2023 01:45:23 PM (3 years ago)
Author:
SergeyBiryukov
Message:

Editor: Reduce the use of the _wp_array_get() function to improve performance.

_wp_array_get() is an expensive function, and it's called thousands of times on each page view on the front end. While the function performance was slightly improved in #58376, it is still called more times than it should be.

This commit aims to further optimize its usage:

  • In many cases, _wp_array_get() can be replaced with a much simpler and faster isset() check.
  • The isset() function is capable of checking nested arrays, so isset( $foo['a']['b']['c'] ) will return false even if $foo['a'] is unset, without throwing any errors or warnings.
  • When _wp_array_get() cannot be directly replaced with isset(), it would be good practice to wrap it in an isset() function so that _wp_array_get() only runs when it needs to.

Original PR from Gutenberg repository:

Follow-up to [55851], [56382].

Props aristath, jrf, spacedmonkey, mukesh27, swissspidy, hellofromTonya.
Fixes #59405.

File:
1 edited

Legend:

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

    r56700 r56709  
    415415
    416416            foreach ( $gap_sides as $gap_side ) {
    417                 $process_value = is_string( $gap_value ) ? $gap_value : _wp_array_get( $gap_value, array( $gap_side ), $fallback_gap_value );
     417                $process_value = $gap_value;
     418                if ( is_array( $gap_value ) ) {
     419                    $process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value;
     420                }
    418421                // Get spacing CSS variable from preset value if provided.
    419422                if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) {
     
    496499
    497500            foreach ( $gap_sides as $gap_side ) {
    498                 $process_value = is_string( $gap_value ) ? $gap_value : _wp_array_get( $gap_value, array( $gap_side ), $fallback_gap_value );
     501                $process_value = $gap_value;
     502                if ( is_array( $gap_value ) ) {
     503                    $process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value;
     504                }
    499505                // Get spacing CSS variable from preset value if provided.
    500506                if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) {
     
    613619
    614620    $global_settings = wp_get_global_settings();
    615     $fallback_layout = ! empty( _wp_array_get( $block_type->supports, array( 'layout', 'default' ), array() ) ) ? _wp_array_get( $block_type->supports, array( 'layout', 'default' ), array() ) : _wp_array_get( $block_type->supports, array( '__experimentalLayout', 'default' ), array() );
    616     $used_layout     = isset( $block['attrs']['layout'] ) ? $block['attrs']['layout'] : $fallback_layout;
     621    $fallback_layout = isset( $block_type->supports['layout']['default'] )
     622        ? $block_type->supports['layout']['default']
     623        : array();
     624    if ( empty( $fallback_layout ) ) {
     625        $fallback_layout = isset( $block_type->supports['__experimentalLayout']['default'] )
     626            ? $block_type->supports['__experimentalLayout']['default']
     627            : array();
     628    }
     629    $used_layout = isset( $block['attrs']['layout'] ) ? $block['attrs']['layout'] : $fallback_layout;
    617630
    618631    $class_names        = array();
     
    625638    }
    626639
    627     $root_padding_aware_alignments = _wp_array_get( $global_settings, array( 'useRootPaddingAwareAlignments' ), false );
     640    $root_padding_aware_alignments = isset( $global_settings['useRootPaddingAwareAlignments'] )
     641        ? $global_settings['useRootPaddingAwareAlignments']
     642        : false;
    628643
    629644    if (
     
    655670    // Get classname for layout type.
    656671    if ( isset( $used_layout['type'] ) ) {
    657         $layout_classname = _wp_array_get( $layout_definitions, array( $used_layout['type'], 'className' ), '' );
     672        $layout_classname = isset( $layout_definitions[ $used_layout['type'] ]['className'] )
     673            ? $layout_definitions[ $used_layout['type'] ]['className']
     674            : '';
    658675    } else {
    659         $layout_classname = _wp_array_get( $layout_definitions, array( 'default', 'className' ), '' );
     676        $layout_classname = isset( $layout_definitions['default']['className'] )
     677            ? $layout_definitions['default']['className']
     678            : '';
    660679    }
    661680
     
    670689    if ( ! current_theme_supports( 'disable-layout-styles' ) ) {
    671690
    672         $gap_value = _wp_array_get( $block, array( 'attrs', 'style', 'spacing', 'blockGap' ) );
     691        $gap_value = isset( $block['attrs']['style']['spacing']['blockGap'] )
     692            ? $block['attrs']['style']['spacing']['blockGap']
     693            : null;
    673694        /*
    674695         * Skip if gap value contains unsupported characters.
     
    684705        }
    685706
    686         $fallback_gap_value = _wp_array_get( $block_type->supports, array( 'spacing', 'blockGap', '__experimentalDefault' ), '0.5em' );
    687         $block_spacing      = _wp_array_get( $block, array( 'attrs', 'style', 'spacing' ), null );
     707        $fallback_gap_value = isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] )
     708            ? $block_type->supports['spacing']['blockGap']['__experimentalDefault']
     709            : '0.5em';
     710        $block_spacing      = isset( $block['attrs']['style']['spacing'] )
     711            ? $block['attrs']['style']['spacing']
     712            : null;
    688713
    689714        /*
     
    693718        $should_skip_gap_serialization = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'blockGap' );
    694719
    695         $block_gap             = _wp_array_get( $global_settings, array( 'spacing', 'blockGap' ), null );
     720        $block_gap             = isset( $global_settings['spacing']['blockGap'] )
     721            ? $global_settings['spacing']['blockGap']
     722            : null;
    696723        $has_block_gap_support = isset( $block_gap );
    697724
Note: See TracChangeset for help on using the changeset viewer.