👌

PHPで見出し〇個おきに広告を挿入する方法【wordpress】

2023/02/20に公開

菊地姫奈写真集「moment」 週プレ PHOTO BOOK | 菊地姫奈, 東京祐 | タレント写真集 | Kindleストア | Amazon
小島瑠璃子ラスト写真集「瑠璃」 週プレ PHOTO BOOK | 小島瑠璃子, 唐木貴央 | タレント写真集 | Kindleストア | Amazon
【デジタル限定 YJ PHOTO BOOK】えなこ写真集「red/scarlet」 | えなこ, 桑島智輝 | タレント写真集 | Kindleストア | Amazon
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」は正規表現のパターン修飾子で「ドット文字 . を改行文字を含む全ての文字にマッチさせる」ものですがこれを入れたらなぜかうまくいきました。
Amazon.co.jp: 独習PHP 第4版 eBook : 山田祥寛: 本
菊地姫奈1st写真集 はばたき | HIROKAZU, 菊地姫奈 | タレント写真集 | Kindleストア | Amazon
WPB 菊地姫奈デジタル写真集~特装合本版~ 週プレ PHOTO BOOK | 菊地姫奈, Takeo Dec., 唐木貴央, 西條彰仁, 大辻隆広 | タレント写真集 | Kindleストア | Amazon

Discussion