WordPress 自动推送 IndexNow 教程:发布文章自动通知 Bing/Yandex/Naver

IndexNow 是一个推送协议,一次提交 URL,同时通知 Bing、Yandex、Naver、Seznam 等多家海外搜索引擎来抓取你的新页面,不用每个站长平台单独提交。百度不支持 IndexNow,继续用百度自己的普通收录 API,两套并行不冲突。

一、IndexNow 支持哪些搜索引擎

搜索引擎 地区 支持情况
Bing 必应 全球 完全支持
Yandex 俄罗斯 完全支持
Naver 韩国 支持
Seznam 捷克 支持
Yep 全球 支持
Mojek 波兰 支持
百度 中国大陆 不支持

二、和百度推送的区别

对比项 百度普通收录 IndexNow
推送对象 百度 Bing / Yandex / Naver 等
接口地址 data.zz.baidu.com api.indexnow.org/indexnow
推送方式 POST text/plain POST application/json
所有权验证 不需要,用 token 需要在根目录放密钥文件
单次 URL 数 每日有额度 单次最多 100 条

三、第一步:放密钥验证文件

1. 生成密钥

去 indexnow.org 官网可以自动生成一个随机密钥,也可以自己写一段 8 到 128 位的字符串,只允许大小写字母、数字和横线。

比如:

a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6

2. 创建 txt 文件

在网站根目录新建一个 txt 文件,文件名就是密钥本身,例如:

a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6.txt

文件内容只写密钥,不要多空格、不要换行:

a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6

3. 验证文件能不能访问

浏览器打开你的密钥 txt 文件地址,必须满足:

  • 裸文本直接显示密钥
  • HTTP 状态码 200
  • 不能 404、不能 403、不能 301 跳转
  • 海外 IP 也能访问(国内能打开不代表海外 Bing 爬虫能打开)

几个容易踩的坑:

  • 密钥区分大小写,文件名大小写错一个字符就失败。
  • 文件编码必须是 UTF-8 无 BOM。
  • 文件内容不能有多余的换行和空格。
  • 国内服务器如果有安全软件或者防火墙拦截了海外 IP,搜索引擎后端访问不到这个 txt,会返回 403。

四、第二步:WordPress functions.php 自动推送

把下面代码加到当前主题的 functions.php 文件最末尾,实现发布或更新文章时自动推送,以后新增文章不用手动跑脚本。

<?php
/**
 * IndexNow 自动实时推送钩子
 * 功能:发布 / 更新已发布文章时,自动提交 URL 到 IndexNow
 * 触发:save_post,自动过滤自动草稿、修订、自动保存
 */
function custom_indexnow_auto_push( $post_id ) {
    // 跳过自动保存、修订版本
    if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) {
        return;
    }

    $post = get_post( $post_id );
    // 只处理已发布的文章 / 页面
    if ( ! $post || $post->post_status !== 'publish' ) {
        return;
    }

    // ===== 配置区(改成你自己的)=====
    $site_host    = '你的域名.com';
    $indexnow_key = '你的密钥';
    $key_location = 'https://你的域名.com/你的密钥.txt';
    // ==================================

    $post_url = get_permalink( $post_id );

    $payload = json_encode([
        'host'        => $site_host,
        'key'         => $indexnow_key,
        'keyLocation' => $key_location,
        'urlList'     => [ $post_url ],
    ], JSON_UNESCAPED_SLASHES);

    $args = [
        'headers' => [
            'Content-Type' => 'application/json; charset=utf-8',
        ],
        'body'    => $payload,
        'timeout' => 10,
        'method'  => 'POST',
    ];

    wp_remote_post( 'https://api.indexnow.org/indexnow', $args );

    // 如需推送结果邮件通知,取消下面注释
    // @wp_mail( '你的邮箱@xx.com', 'IndexNow 自动推送', 'URL: ' . $post_url );
}
add_action( 'save_post', 'custom_indexnow_auto_push' );

怎么用

  1. 复制上面代码,打开 WordPress 后台 → 外观 → 主题文件编辑器 → 找到 functions.php。
  2. 把代码粘贴到文件最末尾,保存。
  3. 修改配置区的域名、密钥、密钥文件地址。
  4. 发布一篇测试文章,看是否触发推送。

建议用子主题的 functions.php,避免主题升级覆盖掉你添加的代码。如果网站崩溃,直接删掉这段代码就能恢复。

五、批量推送存量文章脚本

自动推送只管新增和更新文章,存量历史文章需要用批量脚本一次性推送。新建一个 PHP 文件放到网站根目录,比如 push.php:

<?php
$host = "你的域名.com";
$key  = "你的密钥";
$keyLocation = "https://你的域名.com/你的密钥.txt";

// 要推送的 URL 列表,单次最多 100 条
$urlList = [
    "https://你的域名.com/post-1.html",
    "https://你的域名.com/post-2.html",
    "https://你的域名.com/post-3.html",
    // 继续加,不要超过 100 条
];

$postData = json_encode([
    "host"        => $host,
    "key"         => $key,
    "keyLocation" => $keyLocation,
    "urlList"     => $urlList,
], JSON_UNESCAPED_SLASHES);

$opts = [
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json; charset=utf-8\r\n",
        'content' => $postData,
        'timeout' => 30,
    ],
];
$context = stream_context_create($opts);
$result = file_get_contents('https://api.indexnow.org/indexnow', false, $context);
$responseHeaders = $http_response_header;

echo "推送数量:" . count($urlList) . " 条<br>";
echo "返回内容:" . var_export($result, true) . "<br>";
echo "<pre>响应头:";
print_r($responseHeaders);
echo "</pre>";
?>

浏览器访问 https://你的域名.com/push.php 即可提交。单次最多 100 条 URL,超过就分批。

六、接口返回码说明

HTTP 状态码 含义 排查方向
200 OK 提交成功 响应体为空是正常的
400 Bad Request 请求格式错误 JSON 格式不对、URL 非法
403 Forbidden 密钥校验失败 搜索引擎访问不到你的 txt 文件,或文件内容不对
422 Unprocessable Entity URL 域名不匹配 urlList 里的域名和 host 字段不一致
429 Too Many Requests 请求过多 频率太高,隔几分钟再试

提交成功的标志是 HTTP 200,响应体 Content-Length 为 0,这是正常现象,不是报错。

七、常见问题排查

1. 访问密钥 txt 返回 404

  • 检查文件名是否和密钥完全一致(大小写敏感)。
  • 检查文件是否在网站根目录。
  • 检查伪静态规则是否拦截了 txt 文件。

2. 提交返回 403

  • 国内浏览器能打开 txt,但海外 Bing 爬虫打不开。
  • 检查服务器防火墙或安全组是否限制了海外 IP。
  • 检查 CDN 或安全防护是否拦截了海外请求。

3. 提交返回 400

  • JSON 格式错误,少括号或者引号没闭合。
  • urlList 为空。
  • URL 里带了多余的标记,要填纯 URL。

4. PHP 脚本访问报 500

  • 检查 php.ini 的 allow_url_fopen 是否开启,必须是 On。
  • 检查 disable_functions 是否禁用了 file_get_contents。
  • 看 PHP 错误日志定位。

5. 脚本返回空、没有响应头

  • 服务器出站网络无法访问 api.indexnow.org,国内服务器比较常见。
  • 可以尝试用 CDN 或者海外中转服务器跑脚本。

八、注意事项

  1. 单次最多提交 100 条 URL,超过就分批。
  2. 不要反复推送未修改的旧 URL,不会加速收录,反而可能被判定为垃圾提交。
  3. 批量推送脚本用完就删,不要长期留在公网,防止别人恶意调用触发 429 限流。
  4. 如果必须保留脚本,加访问密码,只允许自己访问。
  5. IndexNow 只推海外搜索引擎,百度继续用自己的普通收录 API,两套并行。
  6. 提交成功只是通知搜索引擎来抓取,不等于立刻收录,收录还要看页面质量和网站权重。

九、快速上手清单

  • 生成密钥,根目录放密钥 txt 文件
  • 浏览器访问 txt 文件,确认返回 200、裸文本显示密钥
  • 确认海外 IP 也能访问这个 txt
  • 把 functions.php 钩子加到主题文件末尾
  • 修改钩子代码里的域名和密钥
  • 发布一篇测试文章,验证自动推送是否生效
  • 用批量脚本把存量文章分批推送一次
  • 用完删除批量脚本
  • 百度继续用原来的推送方式,互不影响

发布日期:

所属分类: 网站运营 SEO 标签: