WordPress 技巧:为评论模块增加更多 HTML 标签支持

WordPress 原生的评论模块内容,支持使用 HTML 标签来增强评论内容的格式和效果。但是这肯定会带来一些安全隐患,特别是评论这种随便一个浏览者都可以提交数据的地方,容易产生跨站攻击(XSS),所以 WordPress 系统严格的限制了评论模块可以使用的 HTML 标签。默认的情况下,只支持:a、abbr、acronym、b、blockquote、cite、code、del、em、i、q、strike、strong 这几个标签和对应的相关属性。

这些标签肯定是远远不够用的,如果是技术博客,评论往往需要包含代码,那么可能就需要添加 pre 标签的支持,如果想要评论中可以引用图片,那么需要 img 标签的支持。本文就是来讲解如何在评论模块中增加更多 HTML 标签的支持。

WordPress 允许的标签和属性

WordPress 出于安全考虑,严格的限制了文章和评论等可编辑内容支持的 HTML 标签类型和标签的属性。具体的内容可以看:wp-includes/kses.php 这个文件,里面有两个全局数组变量 $allowedposttags 和 $allowedtags ,这两个数组变量就包含了允许的 HTML 标签,每个标签的键值又是一个数组,记录了这个标签常用的属性。例如:

$allowedtags = array(
	'a' => array(
		'href' => true,
		'title' => true,
	));

上面这个数组的含义就是支持 a 标签以及对应的 href、title 属性。

让 WordPress 评论支持更多标签的方法

思路很简单,先按照上面的格式,声明一个标签信息数组,然后 hook 勾到 WordPress 上面。例如想要增加 pre 标签的支持,先声明下面数组:

function allowedtags_pre() {
	global $allowedtags;
	$allowedtags['pre'] = array('class'=>true,);
}

这个函数的意思就是:先声明一下 $allowedtags 这个全局变量,然后下面就可以为这个全局变量增加一个新键值 pre,由于 pre 标签可能需要增加 class 属性,所以我们同时增加它的 pre 标签支持。下面 hook 一下,add_action 到 comment_post 就可以把刚刚修改的内容关联进 WordPress 了:

add_action('comment_post', 'allowedtags_pre');

这样,就相当于为 $allowedtags 新增加了 pre,把这两段代码放进主题目录下的 functions.php 文件中或者写成插件,然后就可以实现了。