函数文档

_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

Return

array Plugin data. Values will be empty if not supplied by the plugin.
See get_plugin_data() for the list of possible values.

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.