AdSense設定で最も起きやすい事故は、アカウントを表すIDと広告ユニットを表すIDを同じものとして扱うことです。本稿では、Google公式資料を基準に、このブログの現在の実装へ値を対応させます。設定が正しくても、サイト審査の完了や個々の広告リクエストの配信(fill)、収益は保証されません。
一つのpublisher identityと配置ごとに異なる複数の広告slotを対応付ける構成*図: サイトとアカウントを示すpublisher IDは共有し、広告unitを示すslot IDは配置ごとに分ける。*
まず3種類の値を分ける
- publisher ID はAdSenseアカウント固有の
pub-… 形式です。広告コードでは同じ識別子が ca-pub-… として、スクリプトURLや data-ad-client に現れます。Google公式の「アカウント情報」または生成済み広告コードを正本にします。 - 広告ユニットID は生成コードの
data-ad-slot に入る数値です。このブログでは便宜上「slot ID」と呼びます。管理画面のURLから推測するのではなく、AdSenseの「広告」→「広告ユニットごと」でユニットを作り、「コードを取得」に表示された値を転記します。 - ads.txtのseller行 はルートの
/ads.txt に置く公開情報です。AdSenseから提示された行を使い、publisher IDは pub-… 形式にします。slot IDはads.txtには書きません。
記事や共有ログでは ca-pub-xxxxxxxxxxxxxxxx と <numeric-slot-id> のようなプレースホルダーを使い、実値を載せません。識別子は広告配信時にブラウザへ公開されますが、記事へ転記する必要はありません。
現在のブログ実装との対応
ルートレイアウトは、マーケティング設定でadsEnabledが有効かつクライアントが存在するときだけAdSenseLoaderを配置します。実際のAdSense スクリプトは、任意Cookieへの同意後にクライアント側のeffectがdocument.bodyへ追加し、同意を撤回すると除去します。AdSlotは/api/marketing/publicから公開設定を取得し、hydration後かつ同意済みで、クライアントとslotがそろった場合だけ<ins class="adsbygoogle">を作ります。属性はdata-ad-client、data-ad-slot、data-ad-format="auto"、data-full-width-responsive="true"です。
配置は home(トップ)、article(本文下)、sidebar(About)、ranking に分かれ、default がフォールバックです。adsenseSlots は環境変数 NEXT_PUBLIC_ADSENSE_SLOT_HOME、_ARTICLE、_SIDEBAR、_RANKING と共通の NEXT_PUBLIC_ADSENSE_SLOT に対応し、管理画面はeffective値と重複を示します。配置別ユニットはレポート比較に便利ですが、distinctを求めるのはこのリポジトリの運用方針であり、再利用自体をGoogleポリシー違反とする主張ではありません。
重要なのは /ads.txt の生成元です。現在のルートは保存済みマーケティング設定ではなく、実行環境の NEXT_PUBLIC_ADSENSE_CLIENT を読み、先頭の ca- を外してGoogleのseller行を返します。したがって管理画面だけを更新しても不十分で、ランタイム環境変数と管理設定のクライアントを同じ値に保つ必要があります。本番検証スクリプトはこの一致を確認します。
安全な設定手順
- AdSenseでサイト状態を確認し、配置ごとにレスポンシブなディスプレイ広告ユニットを作成します。Googleもレスポンシブを既定・推奨としています。
- 生成コードから
ca-pub-… と各 data-ad-slot を転記します。コード全体を独自に書き換えるのではなく、必要な属性だけ現在のコンポーネントへ対応させます。 - 本番環境のクライアント、共通slot、配置別slotを設定し、管理画面にも同じ値を保存してAdsを有効にします。変更後は再デプロイが必要な環境変数と、即時保存される設定を区別します。
https://example.com/ads.txt がプレーンテキストで開き、AdSenseが示すseller行と一致することを確認します。リダイレクト、別ホスト、HTMLのエラーページになっていないことも確認します。- ページ上で配置ごとの
<ins>、クライアント、slot、ローダーが確認できることを見ます。リポジトリでは pnpm run ads:audit、本番では SITE_URL=https://example.com node scripts/verify-live-ads.mjs が補助になります。検証出力は公開チャンネルへ貼らないでください。
本番検証は、クライアントが16桁形式か、slotが数値か、defaultを含む設定が埋まっているか、ads.txtとクライアントが一致するかを検査します。distinct slotも既定で要求しますが、これはローカルの観測性ルールです。静的検査の成功はAdSense側の承認を代替しません。
「広告が出ない」を正しく切り分ける
AdSlot はGoogleが付ける data-ad-status を監視します。現実装は filled を表示、unfilled を非表示+本文を妨げないフォールバックへ切り替え、未確定の pending は遅延読み込みを壊さないよう残します。Google公式資料には unfill-optimized も定義されているため、将来ロジックを変える際は「未配信」と「最適化済み」を混同しない確認が必要です。
表示されない原因は、サイトがまだReadyでない、ads.txt反映待ち、広告ユニット作成直後、ネットワークや同意設定、広告リクエストに合う在庫がない、クライアント/slotの取り違えなど複数あります。Googleは新規ユニットの表示に通常数分、場合によって最大1時間かかると案内し、ads.txtの反映には数日、リクエストが少ないサイトでは最大1か月かかり得ると説明しています。時間だけで成功・失敗を判定せず、AdSenseの「サイト」とads.txt状態、ブラウザのDOM、ネットワークを別々に確認します。
広告は本文やナビゲーションと明確に区別し、誤クリックを誘う近接配置や文言、広告クリックの依頼を避けます。広告ユニットを分けることも、テストが通ることも、審査通過・配信・収益の保証にはなりません。
公式参考資料
関連記事