WordPress 实时推送搜索引擎完整方案:百度主动推送 + Bing IndexNow + Google 限制与异步队列

WordPress 发文后想让百度 / Bing / Google 第一时间收录?网传 publish_post 挂 curl 推百度的代码在 2026 年有 token 泄漏 / curl 卡死 / 漏更新 / 不识失败原因等多个坑。本文从百度主动推送 API 演化讲起,给出含超时 + 错误处理 + 配额监控的现代代码、Bing IndexNow 零配置接入、Google Indexing API 只限 JobPosting 的真相、避免阻塞编辑器的异步队列做法、cron 兜底批量推送与 FAQ。

张文保 更新 30 分钟阅读 1,273 阅读

WordPress 站点发完文章希望搜索引擎第一时间收录——百度提供"主动推送"接口,能让 URL 直接进入抓取队列,不用等爬虫自然发现。但网传的"挂 publish_post hook 调 curl 推百度"的代码在 2026 年有几个绕不过去的问题:百度推送 API 域名已迁移、curl 没设超时会卡住编辑器、单次只支持 ≤ 2000 条 URL、没区分新发 vs 更新、Bing IndexNow 和 Google Indexing API 的新机会被完全忽略。

这一篇把"WordPress 实时推送给搜索引擎"这件事重新讲透:百度推送 API 的现代用法(含失败重试、配额监控)、Bing IndexNow 的零配置接入、Google Indexing API 的限制与替代、避免 publish_post 阻塞用户编辑的异步队列做法、推送有效性验证方法、Cron 兜底批量推送等。

百度主动推送:API 演化与正确域名

百度链接提交在 2010-2024 年间经历过几次接口变化。2026 年的标准做法:

接口状态用途API endpoint
主动推送 (PUSH)当前主流实时新链接http://data.zz.baidu.com/urls
HTTPS 主动推送2022 年起推出同上但 HTTPShttps://data.zz.baidu.com/urls
快速收录已迁移到 ziyuan.baidu.com移动端高优先级需站长平台开通权限
Sitemap 提交当前主流批量历史链接站长平台 → Sitemap
API 提交(旧接口)已下线2018 年前的旧版不要再用

原帖代码 http://data.zz.baidu.com/urls 仍然能用,但建议改用 HTTPS 版本——百度逐步在 deprecated HTTP 推送,2026 年下半年可能完全切到 HTTPS。token 在站长平台 → 链接提交 → 主动推送 → 接口调用地址。每个站点 token 不一样,泄漏会被别人冒名推送。

现代化代码:含超时 + 错误处理 + 配额监控

// 推荐放 wp-content/mu-plugins/baidu-push.php,比 functions.php 更稳
if (!function_exists('baidu_push_url')) {
    function baidu_push_url($post_ID) {
        // 已推送过不再推
        if (get_post_meta($post_ID, '_baidu_pushed', true) == 1) return;

        $post = get_post($post_ID);
        if ($post->post_status !== 'publish') return;
        if ($post->post_type !== 'post' && $post->post_type !== 'page') return;

        $site  = 'yoursite.com';
        $token = '【你的 token】';   // 站长平台拿
        $url   = get_permalink($post_ID);
        $api   = "https://data.zz.baidu.com/urls?site=" . urlencode($site) . "&token=" . urlencode($token);

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL            => $api,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $url,
            CURLOPT_HTTPHEADER     => ['Content-Type: text/plain'],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 5,           // 5 秒超时,绝不卡编辑器
            CURLOPT_CONNECTTIMEOUT => 3,
        ]);
        $raw = curl_exec($ch);
        $err = curl_error($ch);
        curl_close($ch);

        if ($err) {
            error_log("[BaiduPush] curl 错误: $err  url=$url");
            return;
        }

        $result = json_decode($raw, true);
        if (!is_array($result)) {
            error_log("[BaiduPush] 响应非 JSON: $raw");
            return;
        }

        // 关注几个关键字段
        if (isset($result['success']) && $result['success'] > 0) {
            update_post_meta($post_ID, '_baidu_pushed', 1);
            update_post_meta($post_ID, '_baidu_pushed_at', time());
            error_log("[BaiduPush] OK url=$url remain=" . ($result['remain'] ?? '?'));
        } else {
            // 失败原因细分
            $reason = '';
            if (isset($result['not_same_site'])) $reason .= '域名不匹配 ';
            if (isset($result['not_valid']))      $reason .= 'URL 非法 ';
            if (isset($result['error']))          $reason .= '错误码 ' . $result['error'];
            error_log("[BaiduPush] FAIL url=$url reason=$reason raw=$raw");
        }

        // 配额警报:剩余 < 100 时记录,方便扩容
        if (isset($result['remain']) && $result['remain'] < 100) {
            error_log("[BaiduPush] WARN 配额告急 remain={$result['remain']}");
        }
    }
    add_action('publish_post', 'baidu_push_url', 10, 1);
    add_action('publish_page', 'baidu_push_url', 10, 1);

    // 文章更新时也推(更新过的内容百度会重新评估)
    add_action('post_updated', function ($post_ID, $post_after, $post_before) {
        if ($post_after->post_status === 'publish' && $post_before->post_status === 'publish') {
            // 已发布的更新,重置推送状态强制再推
            delete_post_meta($post_ID, '_baidu_pushed');
            baidu_push_url($post_ID);
        }
    }, 10, 3);
}

关键改进:

  • 5 秒 timeout:绝对不能让百度网络抖动卡住编辑器。原帖代码无超时,百度某次响应慢 30 秒,编辑器就卡 30 秒。
  • HTTPS 接口:迁到 https://data.zz.baidu.com。
  • 配额监控:响应里的 remain 字段是当日剩余配额,< 100 时告警。
  • 多种失败原因细分:not_same_site(域名不匹配)/ not_valid(URL 非法)/ error(系统错误)分别 log,便于排查。
  • 更新文章也推:post_updated hook 处理"已发布文章再编辑后保存"——百度会按"更新过的内容"重新评估排名。
  • 用 update_post_meta 而不是 add_post_meta:原帖用 add 会导致同一 post 多个 meta 行,update 才是 upsert 语义。

避免阻塞用户编辑:异步推送

publish_post hook 是同步执行的——文章保存按钮按下后,PHP 必须等 hook 全部完成才返回响应给浏览器。即使加了 5 秒 timeout,用户偶尔还是会感觉到"保存按钮卡了一下"。生产环境最稳的做法是异步:

用 wp_schedule_single_event 延迟执行

add_action('publish_post', function ($post_ID) {
    // 延迟 5 秒后执行推送,不阻塞编辑器
    wp_schedule_single_event(time() + 5, 'mysite_baidu_push', [$post_ID]);
});

add_action('mysite_baidu_push', 'baidu_push_url', 10, 1);

这个用 WordPress 自带的 cron 系统延迟跑——但 WP-Cron 是"模拟 cron",需要有人访问网站才触发。低流量站可能延迟更久。

fastcgi_finish_request 立即断连

add_action('publish_post', function ($post_ID) use_existing {
    // 推送代码放到 shutdown hook,等 PHP 响应已发出后再执行
    add_action('shutdown', function () use ($post_ID) {
        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();   // 断 HTTP 连接
        }
        baidu_push_url($post_ID);       // 用户已看到保存成功,后台慢慢推
    });
});

这种方式用户体感"保存秒成",推送在后台异步走。

真正的队列:Redis + worker

对中大型站,用 Redis 队列分离:

// 入队
add_action('publish_post', function ($post_ID) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->lPush('baidu_push_queue', $post_ID);
    $redis->close();
});

// 后台 worker 出队(独立 PHP 进程,supervisord 守护)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
while (true) {
    $task = $redis->brPop(['baidu_push_queue'], 30);
    if (!$task) continue;
    $post_ID = (int)$task[1];
    baidu_push_url($post_ID);
}

这种架构的好处:① 编辑器零阻塞;② worker 失败可重试;③ 配额满时可暂停 worker 等次日再跑。

Bing IndexNow:零配置接入

Bing 在 2021 年推出 IndexNow 协议(Yandex 也加入),让站长可以直接 ping 一个端点告知"这个 URL 有更新"。比百度推送简单得多——不需要登录后台拿 token,只要在站点根放一个 verification 文件证明域名归你即可。

接入步骤

  1. 生成一个 32 位随机字符串作为 key(比如 e7d8f9a1b2c3...,UUID 也行);
  2. 把它放到站点根:https://yoursite.com/<key>.txt(文件内容就是 key 自身);
  3. POST https://api.indexnow.org/indexnow 推送 URL 即可。

WordPress 集成代码

function indexnow_push($post_ID) {
    if (get_post_meta($post_ID, '_indexnow_pushed', true) == 1) return;

    $key = 'e7d8f9a1b2c3d4e5f6a7b8c9d0e1f2a3';   // 你的 IndexNow key
    $host = parse_url(home_url(), PHP_URL_HOST);
    $url = get_permalink($post_ID);

    $payload = json_encode([
        'host'        => $host,
        'key'         => $key,
        'keyLocation' => "https://{$host}/{$key}.txt",
        'urlList'     => [$url],
    ]);

    $ch = curl_init('https://api.indexnow.org/indexnow');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $payload,
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 5,
    ]);
    $resp = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($code === 200 || $code === 202) {
        update_post_meta($post_ID, '_indexnow_pushed', 1);
    } else {
        error_log("[IndexNow] FAIL code=$code resp=$resp");
    }
}
add_action('publish_post', 'indexnow_push', 11);

IndexNow 的真实效果

实测(中型 WordPress 站):

  • Bing:推送后平均 30 分钟到 4 小时被抓取,1-3 天进入索引;
  • Yandex:3-12 小时内抓取;
  • Naver / Seznam:也加入了 IndexNow,对应市场(韩国 / 捷克)的曝光受益。

IndexNow 不能用于 Google——Google 至今没有接入 IndexNow 协议,Google 推送要走它自己的 Indexing API(见 §4)。

Google Indexing API:限制与替代方案

Google 有 Indexing API 但限制非常严——官方明确说仅限以下内容类型

  • JobPosting(招聘信息)
  • BroadcastEvent(直播流嵌入 VideoObject 的)

普通博客文章、产品页、新闻文章都不在支持范围。即便代码上能调通,提交也会被忽略,长期使用甚至可能触发账号警告。

Google 普通内容的推送替代

三条路径:

  1. Google Search Console URL Inspection 工具:每个 URL 手动提交"请求编入索引"。每天有限额(约 10-15 个 URL),适合最重要的页面。
  2. Sitemap 自动 ping:每次更新 sitemap.xml 后调 https://google.com/ping?sitemap=https://yoursite.com/sitemap.xml。Google 会重读 sitemap 并发现新 URL。
  3. 提升网站整体内链密度:新文章在首页 / 分类页有强内链,Googlebot 自然抓得快。

sitemap ping 的代码

add_action('publish_post', function () {
    $sitemap_url = home_url('/sitemap.xml');
    wp_remote_get('https://www.google.com/ping?sitemap=' . urlencode($sitemap_url), [
        'timeout' => 5,
        'blocking' => false,   // 不等响应直接返回
    ]);
}, 12);

注意 2026 年 Google 已经正式弃用 sitemap ping 端点——他们的 Search Central 博客建议直接用 Search Console 的 sitemap 提交。所以这条 ping 只对 Bing / Yandex 有效,Google 部分需要靠 sitemap 在站长平台预先提交。

推送有效性验证

推完之后怎么确认搜索引擎真的收到了?

百度

登录百度站长平台 → 资源提交 → 主动推送(推送记录)。能看到当天提交的总数 + 成功数 + 失败数。如果数字对得上,推送链路 OK。

Bing

登录 Bing Webmaster Tools → URL Inspection → 输入推送过的 URL,看抓取状态。

站点级日志

看自家服务器日志,搜索引擎爬虫的 UA 出现频率(百度的 Baiduspider、Bing 的 bingbot):

tail -10000 /var/log/nginx/access.log | grep -E "Baiduspider|bingbot" | wc -l
# 推送前后对比,活跃数应明显上升

配额管理:每日推送上限

搜索引擎每日配额怎么提升
百度普通主动推送10 万条/日(默认)站长平台申请提升,需站点权重
百度快速收录需开通,配额另算站长平台 → 开通"快速收录"权限
Bing IndexNow10K 条/日(建议)无明确硬上限,过量会被节流
Yandex IndexNow同上同上
Google Indexing API200 条/日(仅 JobPosting)普通内容用不了

百度的 10 万条/日对绝大多数博客够用——日均发 1-10 篇文章 + 历史文章一次性补推,远不到上限。但电商 / UGC 站点动辄日新增几千上万 URL,要开通"快速收录"额外通道。

cron 兜底批量推送

publish_post hook 触发的实时推送可能漏(网络抖动、配额满)。建议加一个 cron 每日扫一遍"未推送过"的文章批量补推:

// 注册每日 cron
register_activation_hook(__FILE__, function () {
    if (!wp_next_scheduled('mysite_daily_push_backfill')) {
        wp_schedule_event(strtotime('tomorrow 03:00'), 'daily', 'mysite_daily_push_backfill');
    }
});

add_action('mysite_daily_push_backfill', function () {
    global $wpdb;
    $posts = $wpdb->get_col("
        SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->postmeta} m ON m.post_id = p.ID AND m.meta_key = '_baidu_pushed'
        WHERE p.post_status = 'publish'
        AND p.post_type IN ('post','page')
        AND m.meta_id IS NULL
        ORDER BY p.post_date ASC
        LIMIT 500   -- 一次最多补推 500 条
    ");
    foreach ($posts as $id) {
        baidu_push_url($id);
        usleep(200000);   // 200ms 间隔避免限流
    }
});

设凌晨 3 点跑,避开用户活跃高峰,且配额是按整日重置,这时候用最划算。

推送 vs sitemap:什么时候选哪个

两种机制各有优势:

维度主动推送Sitemap
实时性秒级小时-天级
配额有上限无上限
覆盖率新增/更新都需要单独触发一次性全量
失败回溯需要 cron 兜底站长平台显示完整结果

实战建议:两者都做。新发文章靠主动推送抢实时,sitemap 兜底全量覆盖(包括内部链接修改、TDK 调整等不触发 publish_post 但搜索引擎需要重新抓取的情况)。

不该推送的页面类型

原帖列了几条标准建议,2026 年补充几条:

  • 分页页(?paged=2、/page/3/):搜索引擎能自己沿着分类页发现,主动推会浪费配额。
  • 带 noindex meta 的页面:推过去也不索引,纯浪费。
  • 登录态页面 / 后台 URL:有 paywall / 需要 cookie 才能看的内容,搜索引擎抓到也是拒绝页。
  • 自动生成的标签页 / 作者页:内容一般跟首页相似,重复度高,谨慎推。
  • WP REST API 端点(/wp-json/...):这是 API 不是内容页面,不要推。

主动推送只推"高质量、原创、新增"内容是核心原则。

常见问题解答

百度推送返回 success 但搜索 site:yoursite.com 看不到,是怎么回事?

推送成功 ≠ 立即收录。百度推送只是把 URL 放进抓取队列——后续是否抓取、是否索引,由百度自己的算法决定。新站、低权重站、重复内容多的站点可能推了很久也不收录。建议结合内容质量优化(原创度、字数、外链等)综合处理。

token 泄漏被别人冒名推送怎么办?

立刻到百度站长平台 → 链接提交 → 主动推送 → "重置 token"。新 token 立刻生效,旧 token 失效。所有调用代码同步更新。如果是大量恶意推送已造成排名波动,写工单给百度反馈。

怎么验证 IndexNow key 文件配对是否正确?

访问 https://yoursite.com/<your-key>.txt,浏览器应能直接看到 key 字符串(应跟你 POST 提交时的 key 字段完全一致)。如果 404 或返回 HTML 而不是纯文本,配对失败,IndexNow 会拒推送。文件内容必须只有 key 字符串本身(无换行、无 BOM、无其它字符)。

publish_post hook 同时运行了百度和 IndexNow,编辑器卡 10 秒怎么办?

多个推送串行同步执行就会累计。三种解法:① 用 §2.2 的 fastcgi_finish_request 让所有推送都在断连后跑;② 把多个推送合并到一个 wp_remote_get 多线程实现(curl_multi_init);③ 上 Redis 队列彻底异步,编辑器零等待。

Google Indexing API 说能用,但实际推普通博客文章为什么不索引?

Google 官方政策:Indexing API 仅限 JobPosting 和 BroadcastEvent 两种 schema 类型的内容。其它类型即使 API 调用 200 OK,也不会被索引——后台静默忽略。这条限制 2022 年起明确公布。普通博客文章别再走 Indexing API,去 Search Console 用 URL Inspection 手动提交。

主动推送对 Google 排名有帮助吗?

没有直接帮助——百度的主动推送只对百度生效,跟 Google 排名无关。Google 排名靠:① Sitemap 提交 + Search Console 验证;② 高质量外链;③ 站内技术 SEO(速度 / 移动友好 / Schema);④ 持续高质量内容。这些做好后,Googlebot 抓取和索引速度自然就快。

已发布老文章怎么补推到百度?

用文中第七节的 cron 兜底脚本,扫描没有 _baidu_pushed meta 的文章批量补推。如果想一次性全量推(比如新站迁移),可写一次性脚本:扫所有 publish post,按发布日期倒序,每批 500 条 + 200ms 间隔。配额够的话一两天能推完几千篇。

推送了 URL 后能撤销吗?

百度推送不能撤销——一旦提交 URL 就在百度抓取队列里。但你可以:① 给该 URL 加 noindex meta;② robots.txt 屏蔽该 URL 路径;③ 如果是错误内容,删除该 URL 让百度抓 404,自然从索引中淘汰。Bing IndexNow 也无撤销机制,同样靠 noindex / 404 让其自然淘汰。

同一个 URL 反复推送会被惩罚吗?

不会被惩罚,但消耗配额。百度官方建议同一 URL 不要在 24 小时内重复推超过 3 次。频繁重复推也不会让搜索引擎更早收录——抓取队列里第 5 次推和第 1 次推是同一个 URL,不会跳到队首。代码里用 _baidu_pushed meta 标记已推送、24 小时内不重推是常见做法。

移动 App / 小程序内容也能推送吗?

移动 App 是 Activity 不是 URL,不能直接推。微信小程序、App 内 H5 页面可以单独配置 deep link 后推它们对应的 https URL。原生 App 内容的推送要走百度的"小程序推送 API"或"应用搜索 API",工作流跟 Web 完全不同。

分享到
标签
版权声明

本文标题:《WordPress 实时推送搜索引擎完整方案:百度主动推送 + Bing IndexNow + Google 限制与异步队列》

本文链接:https://zhangwenbao.com/wordpress-baidu-active-push.html

版权声明:本文原创,转载请注明出处和链接。许可协议: CC BY-NC-SA 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交