现场是这样的。标签聚合页的 lastmod 取的是全站最新文章的发布时间,每天都有变化,蜘蛛天天来抓,页面内容其实一周都没变过。
中间走过弯路,把「聚合页本身有随机推荐位,每次抓取 HTML 都不同」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。模板把聚合页的修改时间绑定到了最新文章;sitemap 的 lastmod 直接输出了当前时间;缓存没有生效,页面每次都是实时渲染。
动手时先对比聚合页两次抓取的正文
curl -s https://www.example.com/tag/seo/ | md5sum; sleep 5; curl -s https://www.example.com/tag/seo/ | md5sum
随后看 sitemap 里的 lastmod 分布
curl -s https://www.example.com/sitemap.xml | grep -o '<lastmod>[^<]*' | sort | uniq -c | sort -rn | head
接着把聚合页时间改成实际内容更新时间
add_filter('wp_sitemaps_posts_entry', fn($e,$p) => ['lastmod' => get_last_post_time_in_tag($p)] + $e, 10, 2);
去掉随机推荐并开启页面缓存
add_filter('widget_posts_args', fn($a) => ['orderby' => 'date'] + $a);
恢复的判定其实很直接。聚合页的 lastmod 一周只变一次,抓取频次回落到合理水平,抓取预算重新分给文章页。
更新时间是最强的抓取信号,跟着无关内容一起变,等于每天给蜘蛛发一次假通知。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
