WordPressの記事内に目次があると記事内容がすぐに分かり、欲しい情報がすぐに手に入ります。
プラグインを使って簡単に作る方法もありますが、今回はプラグインなしで導入する方法をご紹介します。
コピペで簡単に設定できるので、WordPressのカスタマイズを自身で行っている方はぜひ参考にしてみてください。
プラグインなしで記事に、目次をつける方法を紹介します。
基本的にfunctions.phpに以下のコードをコピペするだけで完了です。
今回は特定のターム(複数)のみに出力させました。
また一番初めのh2の前に目次を入れています。
function add_custom_toc_before_first_h2($content) {
if ( is_singular('カスタム投稿タイプ名') ) {
global $post;
// 特定タームの条件(必要に応じて変更)
if ( has_term(['ターム1','ターム2'], 'タクソ名', $post) ) {
// h2見出しを全部取得
preg_match_all('/<h2[^>]*>(.*?)<\/h2>/i', $content, $matches);
if ( !empty($matches[1]) ) {
$toc = '<div class="toc">';
$toc .= '<h2>目次</h2><ul>';
foreach ( $matches[1] as $index => $heading ) {
$id = 'toc-' . ($index+1); // アンカー用IDを生成
// 見出しタグにIDを付与
$content = preg_replace('/<h2([^>]*)>' . preg_quote($heading, '/') . '<\/h2>/i',
'<h2$1 id="'.$id.'">'.$heading.'</h2>',
$content, 1);
$toc .= '<li><a href="#'.$id.'">'.$heading.'</a></li>';
}
$toc .= '</ul></div>';
// 最初の<h2>の直前に目次を挿入
$pattern = '/(<h2[^>]*>)/i';
$content = preg_replace($pattern, $toc . '$1', $content, 1);
}
}
}
return $content;
}
add_filter('the_content', 'add_custom_toc_before_first_h2');
PHPそして出力されるものは以下です。CSSで自由にカスタマイズしてください。
<div class="toc">
<h2>目次</h2>
<ul>
<li><a href="#toc-1">見出し1</a></li>
<li><a href="#toc-2">見出し2</a></li>
<li><a href="#toc-3">見出し3</a></li>
</ul>
</div>
HTMLh3まで目次に含めた場合は以下のコードを使います。
function add_custom_toc_before_first_h2($content) {
if ( is_singular('カスタム投稿タイプ名') ) {
global $post;
// 特定タームに限定(必要なければ消してOK)
if ( has_term(['ターム1','ターム2'], 'タクソ名', $post) ) {
// h2とh3を全部取得
preg_match_all('/<(h2|h3)[^>]*>(.*?)<\/\1>/is', $content, $matches, PREG_SET_ORDER);
if ( !empty($matches) ) {
$toc = '<div class="toc">';
$toc .= '<h2>目次</h2><ul>';
$prev_level = 2; // 最初はh2想定
$count = 1;
foreach ( $matches as $match ) {
$tag = strtolower($match[1]); // h2 or h3
$text = trim(strip_tags($match[2]));
$id = 'toc-' . $count++;
// 見出しにIDを付与
$content = preg_replace(
'/<' . $tag . '([^>]*)>' . preg_quote($match[2], '/') . '<\/' . $tag . '>/is',
'<' . $tag . '$1 id="'.$id.'">'.$match[2].'</' . $tag . '>',
$content,
1
);
// 目次リスト作成
if ($tag === 'h2') {
if ($prev_level == 3) {
$toc .= '</ul></li>'; // h3階層を閉じる
} elseif ($prev_level == 2) {
$toc .= '</li>'; // 前のh2を閉じる
}
$toc .= '<li><a href="#'.$id.'">'.$text.'</a>';
$prev_level = 2;
} elseif ($tag === 'h3') {
if ($prev_level == 2) {
$toc .= '<ul>'; // h2の下にh3が来たらul開始
}
$toc .= '<li><a href="#'.$id.'">'.$text.'</a></li>';
$prev_level = 3;
}
}
// 閉じタグ整合
if ($prev_level == 3) $toc .= '</ul></li>';
else $toc .= '</li>';
$toc .= '</ul></div>';
// 最初の<h2>の前に目次を挿入
$content = preg_replace('/(<h2[^>]*>)/i', $toc . '$1', $content, 1);
}
}
}
return $content;
}
add_filter('the_content', 'add_custom_toc_before_first_h2', 20);
PHP出力イメージは以下です。
<div class="toc">
<h2>目次</h2>
<ul>
<li><a href="#toc-1">見出し1</a>
<ul>
<li><a href="#toc-2">小見出し1-1</a></li>
<li><a href="#toc-3">小見出し1-2</a></li>
</ul>
</li>
<li><a href="#toc-4">見出し2</a></li>
</ul>
</div>
HTMLワードプレスの記事内に目次を入れることには、たくさんのメリットがあります。
目次はユーザーにとって便利なものだけではなく、SEOの観点からもメリットがあります。
目次があると、その記事の全体の流れや書いてある内容を把握できます。
また目次にアンカーリンクを打っておけば、ユーザーが読みたい場所にすぐに移動することもできます。
特定の情報のみを求めているユーザーにとっては、他の情報は必要ありません。いらない情報を読んでいるうちに「このページには求めている情報はないな」と感じれば、途中離脱することになるでしょう。
目次を入れることは、利便性を高めます。
利便性が高いページ(ユーザーが求めている箇所にすぐ飛べるなど)は、ユーザーエクスペリエンスを向上しGoogleから良質なコンテンツを提供していると判断されやすいです。
また内部リンク効果により「セクションごとに整理された構造をしたページ」として認識されやすくなります。
従って結果的にSEO効果が期待できます。
記事に目次を入れると、検索結果に目次が表示されることもあります。
ユーザーが自分の欲しい情報が目次によって表示されることで、ページへのクリック率(CTR)を上げることができます。
プラグインを入れるとどうしてもメンテが大変になったり、Webサイトが重くなってしまいます。
プラグイン導入は簡単なので多用してしまいがちですが、今回のような簡単な作業ではできる限り自分で作業するようにしましょう。