WordPressで個別記事の文章途中に広告などの別コンテンツを後から挿入する方法(moreタグ不使用時)2つ

前回「WordPressの抜粋文下部分に(moreタグ使用時)広告などの別コンテンツを後から挿入する方法 」という記事を書いたのですが、抜粋文はmoreタグを使わずに本文の一定文字数を取り出し、抜粋文として使用されている方もいらっしゃると思います。

このブログの場合には、moreタグを抜粋文として使っていますが、古い記事には文章があまりにも短い為、抜粋文自体なしという記事もありました。そういう記事にも個別記事を開いた時には広告を入れたいなと思ってコードを考えました。

moreタグを使ってない記事の個別記事のみに、文章の途中で広告等別コンテンツを入れるコード2つです。(追加で1つ書き足しました)句点で区切る方法とPタグで区切る方法です。その中で使った関数などもまとめました。

〈目次〉
文章の途中で広告等の別コンテンツを入れるコード1(句点で区切る方法)
 – 解説と関数のメモ
 – moreタグがある場合にはmoreタグ下に、ない場合に個別ページでのみ広告を入れる

文章の途中で広告等の別コンテンツを入れるコード2(Pタグで区切る方法)
 – 解説と関数のメモ
 – moreタグがある場合にはmoreタグ下に、ない場合に個別ページでのみ広告を入れる

文章の途中で広告等の別コンテンツを入れるコード1(句点で区切る方法)

*注意*========================================================
本文中の「。」全てを対象としている為、一番最初に出現する「。」が小見出し内や、alt属性だった場合に表示に不具合が出る可能性がありますのでご注意下さい。(ご指摘ありがとうございましたー!)
===============================================================

このコードでは記事本文の最初の句点(。)の次に、広告等の別コンテンツを挿入するようになっています。注意書きにもありますが、本文の初めの方に画像や小見出しが入っている場合にはこのコードは不向きです。下に追記したコードの方がよいかもしれません。

以下のコードを、functions.php に記入します。
3行目の$ad = ‘ ‘ ; のシングルクォートの中にAdsense等のコードを貼り付けて頂ければOKです。

add_filter('the_content', 'cntAd');
function cntAd($content){	
	$ad = '<div>【広告のコードが入ります】</div>';
	if(is_single()){
		$arrayCnt = explode('。', $content);
		$cntFirst = array_shift($arrayCnt).'。'.$ad;
		$content = $cntFirst.implode('。', $arrayCnt);
	}
	return $content;
}

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

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

add_filter('the_content', 'cntAd');
”cntAd関数”の中身

explode 関数を使用して本文中の「。」が現れる単位で分割して配列に格納します。次に、array_shift 関数を使用し配列の一番最初の値とそれ以外に分け、最初の値の次に広告を挿入するようになっています。

function cntAd($content){	
	// ↓$ad に広告のコードを入れる
	$ad = '<div>【広告のコードが入ります】</div>';
	
	if( is_single() ){
	// ↑個別ページだった場合以下の処理

		$arrayCnt = explode('。', $content);
		// ↑ explode関数 で「。」で区切った配列をつくる

		$cntFirst = array_shift($arrayCnt).'。'.$ad;
		// ↑ array_shift関数で配列の最初の内容を取り出して、広告のコードと連結する

		$content = $cntFirst.implode('。', $arrayCnt);
		// ↑ $arrayCnt には最初の内容が取り出された後の内容が残っているので 
   // implode関数で配列から文字列へ戻し、広告コード入の $cntFirst と連結する。
	}
	return $content;
	// 返り値を $content にする
}
explode について:文字列中にある、指定した文字列を区切りとし、分割して配列にすることができる。PHP: explode – Manual
implode について:explodeと逆で、配列を指定の文字列で区切って、1つの文字列にして返す。PHP: implode – Manual
array_shift について:配列の最初の値を取り出す。最初の値を取り出した後の配列には、最初の値が削除された状態の配列が残る。PHP: array_shift – Manual

moreタグがある場合にはmoreタグ下に、moreタグがない場合には個別ページでのみ広告を入れる

これはこのブログで最終的に使っているコードです。以下のコードを、functions.php に記入します。

add_filter('the_content', 'cntAd');
function cntAd($content){	
	$moreTag = '/<span id="more-[0-9]+"><\/span>.*[\/a-z]+>/' ;
	$ad = '<div>【広告のコードが入ります】</div>';
	
	preg_match($moreTag, $content, $matches);
	$match = $matches[0];	
	
	if( is_single() ){
		if( is_null($match) == false ){
			if( strpos($match, '</p>') !== false){
				$content = preg_replace($moreTag, '</p>'.$ad, $content);
			} else {
				$content = preg_replace($moreTag, '</p>'.$ad.'<p>', $content);
			} 					
		} else {
			$arrayCnt = explode('。', $content);
			$cntFirst = array_shift($arrayCnt).'。'.$ad;
			$content = $cntFirst.implode('。', $arrayCnt);
		}
	}
	return $content;
}

文章の途中で広告等の別コンテンツを入れるコード2(Pタグで区切る方法)

このコードでは1つ目のPタグの終了タグ</p>が出現したすぐ後に、広告等の別コンテンツを挿入するようにしています。もしPタグを本文中に使わないようにプラグインを入れていたりカスタマイズされている場合は、下記コードの</p>の部分を<br />へ書き換えて頂ければよいかなと思います。

以下のコードを、functions.php に記入します。
3行目の$ad = ‘ ‘ ; のシングルクォートの中にAdsense等のコードを貼り付けて頂ければOKです。

add_filter('the_content', 'cntAd');
function cntAd($content){	
	$ad = '<div>【広告のコードが入ります】</div>';
	$count = 0;
	
	if(is_single()){
			$arrayCnts = preg_split('/<\/p>/', $content, -1, PREG_SPLIT_NO_EMPTY);
			foreach( $arrayCnts as $arrayCnt ){
				$count++;
				if($count == 1){
				$arrayCntAd[] = $arrayCnt.'</p>'.$ad;
				} else {
				$arrayCntAd[] = $arrayCnt.'</p>';
				}
			}		
			$content = implode("", $arrayCntAd);
	}
	return $content;
}

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

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

add_filter('the_content', 'cntAd');
”cntAd関数”の中身

preg_split 関数を使用して「</p>」が現れる単位で分割して配列に格納します。次に、配列に格納した値をひとつずつ取り出すと同時にカウントを回します。配列の1つ目の「</p>」の後に広告等のコードを挿入してからまた配列に戻します。5行目の数字を変えることにより挿入位置を変更できます。

function cntAd( $content ){	
	// ↓$ad に広告のコードを入れる
	$ad = '<div>【広告のコードが入ります】</div>';
	
	// ↓$count に0を入れる
	$count = 0;
	
	if(is_single()){
    // ↑個別ページだった場合以下の処理
    
			$arrayCnts = preg_split('/<\/p>/', $content, -1, PREG_SPLIT_NO_EMPTY);
			// ↑ preg_split関数 で「</p>」で区切った配列をつくる
			
			foreach( $arrayCnts as $arrayCnt ){
			// ↑ 配列から値を取り出す
			
				$count++;
				// $countに1を足す
				
				if($count == 1){
				// ↓ $count の値が1だった場合に広告のコードを挿入し、
				//    配列に入れ直す
					$arrayCntAd[] = $arrayCnt.'</p>'.$ad;
				} else {
				// ↓ それ以外の場合は</p>だけつけて配列に入れ直す
					$arrayCntAd[] = $arrayCnt.'</p>';
				}
			}		
			$content = implode("", $arrayCntAd);
			// ↑ implode関数で配列から文字列へ戻す
	}
	return $content;
	// 返り値を $content にする
}
preg_split について:文字列を正規表現で分割して配列に格納するPHP: preg_split – Manual

moreタグがある場合にはmoreタグ下に、moreタグがない場合には個別ページでのみ広告を入れる

以下のコードを、functions.php に記入します。

add_filter('the_content', 'cntAd');
function cntAd($content){	
	$moreTag = '/<span id="more-[0-9]+"><\/span>.*[\/a-z]+>/' ;
	$ad = '<div>【広告のコードが入ります】</div>';
	$count = 0;
		
	preg_match($moreTag, $content, $matches);
	$match = $matches[0];	
	
	if( is_single() ){
		if( is_null($match) == false ){
			if( strpos($match, '</p>') !== false){
				$content = preg_replace($moreTag, '</p>'.$ad, $content);
			} else {
				$content = preg_replace($moreTag, '</p>'.$ad.'<p>', $content);
			} 					
		} else {
			$arrayCnts = preg_split('/<\/p>/', $content, -1, PREG_SPLIT_NO_EMPTY);
			foreach( $arrayCnts as $arrayCnt ){
				$count++;
				if($count == 1){
				$arrayCntAd[] = $arrayCnt.'</p>'.$ad;
				} else {
				$arrayCntAd[] = $arrayCnt.'</p>';
				}
			}		
		$content = implode("", $arrayCntAd);
		}
	}
	return $content;
}

1つ目のコードは短くかけたのでよかった気がしていましたが、自分では気がつかない落とし穴がありました…。いろいろな状況がサイトによってそれぞれあるので、その辺りも考えて汎用的なコードを考えつけるようにならなくてはなと思いました。

Related Article

1 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