函数文档

register_block_script_module_id()

💡 云策文档标注

概述

register_block_script_module_id() 函数用于从块元数据中查找并注册脚本模块 ID。它支持处理文件路径,自动生成模块 ID,并处理交互性 API 相关配置。

关键要点

  • 函数从块元数据中提取指定字段的脚本模块 ID,支持数组和多索引处理。
  • 当提供文件路径时,函数会查找对应的 .asset.php 文件以获取依赖和版本信息。
  • 自动生成模块 ID 使用 generate_block_asset_handle(),并注册脚本模块到 WordPress。
  • 支持交互性 API,根据元数据设置 fetchpriority 和 clientNavigation 支持。
  • 参数包括 $metadata(数组)、$field_name(字符串)和 $index(整数,默认 0)。
  • 返回脚本模块 ID 字符串或失败时返回 false。

代码示例

function register_block_script_module_id( $metadata, $field_name, $index = 0 ) {
    if ( empty( $metadata[ $field_name ] ) ) {
        return false;
    }

    $module_id = $metadata[ $field_name ];
    if ( is_array( $module_id ) ) {
        if ( empty( $module_id[ $index ] ) ) {
            return false;
        }
        $module_id = $module_id[ $index ];
    }

    $module_path = remove_block_asset_path_prefix( $module_id );
    if ( $module_id === $module_path ) {
        return $module_id;
    }

    $path                  = dirname( $metadata['file'] );
    $module_asset_raw_path = $path . '/' . substr_replace( $module_path, '.asset.php', - strlen( '.js' ) );
    $module_id             = generate_block_asset_handle( $metadata['name'], $field_name, $index );
    $module_asset_path     = wp_normalize_path(
        realpath( $module_asset_raw_path )
    );

    $module_path_norm = wp_normalize_path( realpath( $path . '/' . $module_path ) );
    $module_uri       = get_block_asset_url( $module_path_norm );

    $module_asset        = ! empty( $module_asset_path ) ? require $module_asset_path : array();
    $module_dependencies = isset( $module_asset['dependencies'] ) ? $module_asset['dependencies'] : array();
    $block_version       = isset( $metadata['version'] ) ? $metadata['version'] : false;
    $module_version      = isset( $module_asset['version'] ) ? $module_asset['version'] : $block_version;

    $supports_interactivity_true = isset( $metadata['supports']['interactivity'] ) && true === $metadata['supports']['interactivity'];
    $is_interactive              = $supports_interactivity_true || ( isset( $metadata['supports']['interactivity']['interactive'] ) && true === $metadata['supports']['interactivity']['interactive'] );
    $supports_client_navigation  = $supports_interactivity_true || ( isset( $metadata['supports']['interactivity']['clientNavigation'] ) && true === $metadata['supports']['interactivity']['clientNavigation'] );

    $args = array();

    if ( $is_interactive ) {
        $args['fetchpriority'] = 'low';
        $args['in_footer']     = true;
    }

    if ( $is_interactive && $supports_client_navigation ) {
        wp_interactivity()->add_client_navigation_support_to_script_module( $module_id );
    }

    wp_register_script_module(
        $module_id,
        $module_uri,
        $module_dependencies,
        $module_version,
        $args
    );

    return $module_id;
}

注意事项

  • 函数在 WordPress 6.5.0 版本中引入,主要用于 register_block_type_from_metadata()。
  • 依赖多个辅助函数如 remove_block_asset_path_prefix() 和 wp_register_script_module()。
  • 确保块元数据文件路径正确,以便自动查找 .asset.php 文件。

📄 原文内容

Finds a script module ID for the selected block metadata field. It detects when a path to file was provided and optionally finds a corresponding asset file with details necessary to register the script module under with an automatically generated module ID. It returns unprocessed script module ID otherwise.

Parameters

$metadataarrayrequired
Block metadata.
$field_namestringrequired
Field name to pick from metadata.
$indexintoptional
Index of the script module ID to register when multiple items passed. Default 0.

Return

string|false Script module ID or false on failure.

Source

function register_block_script_module_id( $metadata, $field_name, $index = 0 ) {
	if ( empty( $metadata[ $field_name ] ) ) {
		return false;
	}

	$module_id = $metadata[ $field_name ];
	if ( is_array( $module_id ) ) {
		if ( empty( $module_id[ $index ] ) ) {
			return false;
		}
		$module_id = $module_id[ $index ];
	}

	$module_path = remove_block_asset_path_prefix( $module_id );
	if ( $module_id === $module_path ) {
		return $module_id;
	}

	$path                  = dirname( $metadata['file'] );
	$module_asset_raw_path = $path . '/' . substr_replace( $module_path, '.asset.php', - strlen( '.js' ) );
	$module_id             = generate_block_asset_handle( $metadata['name'], $field_name, $index );
	$module_asset_path     = wp_normalize_path(
		realpath( $module_asset_raw_path )
	);

	$module_path_norm = wp_normalize_path( realpath( $path . '/' . $module_path ) );
	$module_uri       = get_block_asset_url( $module_path_norm );

	$module_asset        = ! empty( $module_asset_path ) ? require $module_asset_path : array();
	$module_dependencies = isset( $module_asset['dependencies'] ) ? $module_asset['dependencies'] : array();
	$block_version       = isset( $metadata['version'] ) ? $metadata['version'] : false;
	$module_version      = isset( $module_asset['version'] ) ? $module_asset['version'] : $block_version;

	$supports_interactivity_true = isset( $metadata['supports']['interactivity'] ) && true === $metadata['supports']['interactivity'];
	$is_interactive              = $supports_interactivity_true || ( isset( $metadata['supports']['interactivity']['interactive'] ) && true === $metadata['supports']['interactivity']['interactive'] );
	$supports_client_navigation  = $supports_interactivity_true || ( isset( $metadata['supports']['interactivity']['clientNavigation'] ) && true === $metadata['supports']['interactivity']['clientNavigation'] );

	$args = array();

	// Blocks using the Interactivity API are server-side rendered, so they are
	// by design not in the critical rendering path and should be deprioritized.
	if ( $is_interactive ) {
		$args['fetchpriority'] = 'low';
		$args['in_footer']     = true;
	}

	// Blocks using the Interactivity API that support client-side navigation
	// must be marked as such in their script modules.
	if ( $is_interactive && $supports_client_navigation ) {
		wp_interactivity()->add_client_navigation_support_to_script_module( $module_id );
	}

	wp_register_script_module(
		$module_id,
		$module_uri,
		$module_dependencies,
		$module_version,
		$args
	);

	return $module_id;
}

Changelog

Version Description
6.5.0 Introduced.