add_filter('wp_kses_allowed_html', function($tags, $ctx){
if ($ctx !== 'comment') return $tags;
$tags['code'] = array('class' => true);
$tags['blockquote'] = array('cite' => true);
return $tags;
}, 10, 2);
读者在评论里贴了一段代码和一句引用,提交后只剩纯文字,标签连同内容一起消失,同一段内容放到正文里却完全正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,评论走的 wp_kses 白名单比正文窄,code、pre、blockquote 默认就不在允许列表里。kses 的删除会连标签一起处理,看着像内容被吃掉。主题若再叠一层 strip_tags,剩下的更少。
这次卡住的地方就在「评论 HTML 白名单」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
处理上按这个顺序:先用 wp_kses_allowed_html 取一份当前允许的标签,确认少了哪些;按需往 comment 的白名单里补标签,只补需要的,别整个换成 post 那套;保留属性白名单,class 和 href 可以留,style 和 on 开头的一律不要。
改完只确认一件事:带 code 和 blockquote 的评论提交后标签保留,脚本标签仍被过滤。
