ツール・分析

IndexNow 実装ガイド 2026|Next.js / WordPress で公開即時 Bing 通知を仕組み化する 5 ステップ

2026-05-05更新 2026-05-0613分で読める
IndexNow 実装ガイド 2026|Next.js / WordPress で公開即時 Bing 通知を仕組み化する 5 ステップ
目次

IndexNow 実装ガイド 2026|Next.js / WordPress で公開即時 Bing 通知を仕組み化する 5 ステップ

この記事の結論(150 字以内) IndexNow は Bing / Yandex などにインデックス通知を即時送る API。Next.js は publish フック、WordPress はプラグインまたは functions.php で実装。laboz は実装後に Bing インデックス速度が分単位に短縮、Bing:Google 比 2.3:1 です。

結論:IndexNow 実装の 5 ステップ

  1. キー発行:英数字 8-128 文字のランダム文字列を生成
  2. キーファイル配置/{key}.txt をルートに配置(中身はキー)
  3. 公開フックで API 呼び出し:記事公開時に POST
  4. エラー処理:失敗時のリトライと通知
  5. 計測:Bing Webmaster Tools の URL Submission レポートで確認

IndexNow は Microsoft / Yandex が共同で立ち上げた軽量 API です。Bing / Yandex / Seznam / Naver の一部が対応しており、Google は非対応ですが、Bing 経由 organic を伸ばす運用では必須レベルの施策です。

計測方法(Bing Webmaster Tools)

URL Submission レポート

Bing Webmaster Tools → URL Submission で、IndexNow 経由で送信した URL 数と承認数が確認できます。1 日上限は 10,000 URL。

インデックス速度の比較

実装前後で「公開 → インデックス」の所要時間を比較。laboz では実装前 24-48 時間 → 実装後 5-30 分まで短縮されました。

Bing:Google 比率の変化

GA4 で Bing 流入セグメントを月次観測。IndexNow 実装と Bing 流入比率の伸びは強く相関する傾向があります。

実装手順(HowTo JSON-LD で記述)

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "Next.js / WordPress で IndexNow を実装する手順",
  "totalTime": "PT4H",
  "step": [
    { "@type": "HowToStep", "position": 1, "name": "キー発行", "text": "英数字 8-128 文字のランダム文字列を生成。UUID または crypto.randomBytes で生成可能。" },
    { "@type": "HowToStep", "position": 2, "name": "キーファイル配置", "text": "/public/{key}.txt(Next.js)またはルートディレクトリ(WordPress)に配置。中身はキー文字列のみ。" },
    { "@type": "HowToStep", "position": 3, "name": "公開フック実装", "text": "記事公開時に https://api.indexnow.org/IndexNow に POST する関数を実装。" },
    { "@type": "HowToStep", "position": 4, "name": "エラー処理", "text": "失敗時のリトライ(3 回 / 指数バックオフ)と Slack / Sentry 通知を実装。" },
    { "@type": "HowToStep", "position": 5, "name": "Bing Webmaster Tools で確認", "text": "URL Submission レポートで送信数と承認数を月次確認。" }
  ]
}

Next.js 15 (App Router) での実装例

// lib/indexnow.ts
const INDEXNOW_KEY = process.env.INDEXNOW_KEY!;
const HOST = 'laboz.jp';

export async function notifyIndexNow(urls: string[]): Promise<void> {
  if (!INDEXNOW_KEY || urls.length === 0) return;

  const payload = {
    host: HOST,
    key: INDEXNOW_KEY,
    keyLocation: `https://${HOST}/${INDEXNOW_KEY}.txt`,
    urlList: urls,
  };

  for (let attempt = 1; attempt <= 3; attempt++) {
    try {
      const res = await fetch('https://api.indexnow.org/IndexNow', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(payload),
      });
      if (res.ok || res.status === 202) return;
      throw new Error(`IndexNow ${res.status}`);
    } catch (err) {
      if (attempt === 3) {
        console.error('IndexNow failed', err);
        // Slack / Sentry 通知
      }
      await new Promise(r => setTimeout(r, 1000 * attempt));
    }
  }
}

公開フックでの呼び出し

// app/api/articles/publish/route.ts
import { NextResponse } from 'next/server';
import { notifyIndexNow } from '@/lib/indexnow';
import { publishArticle } from '@/lib/articles';

export async function POST(req: Request) {
  const { slug } = await req.json();
  await publishArticle(slug);
  // fire-and-forget で IndexNow 通知
  notifyIndexNow([`https://laboz.jp/column/${slug}`]).catch(() => {});
  return NextResponse.json({ ok: true });
}

キーファイル配置(Next.js)

/public/{INDEXNOW_KEY}.txt を作成し、中身はキー文字列のみ(改行・BOM なし)。

WordPress での実装例

// functions.php または mu-plugins/indexnow.php
add_action('publish_post', function($post_id) {
  $key = defined('INDEXNOW_KEY') ? INDEXNOW_KEY : '';
  if (!$key) return;

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

  wp_remote_post('https://api.indexnow.org/IndexNow', [
    'headers' => ['Content-Type' => 'application/json'],
    'body' => $payload,
    'timeout' => 5,
    'blocking' => false, // fire-and-forget
  ]);
});

エラー処理の設計

HTTP ステータス別対応

ステータス 意味 対応
200 成功 何もしない
202 受理(処理中) 成功扱い
400 パラメータ不正 キーや URL を確認、リトライしない
403 キー認証失敗 キーファイル配置を確認
422 URL 形式不正 URL を再生成してリトライしない
429 レート制限 指数バックオフでリトライ
500 系 サーバーエラー 指数バックオフでリトライ

リトライ戦略

3 回まで指数バックオフ(1 秒 → 2 秒 → 4 秒)。3 回失敗時は Slack / Sentry に通知し、手動再送のキューに積む設計が安全です。

ベストプラクティス

バッチ送信

複数記事を一度に公開する場合は urlList 配列にまとめて送信。1 リクエスト最大 10,000 URL。

重複送信の回避

同じ URL を 24 時間以内に再送するとレート制限に当たることがあります。Supabase などに送信履歴を保存して重複排除。

開発環境での無効化

process.env.NODE_ENV === 'development' のときは送信しない。dev URL が Bing にインデックスされると検索ノイズになります。

キーローテーション

漏洩が疑われる場合は新しいキーを生成し、古いキーファイルを削除して新キーファイルを配置。即時切り替え可能。

失敗パターン

失敗 1:キーファイルを配置していない

403 でリジェクトされ続けます。回避策: /public/{key}.txt を原則として配置。

失敗 2:公開フックが本番で動いていない

Vercel の環境変数 INDEXNOW_KEY が空のままなど。回避策: 公開後に Bing Webmaster Tools の URL Submission で確認。

失敗 3:開発環境からも送信している

dev URL が Bing にインデックスされる。回避策: NODE_ENV ガードを原則として入れる。

失敗 4:エラー処理が同期ブロッキング

公開 API がタイムアウトして UX が悪化。回避策: fire-and-forget または非同期キュー(BullMQ / Vercel Cron)で実装。

FAQ

Q1: IndexNow を実装すると Google にも効きますか?

Google は IndexNow に非対応です。Google には Search Console の URL Inspection / API を使います。両方を並行運用するのが推奨です。

Q2: IndexNow の上限は?

1 リクエスト 10,000 URL、1 日の総送信数の明示上限は公開されていません。同一 URL の 24 時間以内再送はレート制限に当たることがあります。

Q3: 削除した URL も通知すべきですか?

はい。削除後の URL を IndexNow に送ると 410 Gone を Bing が確認しに来てインデックスから外れます。/sitemap.xml の更新と合わせて運用。

Q4: WordPress プラグインで自動化できますか?

可能です。"IndexNow" という公式プラグインがあり、設定不要で動きます。functions.php で自前実装するより安全です。

Q5: キーは公開しても大丈夫ですか?

キーファイル URL は公開されますが、第三者が他サイトから自社の URL を IndexNow に送ることはできません(host と keyLocation の整合チェックがあります)。漏洩しても致命的ではありません。

関連記事

この課題を1人で抱え込まないために

ATKは、AIマーケティング部長として、記事設計、検索意図、内部リンク、CTA、月次改善レポートを継続的に整えます。まず現状を確認したい場合は、無料SEO / AIO診断で課題を棚卸ししてください。

Powered by ATK - labozはGXO Inc.が運営するマーケティング知見メディアです。