WordPressの抜粋文下部分に(moreタグ使用時)広告などの別コンテンツを後から挿入する方法

少し前から記事本文中に広告を入れさせていただいています。
このブログで広告を挿入している方法と、使用した関数などをまとめました。

私は抜粋文の表示にmoreタグで本文を区切るという方法を取っていたので、そのmoreタグを目印に広告を入れています。the_content フィルターフックを使えば、後から広告などを本文に挿入したり、加工したりする事ができます。

moreタグで抜粋文を区切っている場合、記事の個別ページには、moreタグで区切った場所に、<span id=”more-記事ID”></span> というコードが差し込まれています。この部分を正規表現で探してきて広告のコードと差し替えてしまいます。

moreタグコード

このようなタグが入っています。

moreタグと別コンテンツを入れ替えるコード

以下のコードを、functions.php に記入します。
4行目の $ad = ‘ ‘ ; のシングルクォートの中にAdsense等のコードを貼り付けて頂ければOKです。抜粋文の下に広告が表示されるようになると思います。

add_filter('the_content', 'moreAd');

function moreAd($moreCnt){	
	$moreTag = '/<span id="more-[0-9]+"><\/span>.*[\/a-z]+>/' ;
	$ad = '【広告のコードが入ります】';
	
	preg_match($moreTag, $moreCnt, $matches);
	$match = $matches[0];
	
	if(is_null($match) == false){
		if(strpos($match, '</p>') !== false){
			$moreCnt = preg_replace($moreTag, '</p>'.$ad, $moreCnt);
		} else {
			$moreCnt = preg_replace($moreTag, '</p>'.$ad.'<p>', $moreCnt);
		}
	}
	return $moreCnt;
}

上記コードの解説と関数のメモ

まず、作った”moreAd”という関数をフィルターフックで、実行するコードを記入します。

add_filter('the_content', 'moreAd');

関数”moreAd”の中身

spanタグが入っているのがpタグの中に含まれているので、そのままspanタグと入れ替えると広告がpタグの中に入ってしまいます。
それを回避するのに広告コードがはじまる前に</p>を記入してpタグを終わらせたかったのですが、少し困ったのが</span>タグのすぐ後ろにくるのが、</p>または<br />でその記事の更新の仕方によって変わってきてしまう点でした。
その為、moreのIDがついたspanタグと、そのすぐ後に続くタグまで含めて置き換えするようにしています。

function moreAd($moreCnt){	
	
	// $moreTag の中にmoreのIDがついたspanタグとその直後のタグを含むという正規表現
	$moreTag = '/<span id="more-[0-9]+"><\/span>.*[\/a-z]+>/' ;
	
	// $ad に広告のコードを入れる
	$ad = '【広告のコードが入ります】';
	
	// 正規表現で $moreCnt の中に $moreTag(spanタグの部分)が入っているか調べる。
	// マッチしてたら $matches にその部分が配列で入るので、最初に入ってる値を $match に入れる
	preg_match($moreTag, $moreCnt, $matches);
	$match = $matches[0];

正規表現難しいですが、以下のサイトがわかりやすいです。
フリーザにもわかる正規表現入門 負けてたまるか。

preg_matchについて:PHP: preg_match – Manual

条件分岐で判断し、moreタグがあった場合にspanタグの部分と広告を入れ替えます。

	if(is_null($match) == false){
	//  ↑ $match に値が入っていた場合(nullじゃなかったら)に
	//  ↓ $match の中の値に</p> が入っているかどうか
		if(strpos($match, '</p>') !== false){
			// ↓</p>が入っていたらpタグ終了して広告を入れる
			$moreCnt = preg_replace($moreTag, '</p>'.$ad, $moreCnt);
		} else {
			// ↓<br />が入っていたらpタグを終了して広告を入れ、次の文章の為のpタグの用意をする
			$moreCnt = preg_replace($moreTag, '</p>'.$ad.'<p>', $moreCnt);
		}
	}
	// ↓返り値を $moreCnt にして終了
	return $moreCnt;
}
is_null について:値がnullかどうか調べる。null だったら true を返す。PHP: is_null – Manual
strpos について:文字列の検索を行う。指定の文字列があった場合は最初に出現する位置を返す。文字列がなかったら false を返す。PHP: strpos – Manual
preg_replace について:正規表現で検索し、文字列を置き換える。PHP: preg_replace – Manual

このコードを考えるのも結構時間がかかったのですが、こうやってまとめるとやっぱり簡単ですね…正規表現がまだいまいち理解できません。全体的に練習あるのみですね。

Related Article

No Comments & Tracbacks

Leave a Comment

Emailは公開されません。*は必須項目です。


*


Categorys

Tags

CSS3 ダッシュボード ヘッダー トラブル コードサンプル コンテンツ スライドショー jQueryプラグイン php 引っ越し 素材 お知らせ JavaScript Facebook CSS カテゴリー 投稿タイプ IE HTML5 Shareボタン seo レスポンシブ Photoshop タクソノミー ナビゲーション カスタムメニュー Git Macアプリ サイドバー WPセキュリティ SVG iTunes PHPリファレンス API WP使い方 query_posts データベース get_posts() 条件分岐 コメント function RSS スマートフォン Sass/Compass さくらVPS