事情本身不复杂,线索都在日志里。站点标题里带 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;'
末了核对 sitemap 里的写法
curl -s https://www.example.com/sitemap.xml | grep -o '<title>[^<]*' | head -3
改完先别撤,确认这几项。页面源码里只剩一层实体,搜索结果的标题显示正常,不再出现截断。
容易忽略的是,转义只做一次,模板层统一处理,别在入库和输出两端各来一遍。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
