本文约 3,223 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:发布成功不代表百度已经及时发现
WordPress 新文章可以通过站内链接和 XML 站点地图被发现,但对更新频繁或外链较少的网站,发现过程可能不够及时。百度搜索资源平台为已验证站点提供链接提交能力,其中普通收录 API 可接收 URL 列表。将它接入发布流程,可以在文章首次上线时主动通知百度,而不是依赖编辑手工复制地址。
自动推送最常见的问题不是 HTTP 请求不会写,而是触发时机和安全边界错误:保存草稿也推送、每次修订都重复提交、把令牌硬编码进公开仓库、忽略 API 返回内容,或提交了与验证站点不一致的域名。可靠实现应只在状态首次变为 publish 时运行,提交文章 canonical 对应的公开 URL,并记录不含敏感信息的结果。百度普通收录与站点地图区别
原理分析:WordPress 状态流转与百度接口响应
WordPress 的 save_post 会在自动保存、修订和多种更新场景触发,直接使用容易重复推送。transition_post_status 同时提供新旧状态,更适合判断“从非发布状态进入发布状态”。还应排除 revision、非公开文章类型和密码保护文章,避免提交用户无法正常访问的 URL。
百度普通收录接口常见形式为 http://data.zz.baidu.com/urls?site=站点&token=令牌,请求体是每行一个 URL,内容类型为 text/plain。成功响应通常包含 success 与 remain 等字段,错误响应包含错误信息。接口入口、配额和字段可能随百度搜索资源平台调整,部署时应以已验证站点后台当前提供的调用示例为准。
令牌本质上是提交凭据,不应出现在文章、前端脚本或 Git 仓库。可通过服务器环境变量注入,WordPress 端只读取,不在日志中打印完整请求地址。接口返回成功也只是“接收提交”,并不等于保证抓取、索引或排名。
保姆级实操
步骤一:确认站点一致。 在百度搜索资源平台验证正式域名,确定是 https、是否带 www,并确保 WordPress 的 home_url() 与验证站点一致。测试域名、预览地址和短链接不要提交。
步骤二:把令牌放入环境变量。 在主机面板、PHP-FPM 环境或安全配置中设置 BAIDU_PUSH_TOKEN。不要把真实令牌写入 wp-config.php 的公开示例,更不要提交到版本库。
步骤三:创建独立插件。 新建自用插件并先在测试站启用。以下实现仅在文章首次公开时推送,使用 WordPress 原生 HTTP API,响应只记录状态码、成功数和剩余额度。
<?php
/**
* Plugin Name: Mimangfei Baidu URL Push
*/
add_action('transition_post_status', function ($new_status, $old_status, $post): void {
if ($new_status !== 'publish' || $old_status === 'publish' || $post->post_type !== 'post') {
return;
}
if (wp_is_post_revision($post->ID) || post_password_required($post)) {
return;
}
$token = getenv('BAIDU_PUSH_TOKEN');
if (!$token) {
error_log('Baidu push skipped: BAIDU_PUSH_TOKEN is missing.');
return;
}
$site = home_url('/');
$endpoint = add_query_arg([
'site' => untrailingslashit($site),
'token' => $token,
], 'http://data.zz.baidu.com/urls');
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'text/plain'],
'body' => get_permalink($post),
'timeout' => 10,
]);
if (is_wp_error($response)) {
error_log('Baidu push request failed: ' . $response->get_error_message());
return;
}
$data = json_decode(wp_remote_retrieve_body($response), true);
error_log(sprintf(
'Baidu push HTTP %d, success=%d, remain=%d',
wp_remote_retrieve_response_code($response),
(int) ($data['success'] ?? 0),
(int) ($data['remain'] ?? 0)
));
}, 10, 3);
步骤四:测试完整链路。 发布一篇可公开访问的测试文章,确认日志中没有令牌,HTTP 状态正常,返回的 success 符合预期。随后用无痕窗口访问该 URL,检查不是 404、登录页或重定向链。WordPress 发布钩子调试
步骤五:增加幂等记录。 若编辑流程会反复撤回再发布,可在成功后写入文章元数据,例如记录最后成功提交时间;再次发布时根据业务规则跳过。不要因请求超时就假定百度未收到,也不要无限重试。
步骤六:监控而非承诺收录。 在百度搜索资源平台查看链接提交反馈、索引量和抓取异常。推送只改善发现机会,页面质量、服务器稳定、robots 与 canonical 仍会影响后续处理。
常见踩坑
- 把令牌直接写进主题
functions.php并上传公开仓库,造成凭据泄露。 - 使用
save_post却不排除自动保存与修订,短时间重复提交同一 URL。 - 提交
httpURL,但站点最终 301 到https,浪费配额并增加处理链路。 - 只判断 HTTP 200,不解析 JSON 中的错误或成功数量。
- 案例: 某站后台配置的是带
www域名,代码却用裸域名提交,接口持续返回站点不匹配。统一 WordPress 地址、验证站点与 canonical 后,提交才正常计数。 - 将 API 接收成功写成“秒收录”。提交、抓取、索引、排名是不同阶段。
- 在前端 JavaScript 调用接口。这样会暴露令牌,也可能被恶意消耗配额。
总结
WordPress 自动推送百度应做到四点:用 transition_post_status 精确捕获首次发布;从服务器环境变量读取令牌;只提交与验证站点一致的规范 URL;解析并记录不含敏感信息的响应。上线前先在测试站验证,再到百度搜索资源平台观察提交与索引趋势。自动化的目标是减少漏提和手工操作,而不是制造“推送即收录”的错误预期。百度收录失败系统排查
