_get_plugin_data_markup_translate()
云策文档标注
概述
_get_plugin_data_markup_translate() 函数用于处理插件数据,包括清理、可选添加 HTML 标记和翻译。它基于 get_plugin_data() 返回的数据,确保安全性和国际化支持。
关键要点
- 函数接受插件文件路径、插件数据数组、标记和翻译参数,返回处理后的插件数据数组。
- 通过 wp_kses() 和 esc_url() 清理插件数据字段,防止不安全内容。
- 支持根据 TextDomain 加载翻译,并可选应用 HTML 标记(如链接和文本格式化)。
- 与 WordPress 核心函数如 translate()、load_plugin_textdomain() 和 wptexturize() 集成。
代码示例
function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) {
// 清理插件文件名
$plugin_file = plugin_basename( $plugin_file );
// 翻译字段
if ( $translate ) {
$textdomain = $plugin_data['TextDomain'];
if ( $textdomain ) {
if ( ! is_textdomain_loaded( $textdomain ) ) {
if ( $plugin_data['DomainPath'] ) {
load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] );
} else {
load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) );
}
}
} elseif ( 'hello.php' === basename( $plugin_file ) ) {
$textdomain = 'default';
}
if ( $textdomain ) {
foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) {
if ( ! empty( $plugin_data[ $field ] ) ) {
$plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain );
}
}
}
}
// 清理字段
$allowed_tags_in_links = array(
'abbr' => array( 'title' => true ),
'acronym' => array( 'title' => true ),
'code' => true,
'em' => true,
'strong' => true,
);
$allowed_tags = $allowed_tags_in_links;
$allowed_tags['a'] = array(
'href' => true,
'title' => true,
);
$plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links );
$plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags );
$plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags );
$plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags );
$plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] );
$plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] );
// 应用标记
if ( $markup ) {
if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) {
$plugin_data['Title'] = '' . $plugin_data['Name'] . '';
}
if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) {
$plugin_data['Author'] = '' . $plugin_data['Author'] . '';
}
$plugin_data['Description'] = wptexturize( $plugin_data['Description'] );
if ( $plugin_data['Author'] ) {
$plugin_data['Description'] .= sprintf(
' ' . __( 'By %s.' ) . '',
$plugin_data['Author']
);
}
}
return $plugin_data;
}注意事项
- 函数内部使用 wp_kses() 限制允许的 HTML 标签,确保安全性。
- 翻译功能依赖于 TextDomain 和 load_plugin_textdomain(),需正确配置插件翻译文件。
- 标记应用包括链接包装和文本格式化,适用于插件列表显示等场景。
- 自 WordPress 2.7.0 引入,是处理插件数据的核心内部函数。
原文内容
Sanitizes plugin data, optionally adds markup, optionally translates.
Description
See also
Parameters
$plugin_filestringrequired-
Path to the main plugin file.
$plugin_dataarrayrequired-
An array of plugin data. See get_plugin_data() .
$markupbooloptional-
If the returned data should have HTML markup applied.
Default:
true $translatebooloptional-
If the returned data should be translated.
Default:
true
Source
function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) {
// Sanitize the plugin filename to a WP_PLUGIN_DIR relative path.
$plugin_file = plugin_basename( $plugin_file );
// Translate fields.
if ( $translate ) {
$textdomain = $plugin_data['TextDomain'];
if ( $textdomain ) {
if ( ! is_textdomain_loaded( $textdomain ) ) {
if ( $plugin_data['DomainPath'] ) {
load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] );
} else {
load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) );
}
}
} elseif ( 'hello.php' === basename( $plugin_file ) ) {
$textdomain = 'default';
}
if ( $textdomain ) {
foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) {
if ( ! empty( $plugin_data[ $field ] ) ) {
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
$plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain );
}
}
}
}
// Sanitize fields.
$allowed_tags_in_links = array(
'abbr' => array( 'title' => true ),
'acronym' => array( 'title' => true ),
'code' => true,
'em' => true,
'strong' => true,
);
$allowed_tags = $allowed_tags_in_links;
$allowed_tags['a'] = array(
'href' => true,
'title' => true,
);
/*
* Name is marked up inside <a> tags. Don't allow these.
* Author is too, but some plugins have used <a> here (omitting Author URI).
*/
$plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links );
$plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags );
$plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags );
$plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags );
$plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] );
$plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] );
$plugin_data['Title'] = $plugin_data['Name'];
$plugin_data['AuthorName'] = $plugin_data['Author'];
// Apply markup.
if ( $markup ) {
if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) {
$plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '">' . $plugin_data['Name'] . '</a>';
}
if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) {
$plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>';
}
$plugin_data['Description'] = wptexturize( $plugin_data['Description'] );
if ( $plugin_data['Author'] ) {
$plugin_data['Description'] .= sprintf(
/* translators: %s: Plugin author. */
' <cite>' . __( 'By %s.' ) . '</cite>',
$plugin_data['Author']
);
}
}
return $plugin_data;
}
Changelog
| Version | Description |
|---|---|
| 2.7.0 | Introduced. |