WordPress问题:category_description过滤<br />及href属性
解决WordPress分类描述HTML标签/属性保存丢失的问题
这个问题我帮不少开发者排查过,核心原因就是WordPress默认会对分类描述的用户输入内容做严格的HTML过滤,像<br />、rel="nofollow"、target="_blank"这类内容,会被默认的wp_kses_post或相关过滤函数清理掉。下面给你几个实用的解决办法:
方法1:允许特定标签与属性(推荐,兼顾安全)
通过过滤器修改WordPress允许的HTML规则,让分类描述保留你需要的标签和属性。把这段代码放到你的子主题functions.php里:
// 为分类描述开放指定HTML标签和属性 add_filter( 'wp_kses_allowed_html', 'custom_allow_category_desc_elements', 10, 2 ); function custom_allow_category_desc_elements( $allowed_tags, $context ) { // 仅针对分类描述的上下文生效 if ( 'category_description' === $context ) { // 允许<br>标签(无需属性) $allowed_tags['br'] = array(); // 给a标签添加rel、target属性权限 if ( isset( $allowed_tags['a'] ) ) { $allowed_tags['a']['rel'] = array(); $allowed_tags['a']['target'] = array(); } } return $allowed_tags; } // 移除分类描述的默认强过滤规则 remove_filter( 'pre_term_description', 'wp_filter_kses' ); remove_filter( 'term_description', 'wp_kses_data' );
这段代码既保留了WordPress的基础安全过滤,又针对性开放了你需要的内容,适合大多数场景。
方法2:直接自定义分类描述输出逻辑
如果方法1不生效,你可以直接接管分类描述的输出流程,跳过默认过滤:
// 移除默认的分类描述过滤 remove_filter( 'category_description', 'wp_kses_data' ); // 自定义输出函数,按需处理内容 add_filter( 'category_description', 'custom_render_category_desc', 10, 1 ); function custom_render_category_desc( $description ) { // 如果你完全信任输入内容,可直接返回原描述 // 若要兼顾安全,可手动用wp_kses指定允许的标签: // return wp_kses( $description, array( // 'br' => array(), // 'a' => array( // 'href' => array(), // 'rel' => array(), // 'target' => array() // ) // ) ); return $description; }
⚠️ 注意:如果是多用户站点,不建议直接返回原描述,最好保留wp_kses的自定义规则,防止XSS攻击。
方法3:用自定义字段替代(适合复杂场景)
如果不想折腾代码过滤规则,也可以给分类添加自定义字段来存储带HTML的描述:
- 安装并启用Advanced Custom Fields插件(或自行开发自定义字段功能)
- 给分类添加一个「富文本编辑器」类型的自定义字段(比如命名为
custom_category_desc) - 在主题模板中调用这个字段输出内容:
<?php $custom_desc = get_field( 'custom_category_desc', 'category_' . get_queried_object_id() ); if ( $custom_desc ) { echo $custom_desc; } ?>
额外注意事项
- 所有代码建议放到子主题的
functions.php中,避免主题更新导致代码丢失 - 测试生效前,记得清理WordPress缓存和浏览器缓存
- 多用户站点一定要严格控制允许的标签,禁止开放
script、iframe等危险标签
内容的提问来源于stack exchange,提问作者user6573193
相关产品推荐
相关产品推荐

