WordPress本文中に広告を自動で挿入する (プラグイン無し&H2が無い記事にも対応)

文中広告って「記事を読んでくれてる人を途中で脇道に逸らす」行為に等しいので、ブログ運営者として果たしてそれが誠実なのか?と自問自答した時期が長かったのですが、「2019年は新しいことにチャレンジしよう」という至極簡単な理由であっさり導入してしまいました。

WordPress運用やってるとこういう人が多いと思われますが、

  • できるだけプラグインは使いたくない
  • かといって全記事にmoreタグ入れ直すのもめんどくさい

私ももれなく該当しましたので、自動で広告を差し込む方法を選択しました。

で、たいていの場合はh2見出しタグの前に自動挿入するというルールが採られると思われます。それだけで良ければ私の駄文はここまでにしておいて、迷わずこちらの記事を読まれた方がいいです。
本文記事1、2、3番目のH2見出し手前にアドセンスを挿入するWordPressカスタマイズ方法

ただ私の場合、古い記事の中にはh2が無い場合があるということで状況がやや複雑でして、

  • h2がある記事はh2の前に広告を挿入
  • h2がない記事は別の挿入箇所を定義

こういう出し分けをする必要がありました。そのため、h2がある記事でも無い記事でもワンコードで自動で出し分けるように、上記の記事を丸パクリ参照してアレンジしたものを紹介します。

function.phpコード

function.phpに以下のコードを挿入します。

//文中広告
function add_ad_in_articles($the_content) {
//広告タグを挿入
$ad1 = <<< EOF
//ここを広告タグに差し替える
EOF;

if ( is_single() ) {//投稿ページ
$h2 = '/<h2>.+?<\/h2>/s';//h2のパターン
$ptag = '/<p>.+?<\/p>/s';//pのパターン
	if ( preg_match_all( $h2, $the_content, $h2s )) {//h2が本文中にあるかどうか
		if ( $h2s[0] ) {//チェックは不要と思うけど一応
			if ( $h2s[0][0] ) {//1番目のh2手前に広告を挿入
				$the_content  = str_replace($h2s[0][0], $ad1.$h2s[0][0], $the_content);
			}
		}
	} elseif ( preg_match_all( $ptag, $the_content, $ptags )) {//pが本文中にあるかどうか
		if ( $ptags[0] ) {//チェックは不要と思うけど一応
			if ( $ptags[0][4] ) {//5番目のp要素手前に広告を挿入
				$the_content  = str_replace($ptags[0][4], $ad1.$ptags[0][4], $the_content);
			}
		}
	}
}
return $the_content;
}
add_filter('the_content','add_ad_in_articles');

やってることは以下の通りです。

  • 記事中にh2がある場合は、1つ目のh2の前に広告を挿入する
  • 記事中にh2が無い場合は、5つ目のp要素の前に広告を挿入する

なおここで言う5つ目のp要素というのは至極適当に決めたもので、3番目でも4番目でも6番目でもかまいません。

PHPメモ

preg_match_all と preg_matchの違いは以下だそうだ。

  • preg_match_all : マッチしたものを全部取得する
  • preg_match : マッチした最初の文字列を取得する

PHPで正規表現にマッチした文字列を全て取得するにはpreg_match_allを使う – seri::diary

※施行日 : 2019年1月19日

効果のほどは

導入してまだ1ヵ月しか運用していませんが、確かにけっこう収益性はいいように感じます。ただし、途中で離脱される読者のことが気になってしょうがなくなったらいつの日かやっぱやめるかもしれません。

アレンジ版

と書いておきながら、私が実際に導入している仕様はさらに異なりまして、こういう仕様にしています。

  • h2が2つ以上ある場合は2つ目のh2の直前に広告を挿入する
  • h2が1つしかない場合は1つ目のh2の直前に広告を挿入する
  • h2が1つもない場合は5つ目のp要素の直前に広告を挿入する

その理由は簡単で、1つ目のh2の前に広告入れちゃうと記事を読み始めたらすぐに広告にぶち当たってしまう、というのがどうしても気に食わなかったからです。ということでさらに条件を加えたコードを紹介します。

//文中広告
function add_ad_in_articles($the_content) {
//広告タグを挿入
$ad1 = <<< EOF
//ここを広告タグに差し替える
EOF;

if ( is_single() ) {//投稿ページ
$h2 = '/<h2>.+?<\/h2>/s';//h2のパターン
$ptag = '/<p>.+?<\/p>/s';//pのパターン
	if ( preg_match_all( $h2, $the_content, $h2s )) {//h2が本文中にあるかどうか
		if ( $h2s[0] ) {//チェックは不要と思うけど一応
			if ( $h2s[0][1] ) {//2番目のh2がある場合、2番目のh2手前に広告を挿入 (この行を追加)
				$the_content  = str_replace($h2s[0][1], $ad1.$h2s[0][1], $the_content);//(この行を追加)
			} elseif ( $h2s[0][0] ) {//2番目のh2がなく1番目h2がある場合、1番目のh2手前に広告を挿入 (この行ちょっと修正)
				$the_content  = str_replace($h2s[0][0], $ad1.$h2s[0][0], $the_content);
			}
		}
	} elseif ( preg_match_all( $ptag, $the_content, $ptags )) {//pが本文中にあるかどうか
		if ( $ptags[0] ) {//チェックは不要と思うけど一応
			if ( $ptags[0][4] ) {//5番目のp要素手前に広告を挿入
				$the_content  = str_replace($ptags[0][4], $ad1.$ptags[0][4], $the_content);
			}
		}
	}
}
return $the_content;
}
add_filter('the_content','add_ad_in_articles');

以上です。