最近の日本のWordpressテーマだと目次を独自実装しているものが結構多いと思います。
海外テーマだと目次の機能を独自で持っているテーマは見かけたことがありません。
なぜ、テーマで目次の機能を持たないのかと言えば、プラグインで賄える機能であればそれを使ってもらい、それで問題が起きないようなテーマにしておけば無駄がないというスタンスです。
みんなで同じことをしても仕方ないですし、選択の自由を与えるという観点でこれは正しいと思っています。
日本のように何でも取り込んで自前で頑張ろうというのは、ユーザーを取り込むための製作者のエゴで最終的にユーザーにリスクを押し付けているだけです。このようにして日本はガラパゴス化が進みます。
上記はブロックエディタの独自ブロックを組み込んでいる日本のテーマについても当てはまります。独自ブロックを使った記事はテーマを変更したとたんに使えなくなり、表示できません。ユーザーをテーマと心中させるなんて、正気の沙汰ではありません。
このサイトのテーマCocoonも最初はプラグインでブロックを提供していましたが、いつの間にかテーマに組み込まれてしまいました。
Snow monkeyというテーマはSnow monkey Blockという形でテーマとブロックを分けている海外方式の素晴らしいテーマです。
この記事は、Snow monkey blockの目次ブロックを使ったときにCLSの問題が起きたので、別のプラグイン(Easy table of contents)を導入して回避したお話になります。
Snow monkeyの目次ブロックはjavascriptだった
Snow monkeyというテーマはSnow monkey Blockに目次ブロックがあります。この目次ブロックは使ってみると結構不思議な動きをします。
ページを読み込んだ時には目次が表示されず、しばらくしてから目次が表示されます。
その結果、目次の表示領域が最初から決まらないのでCLSが発生します。
最初はなんでなの?と思ったのですが、ソースを確認すると目次を作る部分がPHPではなくjavascriptを使っていました。そうなるとCLSが発生するのは仕方ないかなという感じです。
これは致し方ないので目次部分はSnowmonkey blockではなく、別のプラグインを導入することにしました。
Easy Table Of Contentプラグインを導入

Snow monkey blockの目次をEasy table of Conotentsに置き換えるときにいくつか問題がありました。
- Smoothscrollの機能がダブる
- Snow monkey blockの投稿一覧ブロックのh3タグが目次に出てしまう
Smoothscrollの機能がダブる問題
Snow monkeyには高機能なSmooth scrollのjavascriptが組み込まれています。一方、Easy TOCにもスムーススクロールが組み込まれています。
Easy TOCのスムーススクロール機能を有効化しても問題は起きませんが、2つあっても無駄なのでSnow monkey側のSmooth scrollを使うことにします。
①Easy TOCのスムーススクロールをOFFにします
Easy TOCのスムーススクロールを設定からOFFにします。
②Snow monkeyのスムーススクロールを有効にします
Snow monkeyのスムーススクロールを有効にするには、リンクの親要素にu-smooth-scroll classを追加します。
しかし、追加するのはフックで行いますが、少々トリッキーです。
ez-toc-containerに u-smooth-scroll classを追加するカスタマイズ
この辺とかにフックで追加する方法が書かれていますが、全く動きませんでした。理由はフックが実行される条件が絶対に成立しないためです。
仕方ないので、別の方法で実現しました。
add_filter( 'ez_toc_get_option_css_container_class', function($value, $key){
if(!is_admin()){
$value="u-smooth-scroll open";
return $value;
}
},10,2 );
Snow monkey blockの投稿一覧ブロックのh3タグが目次に出る問題
Snow monkey blockの記事一覧ブロックを記事内に置くとh3タグが大量に発生し、目次に組み込まれてしまいます。これは意図とは異なるので、除外しなければなりません。
Snowmonkeyの記事一覧の見出しh3にはclassが付いているので、classを指定して除外すればいいのですが、classによる除外設定は見当たりません。
しかし、classで除外できるフックがあるので、それを使います。
//TOC除外クラス指定
add_filter( 'ez_toc_exclude_by_selector', function($arr){
$arr[]='.c-entry-summary__title';
return $arr;
});
更に進んだEasy TOCの使い方
目次のタイトルをフックで変更します。
投稿タイプなどで目次のタイトルを変更することもできます。
また、あまり知られていませんが、%PAGE_TITLE%と書くと、ページタイトルに置き換えてくれます。
add_filter( 'ez_toc_get_option_heading_text', function($value, $key){
if(!is_admin()){
$value="%PAGE_TITLE% のまとめ";
return $value;
}
},10,2 );
この記事で使っているのは、ez_toc_get_option_{パラメータ名}フックです。
設定パラメータごとにフックが用意されていますので、この仕組みを使えば、パラメータを動的に書き換えることができますので、ほぼSnowmonkeyと同じような感じでゴリゴリカスタマイズできます。
add_filter( 'ez_toc_get_option_{パラメータ名}', function($value, $key){
return $value;
}
},10,2 );
まとめ
Table Of Contents Plusが人気ですがあまり作者がやる気が無いので、Easy Table Of Contentsの方が将来性はあると思います。
たびたび話題に上るページ分割されたページへの目次対応なども、 Easy Table Of Contentsなら対応しています。
なんでもかんでもテーマの機能を使うのではなく、必要に応じてプラグインを組み合わせていくのがいいと思います。