在WordPress经典主题开发中,确保输出内容的安全至关重要。以下是常用的安全输出方法:
1. 转义函数
基本转义函数
<?php
// 转义HTML内容
echo esc_html( $text );
// 转义HTML属性
echo esc_attr( $attribute );
// 转义URL
echo esc_url( $url );
// 转义JavaScript
echo esc_js( $javascript );
?>实际应用示例
<!-- 转义标题 -->
<h1><?php echo esc_html( get_the_title() ); ?></h1>
<!-- 转义链接 -->
<a href="<?php echo esc_url( get_permalink() ); ?>"
title="<?php echo esc_attr( get_the_title() ); ?>">
阅读更多
</a>
<!-- 转义文本区域 -->
<textarea><?php echo esc_textarea( $content ); ?></textarea>2. 条件性转义
<?php
// 检查后转义
if ( has_excerpt() ) {
echo esc_html( get_the_excerpt() );
}
// 在属性中使用
<div class="<?php echo has_post_thumbnail() ? 'has-thumbnail' : ''; ?>">
</div>
?>3. wp_kses() – 限制允许的HTML标签
<?php
// 只允许基本的HTML标签
$allowed_html = array(
'a' => array(
'href' => array(),
'title' => array()
),
'br' => array(),
'em' => array(),
'strong' => array(),
);
echo wp_kses( $content, $allowed_html );
// 使用预定义的规则
echo wp_kses_post( $content ); // 允许文章内容中常见的标签
echo wp_kses_data( $content ); // 基本标签
?>4. 数据库查询安全
<?php
// 使用prepare防止SQL注入
global $wpdb;
$user_id = 1;
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}posts WHERE post_author = %d AND post_status = %s",
$user_id,
'publish'
)
);
// 转义LIKE查询
$search_term = '%' . $wpdb->esc_like( $term ) . '%';
?>5. 主题文件中的完整示例
<?php
/**
* 安全的文章循环示例
*/
if ( have_posts() ) :
while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<!-- 转义标题 -->
<header class="entry-header">
<h2 class="entry-title">
<a href="<?php echo esc_url( get_permalink() ); ?>">
<?php echo esc_html( get_the_title() ); ?>
</a>
</h2>
<!-- 转义元信息 -->
<div class="entry-meta">
<span class="posted-on">
<?php echo esc_html( get_the_date() ); ?>
</span>
<span class="byline">
<?php echo esc_html( get_the_author() ); ?>
</span>
</div>
</header>
<!-- 限制HTML输出的内容 -->
<div class="entry-content">
<?php
if ( has_excerpt() ) {
echo wp_kses_post( get_the_excerpt() );
} else {
echo wp_kses_post( wp_trim_words( get_the_content(), 55 ) );
}
?>
</div>
</article>
<?php endwhile;
endif;
?>6. 小工具和选项页的安全输出
<?php
// 小工具中的安全输出
class My_Widget extends WP_Widget {
public function widget( $args, $instance ) {
// 转义小工具参数
echo $args['before_widget'];
if ( ! empty( $instance['title'] ) ) {
$title = apply_filters( 'widget_title', $instance['title'] );
echo $args['before_title'] . esc_html( $title ) . $args['after_title'];
}
// 安全输出内容
if ( ! empty( $instance['text'] ) ) {
echo '<div class="widget-text">';
echo wp_kses_post( $instance['text'] );
echo '</div>';
}
echo $args['after_widget'];
}
}
// 主题选项安全输出
function my_theme_customizer( $wp_customize ) {
$wp_customize->add_setting( 'footer_text', array(
'default' => '',
'sanitize_callback' => 'wp_kses_post' // 清理回调
) );
}
add_action( 'customize_register', 'my_theme_customizer' );
?>7. AJAX请求的安全处理
<?php
// AJAX回调函数
function my_ajax_callback() {
// 验证nonce
if ( ! wp_verify_nonce( $_POST['nonce'], 'my_ajax_nonce' ) ) {
wp_die( '安全验证失败' );
}
// 清理和验证输入
$user_input = sanitize_text_field( $_POST['data'] );
// 处理并返回安全的数据
wp_send_json_success( array(
'message' => esc_html( '处理成功: ' . $user_input )
) );
}
add_action( 'wp_ajax_my_action', 'my_ajax_callback' );
?>最佳实践总结
- 始终转义输出:不要信任任何数据
- 尽早验证,晚点转义:在处理流程的最后阶段进行转义
- 使用适当的转义函数:根据上下文选择合适的函数
- 限制HTML标签:使用wp_kses()控制允许的HTML
- 验证用户输入:在处理前验证所有用户提交的数据
- 使用nonce验证:防止CSRF攻击
遵循这些安全实践可以显著提高WordPress主题的安全性。

