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. |