函数文档

wp_default_packages_scripts()

💡 云策文档标注

概述

wp_default_packages_scripts() 函数用于注册位于标准化路径 /wp-includes/js/dist/ 下的所有 WordPress 包脚本。它通过加载 assets/script-loader-packages.php 文件中的资产数组,并循环处理每个脚本的依赖项和版本信息,最终使用 WP_Scripts 对象的 add() 方法进行注册。

关键要点

  • 函数注册所有位于 /wp-includes/js/dist/ 的 WordPress 包脚本,依赖 WP_Scripts 对象作为参数。
  • 通过加载 assets/script-loader-packages.php 文件获取脚本资产数据,包括依赖项和版本。
  • 自动处理脚本句柄生成(如 'wp-' 前缀)和路径构建,支持后缀(如 .min.js)。
  • 为特定脚本(如 'wp-block-library'、'wp-edit-post'、'wp-preferences')手动添加额外依赖项。
  • 如果依赖中包含 'wp-i18n',则自动设置翻译;对于 'wp-i18n' 脚本本身,添加内联脚本以设置文本方向本地化。
  • 函数在 WordPress 5.0.0 版本中引入,相关函数包括 wp_default_packages()、wp_scripts_get_suffix() 和 _x()。

代码示例

function wp_default_packages_scripts( $scripts ) {
    $suffix = defined( 'WP_RUN_CORE_TESTS' ) ? '.min' : wp_scripts_get_suffix();
    $assets = include ABSPATH . WPINC . "/assets/script-loader-packages{$suffix}.php";

    foreach ( $assets as $file_name => $package_data ) {
        $basename = str_replace( $suffix . '.js', '', basename( $file_name ) );
        $handle   = 'wp-' . $basename;
        $path     = "/wp-includes/js/dist/{$basename}{$suffix}.js";

        if ( ! empty( $package_data['dependencies'] ) ) {
            $dependencies = $package_data['dependencies'];
        } else {
            $dependencies = array();
        }

        // Add dependencies that cannot be detected and generated by build tools.
        switch ( $handle ) {
            case 'wp-block-library':
                array_push( $dependencies, 'editor' );
                break;
            case 'wp-edit-post':
                array_push( $dependencies, 'media-models', 'media-views', 'postbox', 'wp-dom-ready' );
                break;
            case 'wp-preferences':
                array_push( $dependencies, 'wp-preferences-persistence' );
                break;
        }

        $scripts->add( $handle, $path, $dependencies, $package_data['version'], 1 );

        if ( in_array( 'wp-i18n', $dependencies, true ) ) {
            $scripts->set_translations( $handle );
        }

        if ( 'wp-i18n' === $handle ) {
            $ltr    = _x( 'ltr', 'text direction' );
            $script = sprintf( "wp.i18n.setLocaleData( { 'text directionu0004ltr': [ '%s' ] } );", $ltr );
            $scripts->add_inline_script( $handle, $script, 'after' );
        }
    }
}

注意事项

  • 函数依赖于 WP_Scripts 对象,确保在调用前已正确初始化脚本系统。
  • assets/script-loader-packages.php 文件必须存在且包含有效的多维数组数据,否则可能导致注册失败。
  • 手动添加的依赖项(如 'editor' 对于 'wp-block-library')是为了补充构建工具无法自动检测的部分,开发者需注意这些额外依赖。
  • 对于 'wp-i18n' 脚本,内联脚本的添加是为了确保在 RTL 语言中正确设置文本方向,避免翻译顺序问题。
  • 函数在 WordPress 5.0.0 中引入,旧版本中不可用,开发时需考虑版本兼容性。

📄 原文内容

Registers all the WordPress packages scripts that are in the standardized js/dist/ location.

Description

For the order of $scripts->add see wp_default_scripts.

Parameters

$scriptsWP_Scriptsrequired
WP_Scripts object.

Source

function wp_default_packages_scripts( $scripts ) {
	$suffix = defined( 'WP_RUN_CORE_TESTS' ) ? '.min' : wp_scripts_get_suffix();
	/*
	 * Expects multidimensional array like:
	 *
	 *     'a11y.js' => array('dependencies' => array(...), 'version' => '...'),
	 *     'annotations.js' => array('dependencies' => array(...), 'version' => '...'),
	 *     'api-fetch.js' => array(...
	 */
	$assets = include ABSPATH . WPINC . "/assets/script-loader-packages{$suffix}.php";

	foreach ( $assets as $file_name => $package_data ) {
		$basename = str_replace( $suffix . '.js', '', basename( $file_name ) );
		$handle   = 'wp-' . $basename;
		$path     = "/wp-includes/js/dist/{$basename}{$suffix}.js";

		if ( ! empty( $package_data['dependencies'] ) ) {
			$dependencies = $package_data['dependencies'];
		} else {
			$dependencies = array();
		}

		// Add dependencies that cannot be detected and generated by build tools.
		switch ( $handle ) {
			case 'wp-block-library':
				array_push( $dependencies, 'editor' );
				break;
			case 'wp-edit-post':
				array_push( $dependencies, 'media-models', 'media-views', 'postbox', 'wp-dom-ready' );
				break;
			case 'wp-preferences':
				array_push( $dependencies, 'wp-preferences-persistence' );
				break;
		}

		$scripts->add( $handle, $path, $dependencies, $package_data['version'], 1 );

		if ( in_array( 'wp-i18n', $dependencies, true ) ) {
			$scripts->set_translations( $handle );
		}

		/*
		 * Manually set the text direction localization after wp-i18n is printed.
		 * This ensures that wp.i18n.isRTL() returns true in RTL languages.
		 * We cannot use $scripts->set_translations( 'wp-i18n' ) to do this
		 * because WordPress prints a script's translations *before* the script,
		 * which means, in the case of wp-i18n, that wp.i18n.setLocaleData()
		 * is called before wp.i18n is defined.
		 */
		if ( 'wp-i18n' === $handle ) {
			$ltr    = _x( 'ltr', 'text direction' );
			$script = sprintf( "wp.i18n.setLocaleData( { 'text directionu0004ltr': [ '%s' ] } );", $ltr );
			$scripts->add_inline_script( $handle, $script, 'after' );
		}
	}
}

Changelog

Version Description
5.0.0 Introduced.