WordPress の記事の何番目の見出しの前に広告や文を差し込む:the_content で 1 つ目・2 つ目・最後の h3 を数える

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

WordPress の記事の本文で、1 つ目・2 つ目・最後の h3 の前に、広告や案内を差し込む functions.php のコード。同じ文字の見出しが 2 つあると両方に入る・見出しが 1 つだと最後に入らない、という前の書き方の問題も、試した結果つきで。

記事の途中に広告や関連記事の案内を入れたいとき、本文の見出しの数を数えて、決まった番目の見出しの前に差し込みます。

functions.php
/**
 * 記事の本文で、決まった番目の h3 の前に、好きな内容を差し込む
 */
add_filter( 'the_content', function ( $content ) {
	if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
		return $content;
	}
	// 差し込む内容(番目 => HTML)。'last' は最後の h3 の前
	$inserts = array(
		1      => '<div class="my-insert">1 つ目の h3 の前</div>',
		2      => '<div class="my-insert">2 つ目の h3 の前</div>',
		'last' => '<div class="my-insert">最後の h3 の前</div>',
	);
	return my_insert_before_h3( $content, $inserts );
}, 20 );

function my_insert_before_h3( $content, $inserts ) {
	$total = preg_match_all( '/<h3\b[^>]*>/i', $content );
	if ( ! $total ) {
		return $content;
	}
	$count = 0;
	return preg_replace_callback( '/<h3\b[^>]*>/i', function ( $m ) use ( &$count, $total, $inserts ) {
		$count++;
		$add = isset( $inserts[ $count ] ) ? $inserts[ $count ] : '';
		if ( $count === $total && isset( $inserts['last'] ) ) {
			$add .= $inserts['last'];
		}
		return $add . $m[0];
	}, $content );
}
書き方 役目
is_singular( 'post' )・in_the_loop()・is_main_query() 投稿の記事の本文のときだけ動かす(サイドの新着などでは動かさない)
開きタグ(<h3 …>)だけを数える 見出しの中に改行やタグがあっても、数えまちがえない
preg_replace_callback で 1 つずつ数える 同じ文字の見出しがあっても、決めた番目にだけ入る
$inserts の番号と 'last' 差し込む場所と内容。番号を足せば、3 つ目・4 つ目にも入れられる

最後の h3 の前に差し込む

上のコードの $inserts に ‘last’ を書くと、最後の h3 の前に入ります。見出しが 1 つだけの記事では、1 つ目の内容と最後の内容が、両方その前に入ります。

前の書き方との違い

前はこの記事で、見出しを丸ごと探して str_replace で置きかえる書き方を紹介していました。

試したこと 今の書き方 前の書き方
同じ文字の見出し(まとめ)が 2 つある 1 つ目の前にだけ入った 2 つの「まとめ」の両方に入った
見出しの中に改行がある 数えられた 見つけられなかった(3 つのうち 2 つだけ)
見出しが 1 つだけで「最後」に入れる 入った 入らなかった(1 つ目の番号の 0 を「なし」と見なしていた)
見出しがない そのまま —

どちらも、試しの本文を PHP で動かして確かめました。

画像を数えて差し込みたいとき

// h3 の代わりに、本文の画像(img)を数えたいときは、2 か所の正規表現をこれに変える
'/<img\b[^>]*>/i'

どのページで動かすかの見分け方

書き方 動くページ
is_singular() 投稿・固定ページ・カスタム投稿の、1 つの記事のページ全部
is_single() 投稿とカスタム投稿の記事のページ(固定ページは入らない)
is_singular( 'post' ) 投稿の記事のページだけ
is_singular( 'page' ) 固定ページだけ
is_singular( 'news' ) カスタム投稿 news の記事のページだけ
is_single( 123 ) ID が 123 の記事のページだけ

前はこの記事で「is_single() は固定ページ・投稿・カスタム投稿」と書いていましたが、is_single() には固定ページは入りません。全部をまとめて見分けるのは is_singular() です。

参考(WordPress の公式の説明)

関連機能

  1. アイキャッチ画像の設定機能を追加したい場合

  2. WordPressのバージョン情報を自動的に最新バージョンに偽装する

  3. WordPress の管理バーの「投稿を表示」を別のタブで開く:admin_bar_menu で target=”_blank” を足す

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP