一篇标题带 & 的文章发布后,整个 feed 打不开,浏览器报 entity not defined,把那篇文章下线就恢复。日志里能对上时间点,这种反而好排。

标题直接拼进 XML,& 被当成实体开头,后面没有分号闭合就报错。尖括号和引号同样会破坏结构。CDATA 里虽然宽松,但结束符一旦出现照样断。这一点先确认清楚,后面就不用反复试。

echo '<title>' . esc_html(get_the_title()) . '</title>';
$safe = str_replace(']]>', ']]]]><![CDATA[>', $content);
echo '<description><![CDATA[' . $safe . ']]></description>';

「feed 特殊字符转义」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

处理上按这个顺序:输出前统一用 esc_html 转义,别直接输出字段值;含特殊字符的正文整段放进 CDATA,并处理结束符的拆写;改完用 xmllint 校验,把标题里带符号的文章都过一遍。

结果对不对很好判断,带 & 和尖括号的标题在订阅器里原样显示,feed 校验不再报错。

作者 9823189