概要説明
WordPress の記事の本文で、1 つ目・2 つ目・最後の h3 の前に、広告や案内を差し込む functions.php のコード。同じ文字の見出しが 2 つあると両方に入る・見出しが 1 つだと最後に入らない、という前の書き方の問題も、試した結果つきで。
~ 目次 ~
コード:決まった番目の h3 の前に差し込む
記事の途中に広告や関連記事の案内を入れたいとき、本文の見出しの数を数えて、決まった番目の見出しの前に差し込みます。
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() です。


