Make WordPress Core


Ignore:
Timestamp:
09/14/2022 10:50:26 AM (20 months ago)
Author:
gziolo
Message:

Blocks: Allow registering multiple items for all supported asset types

Follow-up #54337, [52069]. Part of https://github.com/WordPress/gutenberg/issues/41236. More details in https://github.com/WordPress/gutenberg/issues/33542.

Allow passing more than one script per block for editorScript, script, and viewScript fields in the block.json metadata file. This aligns with the previously added changes for style and editorStyle fields.

This change impacts the WP_Block_Type class and the REST API endpoint for block types. To ensure backward compatibiliy old names were soft deprecated in favor of new fields that work with array values and have _handles suffix.

Props zieladam, dlh, timothyblynjacobs, aristath, bernhard-reiter.
Fixes #56408.

File:
1 edited

Legend:

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

    r54138 r54155  
    3636 *
    3737 * @since 5.5.0
     38 * @since 6.1.0 Added `$index` parameter.
    3839 *
    3940 * @param string $block_name Name of the block.
    4041 * @param string $field_name Name of the metadata field.
     42 * @param int    $index      Optional. Index of the asset when multiple items passed.
     43 *                           Default 0.
    4144 * @return string Generated asset name for the block's field.
    4245 */
    43 function generate_block_asset_handle( $block_name, $field_name ) {
     46function generate_block_asset_handle( $block_name, $field_name, $index = 0 ) {
    4447    if ( 0 === strpos( $block_name, 'core/' ) ) {
    4548        $asset_handle = str_replace( 'core/', 'wp-block-', $block_name );
     
    4952        if ( 0 === strpos( $field_name, 'view' ) ) {
    5053            $asset_handle .= '-view';
     54        }
     55        if ( $index > 0 ) {
     56            $asset_handle .= '-' . ( $index + 1 );
    5157        }
    5258        return $asset_handle;
     
    6066        'style'        => 'style',
    6167    );
    62     return str_replace( '/', '-', $block_name ) .
     68    $asset_handle   = str_replace( '/', '-', $block_name ) .
    6369        '-' . $field_mappings[ $field_name ];
     70    if ( $index > 0 ) {
     71        $asset_handle .= '-' . ( $index + 1 );
     72    }
     73    return $asset_handle;
    6474}
    6575
     
    7181 *
    7282 * @since 5.5.0
     83 * @since 6.1.0 Added `$index` parameter.
    7384 *
    7485 * @param array  $metadata   Block metadata.
    7586 * @param string $field_name Field name to pick from metadata.
     87 * @param int    $index      Optional. Index of the script to register when multiple items passed.
     88 *                           Default 0.
    7689 * @return string|false Script handle provided directly or created through
    7790 *                      script's registration, or false on failure.
    7891 */
    79 function register_block_script_handle( $metadata, $field_name ) {
     92function register_block_script_handle( $metadata, $field_name, $index = 0 ) {
    8093    if ( empty( $metadata[ $field_name ] ) ) {
    8194        return false;
    8295    }
     96
    8397    $script_handle = $metadata[ $field_name ];
    84     $script_path   = remove_block_asset_path_prefix( $metadata[ $field_name ] );
     98    if ( is_array( $script_handle ) ) {
     99        if ( empty( $script_handle[ $index ] ) ) {
     100            return false;
     101        }
     102        $script_handle = $script_handle[ $index ];
     103    }
     104
     105    $script_path = remove_block_asset_path_prefix( $script_handle );
    85106    if ( $script_handle === $script_path ) {
    86107        return $script_handle;
    87108    }
    88109
    89     $script_handle     = generate_block_asset_handle( $metadata['name'], $field_name );
     110    $script_handle     = generate_block_asset_handle( $metadata['name'], $field_name, $index );
    90111    $script_asset_path = wp_normalize_path(
    91112        realpath(
     
    146167 *
    147168 * @since 5.5.0
     169 * @since 6.1.0 Added `$index` parameter.
    148170 *
    149171 * @param array  $metadata   Block metadata.
    150172 * @param string $field_name Field name to pick from metadata.
     173 * @param int    $index      Optional. Index of the style to register when multiple items passed.
     174 *                           Default 0.
    151175 * @return string|false Style handle provided directly or created through
    152176 *                      style's registration, or false on failure.
    153177 */
    154 function register_block_style_handle( $metadata, $field_name ) {
     178function register_block_style_handle( $metadata, $field_name, $index = 0 ) {
    155179    if ( empty( $metadata[ $field_name ] ) ) {
    156180        return false;
    157181    }
     182
    158183    $wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) );
    159184    $theme_path_norm = wp_normalize_path( get_theme_file_path() );
    160185    $is_core_block   = isset( $metadata['file'] ) && 0 === strpos( $metadata['file'], $wpinc_path_norm );
     186    // Skip registering individual styles for each core block when a bundled version provided.
    161187    if ( $is_core_block && ! wp_should_load_separate_core_block_assets() ) {
    162188        return false;
    163189    }
    164190
     191    $style_handle = $metadata[ $field_name ];
     192    if ( is_array( $style_handle ) ) {
     193        if ( empty( $style_handle[ $index ] ) ) {
     194            return false;
     195        }
     196        $style_handle = $style_handle[ $index ];
     197    }
     198
     199    $style_path      = remove_block_asset_path_prefix( $style_handle );
     200    $is_style_handle = $style_handle === $style_path;
     201    // Allow only passing style handles for core blocks.
     202    if ( $is_core_block && ! $is_style_handle ) {
     203        return false;
     204    }
     205    // Return the style handle unless it's the first item for every core block that requires special treatment.
     206    if ( $is_style_handle && ! ( $is_core_block && 0 === $index ) ) {
     207        return $style_handle;
     208    }
     209
    165210    // Check whether styles should have a ".min" suffix or not.
    166     $suffix = SCRIPT_DEBUG ? '' : '.min';
    167 
    168     $style_handle = $metadata[ $field_name ];
    169     $style_path   = remove_block_asset_path_prefix( $metadata[ $field_name ] );
    170 
    171     if ( $style_handle === $style_path && ! $is_core_block ) {
    172         return $style_handle;
    173     }
    174 
     211    $suffix    = SCRIPT_DEBUG ? '' : '.min';
    175212    $style_uri = plugins_url( $style_path, $metadata['file'] );
    176213    if ( $is_core_block ) {
     
    186223    }
    187224
    188     $style_handle   = generate_block_asset_handle( $metadata['name'], $field_name );
     225    $style_handle   = generate_block_asset_handle( $metadata['name'], $field_name, $index );
    189226    $block_dir      = dirname( $metadata['file'] );
    190     $style_file     = realpath( "$block_dir/$style_path" );
     227    $style_file     = wp_normalize_path( realpath( "$block_dir/$style_path" ) );
    191228    $has_style_file = false !== $style_file;
    192229    $version        = ! $is_core_block && isset( $metadata['version'] ) ? $metadata['version'] : false;
     
    312349    }
    313350
    314     if ( ! empty( $metadata['editorScript'] ) ) {
    315         $settings['editor_script'] = register_block_script_handle(
    316             $metadata,
    317             'editorScript'
    318         );
    319     }
    320 
    321     if ( ! empty( $metadata['script'] ) ) {
    322         $settings['script'] = register_block_script_handle(
    323             $metadata,
    324             'script'
    325         );
    326     }
    327 
    328     if ( ! empty( $metadata['viewScript'] ) ) {
    329         $settings['view_script'] = register_block_script_handle(
    330             $metadata,
    331             'viewScript'
    332         );
    333     }
    334 
    335     if ( ! empty( $metadata['editorStyle'] ) ) {
    336         $settings['editor_style'] = register_block_style_handle(
    337             $metadata,
    338             'editorStyle'
    339         );
    340     }
    341 
    342     if ( ! empty( $metadata['style'] ) ) {
    343         $settings['style'] = register_block_style_handle(
    344             $metadata,
    345             'style'
    346         );
     351    $script_fields = array(
     352        'editorScript' => 'editor_script_handles',
     353        'script'       => 'script_handles',
     354        'viewScript'   => 'view_script_handles',
     355    );
     356    foreach ( $script_fields as $metadata_field_name => $settings_field_name ) {
     357        if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
     358            $scripts           = $metadata[ $metadata_field_name ];
     359            $processed_scripts = array();
     360            if ( is_array( $scripts ) ) {
     361                for ( $index = 0; $index < count( $scripts ); $index++ ) {
     362                    $result = register_block_script_handle(
     363                        $metadata,
     364                        $metadata_field_name,
     365                        $index
     366                    );
     367                    if ( $result ) {
     368                        $processed_scripts[] = $result;
     369                    }
     370                }
     371            } else {
     372                $result = register_block_script_handle(
     373                    $metadata,
     374                    $metadata_field_name
     375                );
     376                if ( $result ) {
     377                    $processed_scripts[] = $result;
     378                }
     379            }
     380            $settings[ $settings_field_name ] = $processed_scripts;
     381        }
     382    }
     383
     384    $style_fields = array(
     385        'editorStyle' => 'editor_style_handles',
     386        'style'       => 'style_handles',
     387    );
     388    foreach ( $style_fields as $metadata_field_name => $settings_field_name ) {
     389        if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
     390            $styles           = $metadata[ $metadata_field_name ];
     391            $processed_styles = array();
     392            if ( is_array( $styles ) ) {
     393                for ( $index = 0; $index < count( $styles ); $index++ ) {
     394                    $result = register_block_style_handle(
     395                        $metadata,
     396                        $metadata_field_name,
     397                        $index
     398                    );
     399                    if ( $result ) {
     400                        $processed_styles[] = $result;
     401                    }
     402                }
     403            } else {
     404                $result = register_block_style_handle(
     405                    $metadata,
     406                    $metadata_field_name
     407                );
     408                if ( $result ) {
     409                    $processed_styles[] = $result;
     410                }
     411            }
     412            $settings[ $settings_field_name ] = $processed_styles;
     413        }
    347414    }
    348415
     
    12631330
    12641331/**
    1265  * Allows multiple block styles.
    1266  *
    1267  * @since 5.9.0
    1268  *
    1269  * @param array $metadata Metadata for registering a block type.
    1270  * @return array Metadata for registering a block type.
    1271  */
    1272 function _wp_multiple_block_styles( $metadata ) {
    1273     foreach ( array( 'style', 'editorStyle' ) as $key ) {
    1274         if ( ! empty( $metadata[ $key ] ) && is_array( $metadata[ $key ] ) ) {
    1275             $default_style = array_shift( $metadata[ $key ] );
    1276             foreach ( $metadata[ $key ] as $handle ) {
    1277                 $args = array( 'handle' => $handle );
    1278                 if ( 0 === strpos( $handle, 'file:' ) && isset( $metadata['file'] ) ) {
    1279                     $style_path      = remove_block_asset_path_prefix( $handle );
    1280                     $theme_path_norm = wp_normalize_path( get_theme_file_path() );
    1281                     $style_path_norm = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . $style_path ) );
    1282                     $is_theme_block  = isset( $metadata['file'] ) && 0 === strpos( $metadata['file'], $theme_path_norm );
    1283 
    1284                     $style_uri = plugins_url( $style_path, $metadata['file'] );
    1285 
    1286                     if ( $is_theme_block ) {
    1287                         $style_uri = get_theme_file_uri( str_replace( $theme_path_norm, '', $style_path_norm ) );
    1288                     }
    1289 
    1290                     $args = array(
    1291                         'handle' => sanitize_key( "{$metadata['name']}-{$style_path}" ),
    1292                         'src'    => $style_uri,
    1293                     );
    1294                 }
    1295 
    1296                 wp_enqueue_block_style( $metadata['name'], $args );
    1297             }
    1298 
    1299             // Only return the 1st item in the array.
    1300             $metadata[ $key ] = $default_style;
    1301         }
    1302     }
    1303     return $metadata;
    1304 }
    1305 add_filter( 'block_type_metadata', '_wp_multiple_block_styles' );
    1306 
    1307 /**
    13081332 * Helper function that constructs a comment query vars array from the passed
    13091333 * block properties.
Note: See TracChangeset for help on using the changeset viewer.