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