【WordPress】本文内に、アドセンス広告などを自動で追加する例
WordPressでサイトを作成していると、本文内の指定した箇所に、AdSense(アドセンス)広告など、任意のコンテンツを自動で追加したい場合があるかもしれません。
今回は、そのような場合に使用できるソースコードの例となります。
本文内の指定した箇所に、アドセンス広告などを自動で追加する例
今回の例では、投稿ページの本文内にあるh2要素を上から順番にカウントし、奇数のh2要素の直前にアドセンス広告などの任意のコンテンツを自動で追加できるようにします。
広告を表示させる条件
今回の例では、本文内に全く同じh2要素がある場合には使用できません。
また、アドセンス広告のソースコードは、adv.phpという別ファイルを作成し、そのファイル内に記述します。ファイルの配置場所はテーマフォルダ直下の「template-parts」フォルダ内とします。
ソースコードの例
以下が例のソースコードとなり、function.phpに記述します。
function my_add_content( $content ){
if( is_single() ){
// h2要素を正規表現で表すパターン
$pattern = '/<h2.*?>.*?<\/h2>/i';
// 本文の中から、すべてのh2要素を検索し、h2要素が本文中にあった場合
if ( preg_match_all( $pattern, $content, $matches, PREG_SET_ORDER ) ){
// 追加するコンテンツのソースコードを記述したファイルの読み込み
$add_adv = file_get_contents( dirname(__FILE__) .'/template-parts/adv.php' );
// ループ回数を数える変数
$i = 0;
// h2要素を順番にループで処理
foreach( $matches as $element){
// ループ回数を1加算
$i++;
if( $i%2 == !0 ){ // ループが奇数の場合
// h2要素の直前に任意のコンテンツを追加して置換
$content = str_replace( $element[0], $add_adv . $element[0], $content);
}
}
}
}
return $content;
}
add_filter('the_content','my_add_content');
ソースコードの説明
以下、ソースコードのポイントとなる箇所の説明となります。
フィルターフックthe_contentで、投稿の本文を取得して変更
投稿の本文内にあるh2要素を上から順番に数え、奇数のh2要素の直前に、任意のコンテンツを自動で追加するには、フィルターフックthe_contentを使用します。
フィルターフックthe_contentのコールバック関数の引数には、本文が格納されるので、その本文を変更して任意のコンテンツを追加します。
以下、フィルターフックthe_contentのコールバック関数内のポイントとなる箇所となります。
正規表現を用いて本文内にあるh2要素を検索
以下の箇所では、投稿ページ内の場合にpreg_match_all関数を使い、投稿本文内にあるすべてのh2要素を検索します。そして、本文内にh2要素があればif文内の構文を実行します。
例のソースコード2行目からの箇所
if( is_single() ){
// h2要素を正規表現で表すパターン
$pattern = '/<h2.*?>.*?<\/h2>/i';
// 本文の中から、すべてのh2要素を検索し、h2要素が本文中にあった場合
if ( preg_match_all( $pattern, $content, $matches, PREG_SET_ORDER ) ){
// 下略
}
}
preg_match_all関数は、第2引数に指定した文字列から、第1引数にしていした正規表現のパターンを検索し、第3引数にマッチした文字列を格納します。第4引数は、取得する配列の順序を指定します。
上記のpreg_match_all関数では引数は以下となります。
- 第1引数は、属性を持たないh2要素を正規表現で表すパターン$pattern(検索する正規表現のパターン)を指定
- 第2引数は、記事の本文$content(検索の対象となる文字列)を指定
- 第3引数は、$matchesとし、検索でマッチした「h2要素」と「h2要素の内容」をすべてを多次元配列で格納。
- 第4引数は、 PREG_SET_ORDERを指定
preg_match_all関数の詳細については、以下のリンク先を参考にしてみてください。
追加するコンテンツを指定
以下の箇所では、h2要素が本文内にあった場合に、追加するコンテンツを指定します。
例のソースコード7行目からの箇所
// 追加するコンテンツのソースコードを記述したファイルの読み込み
$add_adv = file_get_contents( dirname(__FILE__) .'/template-parts/adv.php' );
上記箇所では、追加するコンテンツを外部ファイルから読み込んでいます。外部ファイルは、テーマフォルダ直下の「template-parts」フォルダ内に「adv.php」というファイル名で配置し、そのファイル内に、追加するコンテンツのソースコードを記述します。
そして、file_get_contents関数を使いadv.phpファイルを読み込み変数$add_adv に格納します。
奇数のh2要素の直前に任意のコンテンツを追加
以下の箇所では、preg_match_all関数の引数$matchesに格納されているh2要素をループで扱い、投稿ページの本文内にあるh2要素を上から順番に数え、奇数のh2要素の直前にアドセンス広告を追加します。
例のソースコード9行目からの箇所
// ループ回数を数える変数
$i = 0;
// h2要素を順番にループで処理
foreach( $matches as $element){
// ループ回数を1加算
$i++;
if( $i%2 == !0 ){ // ループが奇数の場合
// h2要素の直前に任意のコンテンツを追加して置換
$content = str_replace( $element[0], $add_adv . $element[0], $content);
}
}
上記箇所では、preg_match_all関数の引数$matchesをforeachループで扱います。
例の$matchesには本文内にある「h2要素」と「h2要素の内容」が多次元配列で格納され、$element[0]には「h2要素」が格納されています。
foreachループ内では、ループ回数が奇数の際に、str_replace関数を使い次のように検索・置換を行います。
$element[0]に格納されているh2要素を本文内から検索し、そのh2要素の直前に任意のコンテンツ$add_advを追加して置換します。
str_replace関数については以下のリンク先を参考にしてみてください。
まとめ
今回の例では、投稿の本文内にあるh2要素を上から順番に数え、奇数のh2要素に任意のコンテンツを追加しましたが、if文の条件式や、preg_match_allの検索パターンを変更することで、任意のコンテンツを追加する箇所を変更することができます。