WordPressの抜粋文下部分に(moreタグ使用時)広告などの別コンテンツを後から挿入する方法
少し前から記事本文中に広告を入れさせていただいています。
このブログで広告を挿入している方法と、使用した関数などをまとめました。
私は抜粋文の表示にmoreタグで本文を区切るという方法を取っていたので、そのmoreタグを目印に広告を入れています。the_content フィルターフックを使えば、後から広告などを本文に挿入したり、加工したりする事ができます。
moreタグで抜粋文を区切っている場合、記事の個別ページには、moreタグで区切った場所に、<span id=”more-記事ID”></span> というコードが差し込まれています。この部分を正規表現で探してきて広告のコードと差し替えてしまいます。
このようなタグが入っています。
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];
正規表現難しいですが、以下のサイトがわかりやすいです。
フリーザにもわかる正規表現入門 負けてたまるか。
条件分岐で判断し、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;
}
このコードを考えるのも結構時間がかかったのですが、こうやってまとめるとやっぱり簡単ですね…正規表現がまだいまいち理解できません。全体的に練習あるのみですね。
No Comments & Tracbacks