コンテンツの目次を追加

実装イメージ

こんな感じで、右側のカラムの中にあるh1〜h5までのタグを自動で拾ってきて、左のカラムの目次として表示してくれます。
もちろん、左の目次をクリックすると、右のカラムが自動でスクロールしてくれる。
もちろん、画面をスクロールしても左側の目次からむは追随してくれる。

コード

javascript

function create_index_list($subtitle = 'grande') {
    if ($subtitle == 'h1-h2') {
        subtitles = document.getElementById('single-content-wrapper').querySelectorAll('h1,h2');
    } else {
        subtitles = document.getElementById('single-content-wrapper').querySelectorAll('h1,h2,h3');
    }
    document.currentScript.parentNode.appendChild(target_el = document.createElement('div'));
    target_el.appendChild(el_h1 = document.createElement('ul'));
    for (i = 0; i < subtitles.length; i++) {
        spacing_class = '';
        switch (subtitles[i].tagName) {
            case 'H1':
                spacing_class = 'ms-0';
                break;
            case 'H2':
                spacing_class = 'ms-2';
                break;
            case 'H3':
                spacing_class = 'ms-4';
                break;
            default:
                spacing_class = 'ms-4';
                break;
        }
        subtitles[i].id = `subtitle-${i}`;
        subtitles[i].classList.add('text-secondary');
        target_el.appendChild(el = document.createElement('a'));
        el.innerHTML = `<i class="bi bi-bookmark me-2"></i>${subtitles[i].textContent}`;
        el.className = `my-2 d-block text-muted ${spacing_class}`;
        el.style = `font-size: 90%;`;
        el.href = `#subtitle-${i}`;
    }
}
bootstrapでサイドバー固定

javascriptで動的にレスポンシブな目次を生成しています。
あんまり好ましくない方法だろうけども、Bootstrapでレスポンシブしようと思えばこれが今のところベスト。

<?php get_header(); ?>

<?php if (have_posts()) : ?>
  <?php while (have_posts()) : the_post(); ?>
    <section class="container-fluid py-3 py-lg-5">
      <div class="row">
        <div class="order-2 col-12 col-lg-6">
          <article class="p-1 p-lg-0">
            <div id='single-content-wrapper' class="post_body">
              <div>
                <div class='min-vh-40 d-flex align-items-center'>
                  <div class=''>
                    <h4>
                      <?php the_title(); ?>
                    </h4>
                  </div>
                </div>
                <div class="container-fluid px-0">
                  <div class="row">
                    <div class='col-12 order-2'>
                      <?php the_content(); ?>
                    </div>
                    <div class='col-12 order-1 d-lg-none d-block bg-light'>
                      <div class='py-5'>
                        <script>
                          create_index_list()
                        </script>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </article>
        </div>
        <div class="order-1 col-12 col-lg-3 offset-lg-1 d-lg-block d-none">
          <div class='sticky-top pt-4'>
            <script>
              create_index_list('')
            </script>
          </div>
        </div>
    </section>
  <?php endwhile; ?>
<?php else : ?>
  <div>記事が存在していない。</div>
<?php endif; ?>


<?php get_footer(); ?>