doudonn WEB制作やサーバーの話とかいろいろ

ワードプレスで記事の目次をPHPで作る方法(jsを使わない)

doudonn 更新日:
ワードプレスで記事の目次をPHPで作る方法(jsを使わない)

記事に目次を作る!

ググるとjsで作る方法がよく見つかります。
確かにjsの得意分野ですが、PHPでも普通にできるので紹介。

今回紹介する目次の仕様ついて

下記の仕様です。

・タグは「h2」のみ
・目次は一番最初のh2の上に作る
・とにかく速度優先

自分はh3まで対応はしないのでh2までしか作ってない。

普通は「h2が2個以上あった場合」など条件分岐をするものですが、
軽さ優先なのでそんな処理は一切ありません。
自分専用の超カスタマイズです。

1、functions.phpに書く

<?php
function tocsakusei($honbun){

$match = preg_match_all( '#<h2>(.+?)</h2>#', $honbun, $result );

$h2count = count($result[0]);

for($i=0;$i<$h2count;$i++){
$pattern = '<h2 id="heading'.($i+1).'">';
$subject[] = str_replace('<h2>',$pattern,$result[0][$i]);
$result[1][$i] = '<li><a href="#heading'.($i+1).'" class="mokuji-a">'.$result[1][$i].'</a></li>';
$honbun = str_replace($result[0][$i],$subject[$i],$honbun);
}

$kumitate1 = '<div id="toc"><div class="mokuji">目次</div><div id="mokuji-list"><ol>';
$kumitate2 = '</ol></div></div>';
$tocmatome = implode('',$result[1]);
$kumitate3 = $kumitate1.$tocmatome.$kumitate2;

$h2 = '#<h2.*?>#';
if(preg_match($h2,$honbun,$h2s)){
$honbun = preg_replace($h2,$kumitate3.$h2s[0],$honbun,1);
}

return $honbun;
}
add_filter('the_content','tocsakusei');
?>

正規表現でh2を検索して置換しているだけです。
classを付けている場合は調整ください。
h3まで対応したい場合は最初のマッチングでh3も含めて、ちょっと頑張ればできる。

とりあえず、これだけで目次が表示されます。
あとはCSSを自分の好きなように記載ください。

2、サンプル

このブログがサンプルになります。

元々jsでサンプルを公開されているのを使っていたので、
Class名などはそのまま使っています。
なんか見たことある、な人が多いと思う。

jsとPHPのどっちが速いのか?ですが、
この関数の実行時間は約0.00005秒。
多分PHPの方が速いと思う。

ということで、PHPでの目次はおすすめです。

3、add_filterを使いたくない場合

$honbun = apply_filters('the_content',$post->post_content);
echo tocsakusei($honbun);

add_filterは自動で実行するので便利ですが、使えない人もいるだろう。
そんな本文を変数で取得して処理をしている人は、この方法が良い。

--

ワードプレスの関連記事

記事一覧はこちら:ワードプレス

管理人について
doudonn
名前:doudonn(どうどん)
ひたすらWEB制作な人。
一応社長です。音ゲー好き

<Twitterはこちら>
ゲーム垢
WEB制作垢
お知らせ

2022年11月30日に全記事削除しました。
まだ再開に向け作りかけ。


無駄にページ表示速度にこだわってます。

役立ちサイト
wiki
© 2022-2023 doudonn All Rights Reserved.