本文约 2,743 字,预计阅读 7 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:装上就不管了,可能是它早就没在工作
百度自动推送是一段几十行的 JavaScript,官方给的卖点是”页面被访问即推送,无需服务端配合”。很多站长把它复制进主题就再没看过,直到某天发现收录停滞,才开始怀疑它到底有没有工作。而它的失效往往非常隐蔽:脚本加载失败不会报错、被缓存插件合并后可能被丢掉、HTTPS 站点引用了 HTTP 地址会被浏览器直接拦截(混合内容)。这些情况下页面照常显示,推送却早已停止。本文讲清楚这段代码该放哪、怎么验证它在工作、以及最常见的几种静默失效。
原理分析:它到底推了什么
自动推送脚本由百度静态资源提供,加载后会读取当前页面的 location.href,向 http://data.zz.baidu.com/... 发起一次推送请求(早期版本为 push.zhanzhang.baidu.com/push.js,HTTPS 站点走 zz.bdstatic.com)。它的特点是”被动触发”——只有真实用户(或任何执行 JS 的客户端)访问页面时才会推送,蜘蛛访问不会触发。因此它的推送量与站点流量正相关:新站流量为零时,这条通道几乎不产出,这正是新站必须同时接 API 主动推送的原因。另外它只推送”被访问的页面”,长尾文章没人访问就永远不会被推,这是它的天然盲区,需要靠百度sitemap提交的多种方式来补。
保姆级实操
第一步:取代码
在百度搜索资源平台「资源提交 → 普通收录 → 自动推送」页面复制官方代码。
第二步:选择放置位置
官方建议放在页面底部 </body> 之前。WordPress 推荐挂到 wp_footer,而不是直接改 footer.php,因为子主题方案在主题更新后更安全:
// 子主题 functions.php
add_action( 'wp_footer', function () {
$bp = is_ssl() ? 'https://zz.bdstatic.com/linksubmit/push.js'
: 'http://push.zhanzhang.baidu.com/push.js';
echo '<script>(function(){var bp=document.createElement("script");'
. 'bp.src="' . esc_url( $bp ) . '";'
. 'var s=document.getElementsByTagName("script")[0];'
. 's.parentNode.insertBefore(bp,s);})();</script>';
}, 99 );
第三步:HTTPS 站点必须确认协议
全站 HTTPS 时只能用 https://zz.bdstatic.com/linksubmit/push.js。如果页面里出现 http://push.zhanzhang.baidu.com/push.js,现代浏览器会按混合内容策略直接阻断,控制台会显示 “Mixed Content” 警告。
第四步:用浏览器验证是否真的发出请求
打开任意文章页 → F12 → Network 面板 → 在筛选框输入 push,刷新页面,应该能看到两个请求:一是 push.js 脚本本身(状态 200),二是它发出的推送请求(通常是带 ?... 参数的 GET 请求)。两者都在,说明工作正常。
# 服务端侧验证:看百度是否收到(通常有数分钟延迟)
# 在资源平台 API 提交页的"提交记录"看不到自动推送,
# 改用日志确认蜘蛛是否因此变多
awk '{print $1}' /var/log/nginx/access.log | sort -u | wc -l
grep "Baiduspider" /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | tail -7
第五步:排查缓存插件影响
如果用了页面缓存(WP Rocket、W3 Total Cache 等),缓存的 HTML 里必须包含这段脚本。清一次缓存后用 curl 抓首页源码确认:
curl -s https://mimangfei.com/ | grep -o 'linksubmit/push.js'
# 有输出说明缓存页里带着脚本;无输出说明缓存版本丢失了脚本
第六步:与 API 推送并行
自动推送不能替代 API 主动推送,两者配额独立,建议同时开。
常见踩坑
- 复制的是网上流传的旧版代码:老代码里协议判断逻辑已过时,甚至有版本指向已废弃的域名,建议从资源平台现取。
- 被 JS 合并/延迟加载插件丢掉:部分优化插件会把动态插入的 script 剔除,表现为 Network 里完全看不到 push.js。
- HTTPS 页面引用 http 脚本:被浏览器阻断,Network 里显示为 blocked:mixed-content。
- 放在 header 里阻塞渲染:脚本本身是动态插入的,理论上不阻塞,但放进 header 会略微拖慢首屏,放 footer 更稳。
- 案例:某站点升级到全站 HTTPS 后收录量断崖下跌,排查发现主题的
header.php里硬编码了http://push.zhanzhang.baidu.com/push.js,浏览器直接拦截,等于这条通道关闭了半年。改成is_ssl()判断后推送量恢复。 - 用无头浏览器自检时误判:用 curl 抓源码是看不到推送请求的(因为 JS 未执行),必须用真实浏览器或 headless Chrome 验证。
- 登录态下看不到:部分站点对已登录用户输出不同 HTML,验证时要用隐身窗口。
总结
判断标准:在浏览器 Network 面板能同时看到 push.js 的加载请求与它发出的推送请求,且缓存后的 HTML 源码里能 grep 到脚本地址,才算真正生效。行动清单:从资源平台取最新代码 → 挂 wp_footer 而非硬编码 → HTTPS 用 zz.bdstatic.com → 清缓存后 curl 验证 → 隐身窗口看 Network → 与 API 主动推送并行开启。需要更可控的推送时机时,请看百度API主动推送PHP接入。
