目次の作り方
長めの記事を作ったとき、ユーザーに必要な情報を素早く得てもらうためにも、目次って必要ですよね。
でもいちいち目次書くのもめんどくさい方必見。コピペでコンテンツ内にあるh2、h3を目次にしてくれます。
もちろんページ内リンク付き。
このサイトで使っている目次のcssも載せているので、コピペで速攻使用可能です。
functionに以下をコピペ
function my_add_content( $content ) {
if ( is_single() ) {
$pattern = '/<h[2-3]>(.*?)<\/h[2-3]>/i';
preg_match_all( $pattern, $content, $matches, PREG_SET_ORDER );
if( count( $matches ) > 3 ){
$toc = '<div class="mokubox"><div class="mokuji">もくじ</div><ol>';
$hierarchy = NULL;
$i = 0;
foreach( $matches as $element ){
$i++;
$id = 'chapter-' . $i;
$chapter = preg_replace( '/<(.+?)>(.+?)<\/(.+?)>/', '<$1 id ="' . $id . '">$2</$3>', $element[0] );
$content = preg_replace( $pattern, $chapter, $content, 1);
if( strpos( $element[0], '<h2' ) === 0 ){
$level = 0;
}else{
$level = 1;
}
if( $hierarchy === $level ){
$toc .= '</li>';
}elseif( $hierarchy < $level ){
$toc .= '<ol>';
$hierarchy = 1;
}elseif( $hierarchy > $level ){
$toc .= '</li></ol></li>';
$hierarchy = 0;
}elseif( $i == 1 ){
$hierarchy = 0;
}
$title = $element[1];
$toc .= '<li><a href="#' . $id . '">' . $title . '</a>';
}
if( $level == 0 ){
$toc .= '</li></ol></div>';
}elseif( $level == 1 ){
$toc .= '</li></ol></li></ol></div>';
}
$content = $toc . $content;
}
}
return $content;
}
add_filter( 'the_content', 'my_add_content' );
cssに以下をコピペ
最初のcontent:none はリセットをかけている感じです。
リストなどに装飾をしていなければ、削除してください。
スマホサイズ(768px幅以下)になったときに余白の調整をしています。
ブレイクポイントはサイトに合わせて調整してください。
.mokubox li:before,.entry-content .mokubox ol li:before,.entry-content .mokubox ol li:after {
content: none;
}
.entry-content .mokubox ol {
border: none;
list-style-type: decimal !important;
}
.mokubox {
padding: 1rem 2rem;
border: solid 2px #5c9ee7;
}
.mokubox ol {
margin: 0;
margin-left: 1rem;
}
.mokubox ol li {
padding-left: 1rem;
}
.mokubox .mokuji {
margin-top: 1rem;
position: relative;
padding-left: 2rem;
font-size: 1.2rem;
font-weight: bold;
letter-spacing: 2px;
}
.mokubox .mokuji:before {
content: "";
position: absolute;
top: 50%;
left: 5px;
margin-top: -12px;
width: 20px;
height: 20px;
border: 4px solid #325A8C;
border-radius: 100%;
box-sizing: border-box;
}
.mokubox a {
display: block;
border-bottom: 1px dashed #888;
text-decoration: none;
}
.entry-content .mokubox :nth-child(2) ol {
margin-left: 0;
padding-right: 0;
}
.entry-content .mokubox :nth-child(2) ol li {
padding-right: 0;
}
.entry-content .mokubox :nth-child(2) ol li:before {
content: "∟";
left: -2.35rem;
background: none;
color: #333;
font-family: serif;
top: 1.2rem;
font-size: 0.5rem;
}
@media screen and (max-width:768px) {
.mokubox {
padding: 1rem;
}
.mokubox ol li {
padding-left: 0;
}
.entry-content .mokubox ol {
margin-left: 0.5rem;
padding-right: 0;
padding-left: 0.75rem;
}
めちゃくちゃ簡単。10秒でできますね。
注意するポイント
全投稿ページに表示するように指示されていますが、記事内の見出しの数によっては表示されません。
記事内にh2、h3が3つ以上ないと生成されないので、目次が表示されていないときは、見出しを確認してください。