広告タグなどを自動で記事中のh2タグの前に挿入する方法です。
投稿の本文が設定した累積文字数を超える度に、次のh2タグ前に広告を挿入します。
ページ内のGoogleAdsense広告数の上限が撤廃された事を受けて作成しました。
WordPressのfunctions.phpに記載して使用します。
AMPページの判別方法は「Simplicity2」および「Cocoon」というテーマに合わせて作成していますので、AMPの実装方法によっては、修正が必要になります。
文字数が基準値を超えると広告挿入
///////////////////////////////////////////////
// 本文の累積文字数が基準値を超える度に次のh2タグ前に広告を追加
///////////////////////////////////////////////
function add_ads_before_h2_wordcount($the_content){
// 投稿ページかAMPページなら実行
if(is_single() || is_amp()){
// 表示ページの種類ごとに表示する広告を分ける
if(is_single()){
$ad = <<< EOF
/*
ここに広告タグを記入(通常ページ用)
※このコメントは削除する
*/
EOF;
}elseif(is_amp()){
$ad = <<< EOF
/*
ここに広告タグを記入(AMPページ用)
※このコメントは削除する
*/
EOF;
}
// 累積が何文字に達したら広告を追加するかの基準値を設定
$insert_count = 800;
// h2見出しが何個以上のときに本処理を実行するかを設定
$h2_min = 4;
// h2見出しの文字列パターンを設定
$h2 = '/^<h2.*?>.+?<\/h2>$/im';
// h2見出しのパターンが本文中にあるか検索して$h2sに多次元配列で格納
// h2見出しの数を取得して$h2_countに格納
$h2_count = preg_match_all($h2, $the_content, $h2s);
// h2見出しの数がゼロではなければ実行
if($h2_count){
// h2見出しの内容が格納されていれば実行
if($h2s[0]){
// h2見出しが$h2_min以上あれば実行
if($h2_count >= $h2_min){
// h2_word_countを初期化
$h2_word_count = 0;
// 検索開始位置の初期化
$start = 0;
// h2間の文字数の初期化
$count_between_h2 = 0;
// 広告の文字数を取得
$ad_word_count = mb_strlen($ad);
// 次のh2がなくなるまでループ
for ($count = 0; $count < $h2_count - 1; $count++){
// h2見出しの文字数を取得
$h2_length = mb_strlen($h2s[0][$count]);
// h2間の文字数を取得するためにh2間の範囲を取得
// カウント開始箇所のh2の閉じタグが何文字目かを処理済みのh2タグ以降から数える
$start = mb_strpos($the_content ,$h2s[0][$count], $start + $count_between_h2, "UTF-8");
// 次のh2タグまで何文字あるかをカウント開始箇所から数える
$count_between_h2 = mb_strpos($the_content, $h2s[0][$count + 1], $start + $h2_length, "UTF-8") - ($start + $h2_length);
// カウント開始のh2から次のh2までの文字列を取得
$str = mb_substr($the_content, $start + $h2_length, $count_between_h2, "UTF-8");
// 不要な文字列をなるべく削除して文字数を取得
// imgタグを削除
$str = preg_replace('/<img src[^>]+?\/>/im', '', $str);
// HTMLタグを削除
$str = strip_tags($str);
// 改行を削除
$str = preg_replace('/(?:\n|\r|\r\n)/', '', $str);
// 全角スペースを半角スペースに置換
$str = preg_replace('/ /', ' ', $str);
// 連続する半角スペースを半角スペース1文字に置換
$str = preg_replace('/\s+/', ' ', $str);
// h2間の文字数をカウントしてh2_word_countに加算
$h2_word_count += mb_strlen($str);
// 投稿本文の文字列が指定文字数に達している場合
if($h2_word_count >= $insert_count){
// 次のh2見出しの前に広告追加をして文字数をクリア
$the_content = str_replace($h2s[0][$count + 1], $ad."\n".$h2s[0][$count + 1], $the_content);
// 追加した広告の文字数を次の検索開始位置に加算
$count_between_h2 += $ad_word_count;
// 累積文字数をクリア
$h2_word_count = 0;
}
// h2内の文字列が指定文字数に足りない場合は、何もしないで文字数も保持
}
}
}
}
}
return $the_content;
}
// the_contentの読み込み時に実行
add_filter('the_content','add_ads_before_h2_wordcount');
説明
「/* ここに広告タグを記入 ※このコメントは削除する */
」と書かれているところに追加したい文字列を上書きします。
通常の投稿ページ用とAMPページ用の2箇所あります。
広告を追加したい場合は、それぞれ通常ページ用とAMPページ用の広告タグで上書きしてください。
「$insert_count = 800;
」の部分で文字列を挿入するまでの累積文字数を指定しています。
この場合、本文の文字数が800文字を超えると、設定した文字列が次のh2見出しの前に追加されます。
文字列を追加した後は累積文字数をリセットして、文字列を追加したh2見出しから再び文字数をカウントします。
累積文字数は好みで変更してください。
「// 不要な文字列をなるべく削除して文字数を取得
」以下でHTMLタグなど表面上見えない不要な文字をカウントの対象外にして精度を上げていますが、すべて取り切れている訳ではないので、必要であればカスタマイズしてください。
「// h2見出しが何個以上のときに本処理を実行するかを設定
」の部分では、処理を実行するのに必要なh2タグの個数を指定できます。
ページ内のh2見出しが$h2_min
の設定値より少ない場合は、動作しないように制御しています。
見出しが少ないページに記事中広告を挿入すると鬱陶しいと感じた為です。
好みで変更してください。