*

Table of Contents Plusを改造してページ分割に対応する方法

 


Table of Contents Plusを改造してページ分割に対応する方法

 WordPressの記事に目次を生成するプラグインである”Table of Contents Plus”を改造し、ページ分割(nextpage)に対応する方法を説明します。

スポンサーリンク

注意事項

 最初に注意事項があります。

 ページ分割に対応するためには、”Table of Contents Plus”のソースコードを編集する必要があります。1年半以上このブログで特に問題は起こっていないので、記事の指示通りに作業してもらえれば、特に問題は発生しないと思いますが、テスト環境などであらかじめ動作確認後、本番環境へ適用することをおすすめします。

 また、この編集によって生じた損害について私は一切の責任を負いません。この点はあらかじめご承知おき下さい。

改造によってどう変化する?

 デフォルトの”Table of Contents Plus”のページ分割に対する問題点は、分割したページごとの見出し(Hタグ)だけで目次を作ってしまう点です。また、ページ内に1つしか見出しが存在しないと、目次自体が表示されない問題もあります。

 今回紹介する改造では、以下の効果が得られます。

  • ページごとに記事全体の目次を表示
  • ページ内に見出しが1つしかなくても、記事内に2つ以上の見出しがあれば目次を表示
  • 同じページ内は目次からタグ移動可能(ページの再読み込みをしない)
  • ページ分割しない場合はデフォルトと同じ動作

 現状、本ブログでページ分割している記事を以下に紹介します。改造した”Table of Contents Plus”の動作を確認できます。

 ページ分割している理由は、「文章が長いから」が一番多いです。ネタバレを避けるために最後にページ分割し、読みたい人だけに読んでもらうなどの理由もあります。あくまで読者の読みやすさ重視で分割しているつもりです。

改造方法

プラグインディレクトリをコピー

 安全のため”Table of Contents Plus”のディレクトリを別名でコピーします。改造はコピーしたプラグインに対して行います。

プラグインのコピー

プラグインのコピー

 WordPressインストールディレクトリの下のwp-content、pluginsの下に”table-of-contents-plus”ディレクトリがあります。これをFTPクライアント等で”table-of-contents-plus-ex”としてコピーします(オリジナルが不要であれば、プラグイン停止後にディレクトリの名前変更でも可)。

 シェルが使用できる方は以下のコマンドを実行すればコピー可能です。

# cd "WordPressインストールディレクトリ"
# cd wp-content/plugins
# cp -pR table-of-contents-plus table-of-contents-plus-ex

 次にコピー先のtoc.hファイルをFTPクライアントなどを経由して編集します(シェルにログイン可能な方はviエディタ等でも可)。3行目がプラグイン名なので、これを”Table of Contents Plus Exに変えます。”

1
2
3
4
<?php
/*
Plugin Name:    Table of Contents Plus Ex
Plugin URI:     http://dublue.com/plugins/toc/

 ここでWordPressのプラグインの一覧ページを見ると”Table of Contents Plus Ex”と言う名前のプラグインが追加されている事が分かります。これで本家の”Table of Contents Plus”が更新されても影響を受けずに済みます。また、何か改造による問題があってもすぐに戻すことができます。

プラグインの改造

 ここから本格的に”Table of Contents Plus”のソースコードを改造します。対象となるバージョンは2017年12月17日時点で最新版の1601です。WordPressのバージョン4.9.1–jaで動作確認しています。

プラグインの編集画面

プラグインの編集画面

 プラグイン編集画面から”Table of Contents Plus Ex”を選択し、プラグインファイルから”toc.php”を選んで下さい。ソースコードの編集はこの画面で行います。

 1箇所目、1311行目に”global $post;”を挿入します。

1307
1308
1309
1310
1311
1312
1313
1314
* is everything between and NOT including <ul> and </ul>
 */
public function extract_headings( &$find, &$replace, $content = '' )
{
    global $post;
    $matches = array();
    $anchor = '';
    $items = false;

 2箇所目、1376行目の条件式を以下の内容に変更します。横に長いので横スクロールして表示して下さい。

1375
1376
1377
1378
// check minimum number of headings
if ( count($matches) >= $this->options['start'] || (preg_match( '<!--nextpage-->', $post->post_content ) && count($matches) >= 1) ) {
 
    for ($i = 0; $i < count($matches); $i++) {

 3箇所目は1456行目に”global $wp_query;”を挿入し、4箇所目は1465行目以降の行を挿入します。

1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
function the_content( $content )
{
    global $post;
    global $wp_query;
    $items = $css_classes = $anchor = '';
    $custom_toc_position = strpos($content, '<!--TOC-->');
    $find = $replace = array();
 
    if ( $this->is_eligible($custom_toc_position) ) {
         
        $items = $this->extract_headings($find, $replace, $content);
 
        if ( preg_match( '<!--nextpage-->', $post->post_content ) ) {
            $pages = explode( '<!--nextpage-->', $post->post_content );
            $page_items = '';
 
            foreach ( $pages as $key => $page ) {
                $page_num = $key + 1;
                $page_items .= "<li>ページ". $page_num. "</li>";
                $toc_items = toc_get_index( $page );
                $pre_page = $wp_query->query["page"] ? $wp_query->query["page"] : 1;
                if ( $page_num == $pre_page ) {
                    $page_items .= $toc_items;
                } else {
                    $page_items .= preg_replace( "!#!", get_permalink( $post->ID ) . $page_num . '#', $toc_items );
                }
            }
 
            $items = $page_items;
        }

 以上で作業は完了です。

 プラグイン一覧からオリジナルの”Table of Contents Plus”を停止し、”Table of Contents Plus Ex”を有効にすれば、今回の改造が有効になります。

 ソースコードの改造内容について補足しておきます。このコードはWordPress Snippet様の以下の記事のコードの一部を流用及び改良したものです。

 また、”Table of Contents Plus”が将来的にページ分割に対応すると書かれているある記事を見かけましたが、作者が対応しないとどこかの掲示板に書いているのを読みました。この改造に着手するきっかけは、それが理由でした。

 ページ分割に対応しない理由は、ページ分割後の目次の見せ方の要望が人によって違うため、対応が難しいといった内容だったと記憶しています。どこの掲示板で読んだかも忘れてしまったため、不確かな情報ですが、念のため書き記しておきます。

 おそらく、この改造内容では気に入らない人もいると思いますが、それはご自身で対応なさって下さい(実はこの記事の目次にページ番号が入ってしまっていますが、ソースコード部分のnextpageに反応してしまっています。意図した動作ではないですが取りあえず放置です)。

ページ分割でアクセス数はどうなる?

 ページ数を2ページ、3ページに分割すれば、アクセス数が2倍、3倍になると思っている人もいるかもしれません。しかし、それは間違いです。

 以前、ページ分割によるアクセス数の変化について調べたことがあります。

 映画「オデッセイ」の解説記事は4ページに分割しています。この記事は1万2千字を超える長い記事です。

 この記事では、1ページ目のアクセス数を100%とすると、2ページは50%、3ページ目は48%、4ページ目は45%ぐらいのアクセス数でした。2ページ目まで読んでもらえれば、ほぼ最後まで読んでもらえているようです。

 逆に意外と1ページ目で帰ってしまう読者が多いことも分かります。原因はこの記事の文章が長すぎる事が一因だと思います。短い記事だと違う結果になるかもしれませんが、あまり短い記事をページ分割したくないので確認したことはありません。

 内容が薄いのにページ分割しまくっている記事をたまに見かけますが、ページ分割を嫌がる読者も多いと思うので、長文記事や画像が多い記事などに限定して分割することをおすすめします。

:)
S