事情本身不复杂,线索都在日志里。站点标题里带 R&D 字样,模板用 esc_html 输出后变成 R&D,搜索结果里显示成 R&D 或者干脆截断。全站 2000 多个页面都有这个问题,摘要里也跟着出现实体字符。

第一反应是「摘要和 og:title 用了不同的转义函数,结果不一致」,验证下来不成立。

原因不止一个,得分开看。标题被转义两次,输出成 &。少数情况下是数据库里存的已经是实体,模板又转义一遍。

还有一种情况,sitemap 里的 title 没转义,与页面不一致。

上来先看页面源码里标题被转义成什么

curl -s https://www.example.com/p/1 | grep -o '<title>[^<]*</title>'

再往下确认数据库里存的是原始字符还是实体

mysql -e "SELECT post_title FROM posts WHERE ID=1;" -N

随后统计出现双重转义的位置

curl -s https://www.example.com/p/1 | grep -c '&amp;amp;'

末了核对 sitemap 里的写法

curl -s https://www.example.com/sitemap.xml | grep -o '<title>[^<]*' | head -3

改完先别撤,确认这几项。页面源码里只剩一层实体,搜索结果的标题显示正常,不再出现截断。

容易忽略的是,转义只做一次,模板层统一处理,别在入库和输出两端各来一遍。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189