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 的评论提交后标签保留,脚本标签仍被过滤。

作者 9823189