👌
PHPで見出し〇個おきに広告を挿入する方法【wordpress】
PHPで見出し〇個おきに広告を挿入したかったので調べました。とりあえず以下のコードがサンプルとしてネット上にあがっていました。
function swl_custom__add_ad_automatically( $the_content ) {
$X = 2;
// 投稿ページ以外は何もしない。
if ( ! is_single() ) return $the_content;
// 本文内のH2を取得 PREG_SET_ORDER
$has_h2 = preg_match_all( '/^<h2.*?>.+?<\/h2>$/im', $the_content, $h2_list, PREG_SET_ORDER );
// h2がなければ何もしない
if ( ! $has_h2 ) return $the_content;
// Xn番目の見出しのコンテンツの最後 = Xn+1 番目の見出しの直前 にコードを挿入する
foreach ( $h2_list as $num => $h2 ) {
if ( $num && ( $num % $X === 0 ) ) {
$the_content = str_replace( $h2[0], '[ad]' . $h2[0], $the_content );
}
}
return $the_content;
}
add_filter( 'the_content', 'swl_custom__add_ad_automatically' );
しかしわたしの場合はこのコードはうまくいきませんでした。
そもそも論としてこのコードは全体像として何をやっているのかというと、wordpressサイトの記事本文を取得して正規表現にマッチしたところを置換して返すというものです。
うまくいかなかった原因としては正規表現の部分ですね上記のコードでは正規表現に
/^<h2.*?>.+?<\/h2>$/im
を指定していますが、行頭をあらわす「^」や行末を表す「$」を指定しています。これを指定してしまうと、htmlが圧縮されていたりするとちゃんと1行としてみなしてくれないことがありちゃんと動かない場合があります。(意図したマッチをしてくれない)
文全体が1行になっている場合は以下のように正規表現を書き換えるとうまくいくかと思います。
/<h2.*?>.+?<\/h2>/ims
「s」は正規表現のパターン修飾子で「ドット文字 . を改行文字を含む全ての文字にマッチさせる」ものですがこれを入れたらなぜかうまくいきました。
Discussion