ページ分割時に全ページ分の目次を出力する(要TOC+)

記事中の見出しタグを使用し、自動で目次を作ってくれる便利なプラグイン「Table of Contents Plus」(以下 TOC+)をページ分割した記事でうまく動かしたい。

中にはプラグインを直接改造するとか書いてるサイトもあるけど、言うまでもないけどおすすめしないよ。

デフォルトの動作

以下のように <!--nextpage--> を使用してページ分割した記事だとどう表示されるのかというと…

このように、分割後のページ単位で見出しが表示される。

全ページ分の見出しを出力する

これはこれでいいんだけど、そうではなく「全ページ分の見出しを出力する」ようにしたい。

今回は元のプラグイン自体には手を入れず、TOC+ の機能を使いつつ全ページ分出力するようなショートコードを作成する。

 

  • TOC+ で作成された目次も出力されてしまうので、そっちだけを非表示にするCSSも出力している。
  • 出力形式のカスタマイズは、toc_get_index(content) を呼ぶ前に $tic->set_option(array) で設定することで可能になる。TOC+のソースを参考にしよう。
  • (2021/6/29追記) バージョン 2106 以降では、$tic となっている部分を $toc_plus に変更すること。(変数名が変えられているため)

そうしたら、作成したショートコードを出力したい部分に記述する。

以下のように表示される。

使用例

実際に使っているのがこちら(※上記のソースより更にカスタマイズを入れて丁寧に作ってるけど基本的な作り方は同じ)

プロテインいろいろ飲んだんだよメモ
※ 2019/1/31 追記:「ファイン・ラボ」の品質が超絶劣化したのでそのことを書きました。 はじめに突然だけど実は俺、おととしからダイエットをしていて。最初は食事にちょっとだけ気を付けたり、犬の散歩がてらウォーキングしたり、すっかりご無沙汰だったロードバイクをちょろっと再開したり。それで効果が出始めたところで、水泳を始めるように。ガンガン効果が出てきたところに、(水泳と違って家の近くでできてお金もかからない)ジョギングも併用。なつかしのビリーズブートキャンプを引っ張り出して再開したり。そんなこんな...
スズキ歴史館に行ってきたよ。ジクサー250で。
千葉県から浜松まで、スズキ歴史館を見に行ってきたよ。ジクサー250で。

注意点

TOC+ が有効でないと見出しタグにアンカーが作成されず、正常にジャンプできなくなる。つまり「目次を出すため」ではなく「目次から正しい位置に飛ぶため」に、リンク先のページでも TOC+ の有効化が必要となる。 [no_toc] で TOC+ を OFF にしないこと。

逆に「1ページ目だけ目次を出して2ページ目以降には出したくない」などという場合はひと工夫する必要がある。たとえば2ページ目以降は [allpage_toc] を記述せず、かつ TOC+ で出力された目次を消すCSSを仕込むなど。

バージョン2402 以降の対応

Table of Contents Plus バージョン2402 でプラグイン内部の処理が変更されたため、このページに書いてある方法では、目次は作成されますが見出しにアンカーがつかず、正常にジャンプできなくなりました。

2402

2406

有効にするかどうかを、本文中に [toc] ショートコードがあるかどうかで判断するようになった。

とりあえずショートコードを本文に書けば動くし、 

それかプラグインを直接いじるか…

でもこんなのやりたくないよね。

結局、TOC+ の is_eligible()より先に $post->post_contentの中身を書き換えるようにすればいい…。

これが呼ばれているのは以下の処理の中なので、

優先順をとりあえず1つ前の99とかに設定して、中身を強制的に書き換える。具体的には今回作成したショートコードの前とかに強制的に [toc]を足してやって is_eligible()の判定をすり抜けてしまえばいい。

これでアンカーが正常に動くようになるので以前と同じ動作に戻せる。

banner
banner
banner