摘要:一个跑了十年的 WordPress 技术站,长期收录不理想。本文记录了一次完整的排查与优化过程:从蜘蛛被 500 拦截、robots.txt 自伤、title 被插件抢走,到广告拦截误报的定位。重点不在"改了多少文件",而在排查的思路顺序——大部分站点收录问题,都出在这几个地方。
适用环境:WordPress 6.x + PHP 8.x + 国内服务器
关键词:WordPress SEO、robots.txt、百度收录、IndexNow、title description、网站优化
先说结论:收录差,先别急着发外链
很多人一看收录少,第一反应是"多发外链、多更新文章"。
但如果你站上存在下面这几类问题,发再多文章也没用——蜘蛛根本没进来,或者进来了看到的是一个"坏掉的站"。
排查顺序应该是:
- 蜘蛛能不能正常访问(返回码对不对)
- robots.txt 有没有自己把自己拦了
- 搜索引擎看到的 title/description 是不是你填的那个
- 页面本身能不能正常渲染
- 最后才是推送和内容
下面按这个顺序讲。
一、蜘蛛访问返回 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 源码当作文本显示在页面上。
六、安全方面的两处清理
优化过程中顺手清了两处遗留隐患,这里只说结论,不展开细节:
-
开放重定向:主题里有个"外链跳转"函数,任何人都可以通过构造 URL 把访客送到任意站点。这类接口容易被利用做钓鱼跳转,搜索引擎也会判为低质量。→ 已改为直接输出真实链接 +
nofollow noopener。 -
可执行任意代码的入口:某个小工具配置允许执行 PHP 代码。→ 已移除。
建议:老站点做一次全量扫描,重点看 functions.php 里有没有 eval(、base64_decode(、以及可传入 URL 的跳转函数。
七、推送通道:百度 和 IndexNow 是两套,别混
这块很多人搞混,单独说。
百度:不支持 IndexNow
百度有自己的主动推送 API,跟 IndexNow 完全无关。两条通道并行不冲突:
| 百度普通收录 | IndexNow | |
|---|---|---|
| 推送对象 | 百度 | Bing / Yandex / Naver 等 |
| 验证方式 | token | 根目录放密钥 txt 文件 |
| 单次条数 | 每日额度(新站很少) | 最多 100 条 |
百度配额要注意
主动推送有配额,新站配额很少。 如果一次性批量推了几百上千条老文章,很可能把当前配额用光,导致之后发新文章反而推不动。
正确用法:
- ✅ 只推新发布/新更新的文章
- ❌ 不推已收录的老文章、附件页、标签页
去百度搜索资源平台看「剩余配额」,如果是 0,暂停一切推送等它恢复。
IndexNow 的两个坑
- 密钥 txt 文件必须留在根目录,删了推送全部返回 403
- 子域名算独立 host ——
bbs.xxx.com和www.xxx.com需要各自放一份密钥文件
服务端推送 优于 浏览器端 JS
百度有个"自动推送 JS",放在页面里靠访客触发。但它会被广告拦截/隐私插件拦掉,拦了就等于没装。
更靠谱的是服务端推送(PHP 直接调百度 API):不需要访客、不需要 JS 执行、不受任何拦截影响。
八、手机浏览器提示"已屏蔽 N 条广告"——大概率是误判
这是个很有意思的排查案例。
现象:用带广告过滤功能的手机浏览器(夸克、UC 等)打开站点,点任何链接都提示"已屏蔽 1 条广告",但站上确实一个广告都没有,服务器安全检查也全绿。
先给结论:不影响 SEO。 搜索引擎爬虫不跑广告过滤规则,它们抓的是原始 HTML,根本不知道浏览器拦了什么。
但访客会误会,值得排查。
排查思路
手机上只给你数字,不给理由。所以到电脑上查。
⚠️ 关键:不要用无痕模式测。 无痕模式默认禁用所有扩展,没人在检查,当然查不出问题。
正确做法:
- Chrome 装 uBlock Origin(正常模式)
- 设置 → 筛选器列表 → 勾选 EasyList China、CJX's Annoyance List、AdGuard Chinese(手机浏览器用的就是这几套中文规则)
- 打开 Logger(记录器),访问站点
- 红色划掉的行就是被拦的,会显示 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
坑二:别猜,让工具告诉你
这次定位一个"图片放大效果消失"的问题,连续猜了三次都错了。
最后靠三招一次命中:
- 全局搜索 —— 搜到效果来自 Hover.css 的
.hvr-grow - 对比备份 ——
fc 备份文件 当前文件看差异 - 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,具体文件路径已省略,思路可直接套用。有类似问题的欢迎交流。