摘要:一个跑了十年的 WordPress 技术站,长期收录不理想。本文记录了一次完整的排查与优化过程:从蜘蛛被 500 拦截、robots.txt 自伤、title 被插件抢走,到广告拦截误报的定位。重点不在"改了多少文件",而在排查的思路顺序——大部分站点收录问题,都出在这几个地方。

适用环境:WordPress 6.x + PHP 8.x + 国内服务器

关键词:WordPress SEO、robots.txt、百度收录、IndexNow、title description、网站优化

先说结论:收录差,先别急着发外链

很多人一看收录少,第一反应是"多发外链、多更新文章"。

但如果你站上存在下面这几类问题,发再多文章也没用——蜘蛛根本没进来,或者进来了看到的是一个"坏掉的站"。

排查顺序应该是:

  1. 蜘蛛能不能正常访问(返回码对不对)
  2. robots.txt 有没有自己把自己拦了
  3. 搜索引擎看到的 title/description 是不是你填的那个
  4. 页面本身能不能正常渲染
  5. 最后才是推送和内容

下面按这个顺序讲。


一、蜘蛛访问返回 500,等于告诉搜索引擎"本站已挂"

这是最致命的一条,也是最容易忽略的。

很多老主题为了防采集,会写一个"空 User-Agent 就拒绝"的函数。想法没错,但返回码写成了 500。

问题在于:

  • 500 = 服务器内部错误
  • 搜索引擎蜘蛛大量使用空 UA 或非常规 UA 探测
  • 蜘蛛收到 500,会判定"这个站挂了",降低抓取频次甚至暂时放弃

正确做法:

  • 要拒绝就返回 403(明确表示"禁止访问",而不是"我坏了")
  • 同时给主流蜘蛛的 UA 加白名单,别一刀切

怎么自查:

curl -A "" -o /dev/null -w "%{http_code}\n" https://你的域名/
  • 返回 200 或 403 → 正常
  • 返回 500 → 🔴 立刻改,这是"没人来抓"的头号元凶

二、robots.txt 自己把自己拦了

第二常见的问题。

很多人为了让 robots.txt"看起来干净",会手动加一堆 Disallow。结果把不该拦的拦了:

被误拦的目录 后果
/wp-content/ CSS 和 JS 全部抓不到 → 搜索引擎看到的是一个没有样式的裸页面
图片目录 配图全部抓不到,图片搜索流量归零
/category/ 分类页不收录,内链结构失效
/page/ 分页不收录

这是典型的"自己给自己上锁"——你嫌它乱,它嫌你蠢。

正确做法:

除非你非常清楚每行在干什么,否则用 SEO 插件生成的默认 robots.txt,别手写。

真正该做的只有一件事:开启"屏蔽站内搜索结果页"(/?s=xxx 这类页面重复度高,确实该拦)。

自查:浏览器打开 https://你的域名/robots.txt,看看有没有上面那几行。有就删。


三、title 和 description 被插件抢走(最隐蔽的一条)

这是本次排查中价值最大的发现,也是最多人中招的一条。

现象:你在 SEO 插件里认真填了标题和描述,前台页面上也能看到,但搜索引擎显示的根本不是你填的那个。

原因:两个插件都在输出 <title>,后输出的覆盖了先输出的。

常见于:

  • SEO 插件(AIOSEO / Yoast / Rank Math)
  • 各种"优化加速"类插件(很多都自带 SEO 模块)
  • 主题自带的 SEO 功能

三者同时开启时,谁最后输出谁说了算,跟你填的内容无关。

怎么查:

打开一篇文章,右键 → 查看网页源代码,搜 <title。

看看这个 title 到底是谁写的:

来源特征 说明
后面带 - 站点名 且内容是你填的 ✅ SEO 插件在生效
内容是文章标题拼接、或者带插件名 ❌ 被别的插件抢了

解决办法:

SEO 输出只能保留一个来源。 去各插件的设置里把"SEO 功能/标题输出"关掉,只留你真正在用的那个 SEO 插件。

改完清缓存,再查一次源代码确认。

这一条改完,之前在 SEO 插件里填的所有标题才第一次真正生效。


四、jQuery 版本冲突导致页面交互报错

老主题配老插件,很容易被某个"jQuery 升级"类插件强制升到 4.x。

后果是主题里十年前写的 JS 直接报错:

Uncaught TypeError: ... zIndex ...

表现:轮播不动、Tab 切换失效、下拉菜单点不开。

搜索引擎会把"页面交互报错"作为质量负面信号,而且真实用户的跳出率会飙升。

解决:

  • 不要用插件强制升级 jQuery
  • 直接用 WordPress 核心自带的版本(目前是 3.7.x),兼容性最好

自查:F12 打开控制台,看有没有红色报错。有就先把这类插件停掉试试。


五、PHP 8 下的老代码兼容性

服务器升级到 PHP 8 后,很多 2015 年前后的老主题会出现问题。

最常见的三个:

问题 表现 修法
短标签 <? echo PHP 8 已移除 → 源码直接输出到页面 全部改成 <?php echo
废弃函数 get_bloginfo('url') 报废弃警告 改用 home_url()
未定义变量 PHP 8 直接报错(PHP 5 只是提示) 补判断或删除

自查:后台 → 工具 → 站点健康,看有没有 PHP 错误;或者直接看页面顶部有没有莫名其妙的输出。

短标签问题最危险——它会把你主题的 PHP 源码当作文本显示在页面上。


六、安全方面的两处清理

优化过程中顺手清了两处遗留隐患,这里只说结论,不展开细节:

  1. 开放重定向:主题里有个"外链跳转"函数,任何人都可以通过构造 URL 把访客送到任意站点。这类接口容易被利用做钓鱼跳转,搜索引擎也会判为低质量。→ 已改为直接输出真实链接 + nofollow noopener。

  2. 可执行任意代码的入口:某个小工具配置允许执行 PHP 代码。→ 已移除。

建议:老站点做一次全量扫描,重点看 functions.php 里有没有 eval(、base64_decode(、以及可传入 URL 的跳转函数。


七、推送通道:百度 和 IndexNow 是两套,别混

这块很多人搞混,单独说。

百度:不支持 IndexNow

百度有自己的主动推送 API,跟 IndexNow 完全无关。两条通道并行不冲突:

百度普通收录 IndexNow
推送对象 百度 Bing / Yandex / Naver 等
验证方式 token 根目录放密钥 txt 文件
单次条数 每日额度(新站很少) 最多 100 条

百度配额要注意

主动推送有配额,新站配额很少。 如果一次性批量推了几百上千条老文章,很可能把当前配额用光,导致之后发新文章反而推不动。

正确用法:

  • ✅ 只推新发布/新更新的文章
  • ❌ 不推已收录的老文章、附件页、标签页

去百度搜索资源平台看「剩余配额」,如果是 0,暂停一切推送等它恢复。

IndexNow 的两个坑

  1. 密钥 txt 文件必须留在根目录,删了推送全部返回 403
  2. 子域名算独立 host —— bbs.xxx.com 和 www.xxx.com 需要各自放一份密钥文件

服务端推送 优于 浏览器端 JS

百度有个"自动推送 JS",放在页面里靠访客触发。但它会被广告拦截/隐私插件拦掉,拦了就等于没装。

更靠谱的是服务端推送(PHP 直接调百度 API):不需要访客、不需要 JS 执行、不受任何拦截影响。


八、手机浏览器提示"已屏蔽 N 条广告"——大概率是误判

这是个很有意思的排查案例。

现象:用带广告过滤功能的手机浏览器(夸克、UC 等)打开站点,点任何链接都提示"已屏蔽 1 条广告",但站上确实一个广告都没有,服务器安全检查也全绿。

先给结论:不影响 SEO。 搜索引擎爬虫不跑广告过滤规则,它们抓的是原始 HTML,根本不知道浏览器拦了什么。

但访客会误会,值得排查。

排查思路

手机上只给你数字,不给理由。所以到电脑上查。

⚠️ 关键:不要用无痕模式测。 无痕模式默认禁用所有扩展,没人在检查,当然查不出问题。

正确做法:

  1. Chrome 装 uBlock Origin(正常模式)
  2. 设置 → 筛选器列表 → 勾选 EasyList China、CJX's Annoyance List、AdGuard Chinese(手机浏览器用的就是这几套中文规则)
  3. 打开 Logger(记录器),访问站点
  4. 红色划掉的行就是被拦的,会显示 URL 和命中的规则

本次的真实原因

最后定位到:页脚一个链接的地址里带了 #ad 三个字符。

<a href="/archives#ad">关于遇见</a>

中文过滤规则里有大量针对 ad、ads、-ad、#ad 的匹配规则,直接命中。

改法:#ad → #about,同时把目标元素的 id="ad" 也改成 id="about"(规则里 ###ad 是通用隐藏规则,光改 href 不改 id 没用)。

第二个:百度推送 JS

改完还剩 1 条,是 zz.bdstatic.com 的百度推送脚本——它不是广告,但被隐私类规则归到"追踪脚本"。

处理方式:直接删掉。因为服务端推送已经在正常工作,这个 JS 反而会被拦掉白挨一个提示。

一个参照系

同样的工具测某门户站点:18 条。

所以"被拦几条"是常态,不代表你站上有问题。判定标准应该是:有没有第三方追踪器、有没有真的广告位,而不是那个数字。


九、这次踩的三个坑(比技术细节更值钱)

坑一:改了一处,忘了查谁在用它

同一个错误犯了三次:

改了什么 连锁反应
合并了几个分类 首页九宫格是按分类 ID 硬编码取的 → 空了一格
id="small" 改成 class="small" 被 Bootstrap 的 .small{font-size:80%} 命中 → 字号缩水
没检查 CSS 引用就改结构 某个页面样式整段失效

教训:改任何 id / class / 分类 ID / 模板文件之前,先全局搜一遍谁在引用它。

# Windows
findstr /s /i /n /c:"关键词" *.php *.css *.js

坑二:别猜,让工具告诉你

这次定位一个"图片放大效果消失"的问题,连续猜了三次都错了。

最后靠三招一次命中:

  1. 全局搜索 —— 搜到效果来自 Hover.css 的 .hvr-grow
  2. 对比备份 —— fc 备份文件 当前文件 看差异
  3. F12 强制 hover —— Elements 面板点 :hov 勾 :hover,浏览器直接告诉你哪条规则在生效

猜是低效的,让工具说话。

坑三:先问"该不该做",再问"怎么做"

为了"让侧边栏少显示 4 行分类",折腾到要回滚数据库。

收益:少 4 行。代价:大量时间 + 首页出问题 + 要做 301 + 风险。

这个账怎么算都是亏的。

教训:动手之前先评估收益 / 代价比。分类多几行、少几行,访客根本不在意,搜索引擎更不会因此给你好脸色。


十、改完之后:等,别再动

做完上述优化,进入 2~8 周的观察期。

这段时间:

  • ✅ 正常更新内容
  • ✅ 观察百度/必应站长后台的抓取频次曲线
  • ❌ 不要再大改结构(robots、分类、固定链接、主题模板)

搜索引擎重新建立信任需要时间,频繁改动会让它"重新开始观察"。

重点观察这几个指标:

指标 在哪看 说明
抓取频次 百度资源平台 → 抓取诊断 应该逐步上升
抓取异常 同上 应该逐步下降
索引量 资源提交 → 已收录 关注新增

附:一份自查清单

如果你的站也收录不好,按这个顺序过一遍:

  • [ ] curl -A "" 测试,返回码是 200/403 而不是 500
  • [ ] robots.txt 没有拦 /wp-content/、图片目录、/category/
  • [ ] 网页源代码里的 <title> 确实是 SEO 插件输出的
  • [ ] F12 控制台没有 JS 报错
  • [ ] 没有 PHP 废弃函数警告和短标签
  • [ ] functions.php 里没有 eval( 和开放的跳转函数
  • [ ] 百度推送只推新文章,配额没被打光
  • [ ] IndexNow 密钥 txt 在根目录可访问(子域名另放一份)
  • [ ] 页面里没有 #ad、/ad、advert 这类会被误判的命名
  • [ ] 站点地图能正常访问

写在最后:这次最大的收获不是"改了多少行代码",而是排查顺序——

大部分收录问题不是"内容不够好",而是蜘蛛没进来、进来看到的是坏页面、或者看到的信息是错的。

把这三件事解决,比多写十篇文章管用。


本文为个人站点优化记录,环境为 WordPress + PHP 8,具体文件路径已省略,思路可直接套用。有类似问题的欢迎交流。