WordPressの各固定ページをまとめて目次を作る


連載「編集者からみた、原稿執筆の一工夫」をはじめるにあたり、やりたいことが2つあった。
連載は固定ページに書くが、複数固定ページに分かれた場合でもそれらをまとめて目次を作りたかったため、

1.各固定ページの見出し1(H1)だけの目次を作る
2.各固定ページ内で目次を作る

という、2種類の目次設定である。

2に関しては、プラグイン「Table of Contents Plus」を使って、少しいじくることで解決した。
1に関して情報を探したところ、以下のサイトを参考にさせていただいた。

使用環境にあわせて修正する

やるべきことは4つ。

1.新しいphpファイルを用意する
2.function.phpを修正する
3.ショートコードを書く
4.style.cssを修正する

1.新しいphpファイルを用意する

参考サイトでは、「series_cat.php」を用意したが、ここでは、「rensai.php」を用意する。

<?php
$series_list = array(
    "(記事URL) => "(記事タイトル)",
);
 
//現在表示しているページのURL
$current_url = (empty($_SERVER["HTTPS"]) ? "https://" : "https://") .
    $_SERVER["HTTP_HOST"] .
    $_SERVER["REQUEST_URI"];
 
//リストのHTML生成
$ret_list = "<ol class='series_list'>" . "\n";
 
foreach ($series_list as $key => $value) {
//現在表示しているページはリンクを貼らず、右に本記事を表す文字を追記
    if ($current_url === $key) {
        $ret_list .= "<li>" . $value . " ←いま見ている記事</li>" . "\n";
    } else {
        $ret_list .= "<li><a href='" . $key . "'>" . $value . "</a></li>" . "\n";
    }
}
$ret_list .= "</ol>\n";
//echo
echo $ret_list;

2.function.phpを修正する

参考サイトでは、以下となっている。

function short_php($params = array()) {
    extract(shortcode_atts(array(
    'file' => 'default'
    ), $params));
    ob_start();
    include(get_theme_root() . '/' . get_template() . '/' . 'parts' . "/$file.php");
    return ob_get_clean();
}
add_shortcode('seriesphp', 'short_php');

この機能を2つ以上設置する場合の修正点が2カ所。

function aaaaa($params = array()) {
    extract(shortcode_atts(array(
    'file' => 'default'
    ), $params));
    ob_start();
    include(get_theme_root() . '/' . get_template() . '/' . 'parts' . "/$file.php");
    return ob_get_clean();
}
add_shortcode('bbbbb', 'aaaaa');

aaaaa:同じものを用意
bbbbb:ショートコードで使用
複数設置した場合、aaaaaを他のものと変えないと、エラーが出ました。

3.ショートコードを書く

参考サイトでは、以下となっている。

[seriesphp file="series_cat"]

こちらも、以下のように修正する。

bbbbb file="rensai"]

bbbbb:function.phpで修正したものを使用
rensai:用意したphpファイル名を使用

しかし、設定をしても目次が表示されない問題が出てきた。

目次が表示されない:子テーマを使用している場合の表示方法

本サイトは子テーマを使用しているのが、その設定ができていなので表示されないらしいので、以下のサイトを参考に修正したところ、無事に表示された。

修正箇所

include(get_theme_root() . ‘/’ . get_template() . “/$file.php”);

include(STYLESHEETPATH . “/$file.php”);