@@ -352,13 +352,14 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
352352 $ file_or_folder ;
353353
354354 $ is_core_block = str_starts_with ( $ file_or_folder , ABSPATH . WPINC );
355-
356- if ( ! $ is_core_block && ! file_exists ( $ metadata_file ) ) {
355+ // If the block is not a core block, the metadata file must exist.
356+ $ metadata_file_exists = $ is_core_block || file_exists ( $ metadata_file );
357+ if ( ! $ metadata_file_exists && empty ( $ args ['name ' ] ) ) {
357358 return false ;
358359 }
359360
360361 // Try to get metadata from the static cache for core blocks.
361- $ metadata = false ;
362+ $ metadata = array () ;
362363 if ( $ is_core_block ) {
363364 $ core_block_name = str_replace ( ABSPATH . WPINC . '/blocks/ ' , '' , $ file_or_folder );
364365 if ( ! empty ( $ core_blocks_meta [ $ core_block_name ] ) ) {
@@ -367,14 +368,15 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
367368 }
368369
369370 // If metadata is not found in the static cache, read it from the file.
370- if ( ! $ metadata ) {
371+ if ( $ metadata_file_exists && empty ( $ metadata ) ) {
371372 $ metadata = wp_json_file_decode ( $ metadata_file , array ( 'associative ' => true ) );
372373 }
373374
374- if ( ! is_array ( $ metadata ) || empty ( $ metadata ['name ' ] ) ) {
375+ if ( ! is_array ( $ metadata ) || ( empty ( $ metadata ['name ' ] ) && empty ( $ args [ ' name ' ] ) ) ) {
375376 return false ;
376377 }
377- $ metadata ['file ' ] = wp_normalize_path ( realpath ( $ metadata_file ) );
378+
379+ $ metadata ['file ' ] = $ metadata_file_exists ? wp_normalize_path ( realpath ( $ metadata_file ) ) : null ;
378380
379381 /**
380382 * Filters the metadata provided for registering a block type.
@@ -404,6 +406,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
404406 $ settings = array ();
405407 $ property_mappings = array (
406408 'apiVersion ' => 'api_version ' ,
409+ 'name ' => 'name ' ,
407410 'title ' => 'title ' ,
408411 'category ' => 'category ' ,
409412 'parent ' => 'parent ' ,
@@ -426,18 +429,50 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
426429 foreach ( $ property_mappings as $ key => $ mapped_key ) {
427430 if ( isset ( $ metadata [ $ key ] ) ) {
428431 $ settings [ $ mapped_key ] = $ metadata [ $ key ];
429- if ( $ textdomain && isset ( $ i18n_schema ->$ key ) ) {
432+ if ( $ metadata_file_exists && $ textdomain && isset ( $ i18n_schema ->$ key ) ) {
430433 $ settings [ $ mapped_key ] = translate_settings_using_i18n_schema ( $ i18n_schema ->$ key , $ settings [ $ key ], $ textdomain );
431434 }
432435 }
433436 }
434437
438+ if ( ! empty ( $ metadata ['render ' ] ) ) {
439+ $ template_path = wp_normalize_path (
440+ realpath (
441+ dirname ( $ metadata ['file ' ] ) . '/ ' .
442+ remove_block_asset_path_prefix ( $ metadata ['render ' ] )
443+ )
444+ );
445+ if ( $ template_path ) {
446+ /**
447+ * Renders the block on the server.
448+ *
449+ * @since 6.1.0
450+ *
451+ * @param array $attributes Block attributes.
452+ * @param string $content Block default content.
453+ * @param WP_Block $block Block instance.
454+ *
455+ * @return string Returns the block content.
456+ */
457+ $ settings ['render_callback ' ] = static function ( $ attributes , $ content , $ block ) use ( $ template_path ) {
458+ ob_start ();
459+ require $ template_path ;
460+ return ob_get_clean ();
461+ };
462+ }
463+ }
464+
465+ $ settings = array_merge ( $ settings , $ args );
466+
435467 $ script_fields = array (
436468 'editorScript ' => 'editor_script_handles ' ,
437469 'script ' => 'script_handles ' ,
438470 'viewScript ' => 'view_script_handles ' ,
439471 );
440472 foreach ( $ script_fields as $ metadata_field_name => $ settings_field_name ) {
473+ if ( ! empty ( $ settings [ $ metadata_field_name ] ) ) {
474+ $ metadata [ $ metadata_field_name ] = $ settings [ $ metadata_field_name ];
475+ }
441476 if ( ! empty ( $ metadata [ $ metadata_field_name ] ) ) {
442477 $ scripts = $ metadata [ $ metadata_field_name ];
443478 $ processed_scripts = array ();
@@ -470,6 +505,9 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
470505 'style ' => 'style_handles ' ,
471506 );
472507 foreach ( $ style_fields as $ metadata_field_name => $ settings_field_name ) {
508+ if ( ! empty ( $ settings [ $ metadata_field_name ] ) ) {
509+ $ metadata [ $ metadata_field_name ] = $ settings [ $ metadata_field_name ];
510+ }
473511 if ( ! empty ( $ metadata [ $ metadata_field_name ] ) ) {
474512 $ styles = $ metadata [ $ metadata_field_name ];
475513 $ processed_styles = array ();
@@ -530,33 +568,6 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
530568 }
531569 }
532570
533- if ( ! empty ( $ metadata ['render ' ] ) ) {
534- $ template_path = wp_normalize_path (
535- realpath (
536- dirname ( $ metadata ['file ' ] ) . '/ ' .
537- remove_block_asset_path_prefix ( $ metadata ['render ' ] )
538- )
539- );
540- if ( $ template_path ) {
541- /**
542- * Renders the block on the server.
543- *
544- * @since 6.1.0
545- *
546- * @param array $attributes Block attributes.
547- * @param string $content Block default content.
548- * @param WP_Block $block Block instance.
549- *
550- * @return string Returns the block content.
551- */
552- $ settings ['render_callback ' ] = static function ( $ attributes , $ content , $ block ) use ( $ template_path ) {
553- ob_start ();
554- require $ template_path ;
555- return ob_get_clean ();
556- };
557- }
558- }
559-
560571 /**
561572 * Filters the settings determined from the block type metadata.
562573 *
@@ -565,14 +576,9 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
565576 * @param array $settings Array of determined settings for registering a block type.
566577 * @param array $metadata Metadata provided for registering a block type.
567578 */
568- $ settings = apply_filters (
569- 'block_type_metadata_settings ' ,
570- array_merge (
571- $ settings ,
572- $ args
573- ),
574- $ metadata
575- );
579+ $ settings = apply_filters ( 'block_type_metadata_settings ' , $ settings , $ metadata );
580+
581+ $ metadata ['name ' ] = ! empty ( $ settings ['name ' ] ) ? $ settings ['name ' ] : $ metadata ['name ' ];
576582
577583 return WP_Block_Type_Registry::get_instance ()->register (
578584 $ metadata ['name ' ],
0 commit comments