概要
前回の記事コメントシステム(Utterances)でコメントシステムを扱いました。今回の記事ではブログ収益化のためのGoogle AdSense広告連携方法を説明します。
広告連携は大きく2つの部分に分かれます。1つ目はポストレイアウトの固定位置(上部、下部、左右)に広告を配置すること、2つ目はマークダウンコンテンツの途中に広告を挿入することです。後者のためにカスタムrehypeプラグインを開発しました。
AdSenseスクリプトロード
Head.astroでGoogle AdSenseスクリプトをロードします。このスクリプトはすべてのページでロードされる必要があり、そうでないと広告が正常に表示されません。
<!-- src/components/Head.astro -->
<script
async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXX"
crossorigin="anonymous"
></script>
async属性を使用してページロードをブロックしないようにします。
広告コンポーネント
広告の配置位置ごとに個別のコンポーネントを作って管理します。このように分離すると各位置の広告を独立して修正したり無効化したりできます。
src/components/ads/
├── TopAds.astro # ポスト上部
├── BottomAds.astro # ポスト下部
├── LeftAds.astro # 左サイド
├── RightAds.astro # 右サイド
└── InFeedAds.astro # コンテンツ内(フィード)
各コンポーネントはAdSense広告コードを含み、PostLayout.astroで適切な位置に配置します。
<!-- src/layouts/PostLayout.astro -->
<TopAds />
<div class="container container-contents">
<div class="row">
<LeftAds />
<article class="col-lg-8 col-md-10 mx-auto" data-pagefind-body>
<slot /> <!-- マークダウンコンテンツ -->
<InFeedAds />
</article>
<RightAds />
</div>
<BottomAds />
</div>
ads.txt設定
広告詐欺防止のためにpublic/ads.txtとpublic/app-ads.txtファイルを配置します。このファイルはGoogle AdSenseが提供する認証情報を含み、「このサイトでこの広告ネットワークだけが広告を掲載できる」ということを検証する役割を果たします。
public/ディレクトリに配置するとビルド時にdist/ディレクトリにそのままコピーされ、https://deku.posstree.com/ads.txtでアクセスできます。
カスタムrehype-in-feed-adsプラグイン
レイアウトに固定配置する広告以外に、マークダウンコンテンツの途中にも広告を挿入したい場合があります。このためにrehype-in-feed-adsプラグインを開発しました。
使い方
マークダウンファイルで広告を入れたい位置に<!-- ad -->コメントを書くだけです。
## セクション1
内容...
<!-- ad -->
## セクション2
内容...
ビルド時に<!-- ad -->コメントが自動的にAdSense広告ブロックに置換されます。
プラグイン実装
プラグインはHAST(HTML構文ツリー)を再帰的に巡回しながら<!-- ad -->コメントノードを見つけて広告HTMLに置換します。
// src/plugins/rehype-in-feed-ads.mjs
const AD_HTML = `<div class="in-feed-ads ads-container">
<div class="ads-block ads-left">
<ins class="adsbygoogle" ... data-ad-slot="2718813593"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>
<div class="ads-block ads-center">
<ins class="adsbygoogle" ... data-ad-slot="6492035359"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>
</div>`;
function replaceInChildren(children) {
const result = [];
for (const child of children) {
if (
child.type === 'raw' &&
child.value &&
child.value.trim() === '<!-- ad -->'
) {
result.push(createAdNode());
} else if (child.type === 'comment' && child.value.trim() === 'ad') {
result.push(createAdNode());
} else {
if (child.children) {
child.children = replaceInChildren(child.children);
}
result.push(child);
}
}
return result;
}
export default function rehypeInFeedAds() {
return (tree) => {
if (!tree.children) return;
tree.children = replaceInChildren(tree.children);
};
}
動作原理
プラグインの動作原理をまとめると以下の通りです。
- HASTツリーを再帰的に巡回
<!-- ad -->コメントノードを見つけたらAdSense広告HTMLに置換rawタイプ(文字列)とcommentタイプ(パースされたコメント)の両方を処理
この方式はJekyllで{% include in-feed-ads.html %}で広告を挿入していたパターンを再現したものです。マークダウン作成時に<!-- ad -->を入れるだけなので手軽です。
完了
今回の記事ではAstroブログにGoogle AdSense広告を連携する方法を見てきました。
Head.astroでAdSenseスクリプトロード- 位置別広告コンポーネント(Top、Bottom、Left、Right、InFeed)構成
ads.txtで広告詐欺防止- カスタム
rehype-in-feed-adsプラグインでマークダウン内の<!-- ad -->コメントを広告に自動変換
次の記事Pagefindを利用した検索実装では静的サイトで検索機能を実装する方法を扱います。
シリーズ案内
このポストはJekyllからAstroへのマイグレーションシリーズの一部です。
- JekyllからAstroへマイグレーションした理由
- Astroのインストールとプロジェクト構成
- Content Collectionsとマークダウンマイグレーション
- 多言語(i18n)実装
- SEO実装
- 画像最適化 — カスタムrehypeプラグイン
- コメントシステム(Utterances)
- 広告連携(Google AdSense)
- Pagefindを利用した検索実装
- レイアウトとコンポーネントアーキテクチャ
- GitHub Pagesデプロイ
- ソーシャル共有自動化スクリプト
- トラブルシューティングとヒント
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Dekuが開発したアプリを使ってみてください。Dekuが開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。