记录一下那天晚上的排查过程。产品页摘要里写 R&D 部门,前台源码输出成 R&D,搜索结果显示成 R&D 并被提前截断。试过在 SEO 插件里重写摘要,保存后实体又出现。

刚开始盯着「摘要长度按实体字符串计算,实际可用字数被压缩」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。入库时已经转义一次,模板输出时又转义一次,形成双重实体。少数情况下是用了 esc_html 包裹已经转义的字段。

还有一种情况,部分摘要来自自动截取正文,正文里本身带实体。

上来先看 head 里的原始输出

curl -s https://www.example.com/product/1/ | grep -o '<meta name="description"[^>]*>'

接着确认数据库里存的是哪种形式

wp db query "SELECT ID,post_excerpt FROM wp_posts WHERE post_excerpt LIKE '%&amp;%' LIMIT 5;"

然后输出时只转义一次

echo '<meta name="description" content="' . esc_attr(html_entity_decode($desc)) . '">';

末了清理已入库的双重实体

wp search-replace '&amp;amp;' '&amp;' --all-tables

怎么算真的好了,看的是同一批现象。摘要里的实体恢复成单个 &,搜索结果完整显示到句末,长度统计也回到真实字数。

这里还有个坑。实体问题肉眼很难发现,抓一次源码对比数据库就能定位,别在插件设置里反复试。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189