搜索全站
百度SEO 9 分钟阅读

WordPress 发布文章自动推送百度:API 代码完整实现

使用 WordPress 的 transition_post_status 钩子和百度搜索资源平台普通收录 API,在文章首次发布时提交规范 URL,包含环境变量保存令牌、响应字段记录、重复推送控制和失败排查,避免把敏感信息写进主题或日志。

U
UFO_PF 2016-09-14 · 阅读 9 分钟
Wo 百度SEO
阅读提示
本文约 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 仍会影响后续处理。

常见踩坑

  1. 把令牌直接写进主题 functions.php 并上传公开仓库,造成凭据泄露。
  2. 使用 save_post 却不排除自动保存与修订,短时间重复提交同一 URL。
  3. 提交 http URL,但站点最终 301 到 https,浪费配额并增加处理链路。
  4. 只判断 HTTP 200,不解析 JSON 中的错误或成功数量。
  5. 案例: 某站后台配置的是带 www 域名,代码却用裸域名提交,接口持续返回站点不匹配。统一 WordPress 地址、验证站点与 canonical 后,提交才正常计数。
  6. 将 API 接收成功写成“秒收录”。提交、抓取、索引、排名是不同阶段。
  7. 在前端 JavaScript 调用接口。这样会暴露令牌,也可能被恶意消耗配额。

总结

WordPress 自动推送百度应做到四点:用 transition_post_status 精确捕获首次发布;从服务器环境变量读取令牌;只提交与验证站点一致的规范 URL;解析并记录不含敏感信息的响应。上线前先在测试站验证,再到百度搜索资源平台观察提交与索引趋势。自动化的目标是减少漏提和手工操作,而不是制造“推送即收录”的错误预期。百度收录失败系统排查

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。