フロントページ「タブ一覧」のカテゴリーにページネーションを表示する方法

Cocoonカスタマイズ集
この記事は約7分で読めます。
記事内に広告が含まれています。

はじめに

Cocoon設定の「インデックス」で、フロントページタイプを「タブ一覧」に設定している場合、通常は「新着記事」以外のカテゴリータブにはページネーションではなく「もっと見る」ボタンが表示されます。

以下の記事では、カテゴリータブの「もっと見る」ボタンから2ページ目へ直接遷移させる方法を紹介しました。

そこで今回はさらに一歩進めて、「新着記事」タブと同様にカテゴリータブにもページネーションを表示させ、全体のデザインと操作性を統一します。

この記事では、この方法について説明します。

「もっと見る」と「ページネーション」の比較

フロントページタイプ「タブ一覧」において、カテゴリータブのナビゲーションをどのようにカスタマイズするかによって、訪れたユーザーの記事の探しやすさやサイト全体の統一感が大きく変わります。

全アプローチに共通する課題として、カテゴリーページに一度移行した後は1ページ目をクリックしても新着記事タブのようにフロントページに戻るわけではない点に留意しつつ、主な3つの方法の特徴をまとめました(表1参照)。

3つのアプローチによる違い
#パターンメリットデメリット
1 現行(1ページ目へ遷移)
  • 見慣れた標準ボタンで迷わず押せる
  • タブで見た記事が再度並び、二度手間感がある

  • 「続きが見られる」という期待とズレが生じる
2「もっと見る」2ページ目化
  • 「続き(2ページ目)を読む」流れが非常にスムーズ
  • 「3ページ目」など深いページへ直接飛ぶことはできない
3 ページネーション化
  • 「新着記事」タブとデザイン・仕様が完全に揃う

  • 2、3など見たいページへ直接ジャンプできる
  • 数字ボタンが並ぶため、画面の要素数が少し増える

ページネーション化を導入するメリット

「もっと見る」ボタンを2ページ目化する方法もシンプルで優れていますが、本記事で紹介するページネーション化には、サイト全体の完成度を高める大きな特徴があります。

  • 「新着記事」タブとの完全なデザイン統一
  • カテゴリー内の過去記事への直接アクセス(高い回遊性)

サイト全体のナビゲーション領域に統一感を持たせつつ、読者が過去記事を探しやすくしたい場合に非常に効果的です。

完成イメージ

実装手順

以下の手順で実装しまs。

  • ラベル
    PHPを追加

    以下のコードをfunctions.phpに追加します。

    add_filter('cocoon_part__tmp/list-tab-index', function ($content, $name, $args) {
      if (!is_front_page_type_tab_index()) {
        return $content;
      }
    
      // タブに表示するカテゴリIDを取得
      $cat_ids = get_index_list_category_ids();
      if (empty($cat_ids)) {
        return $content;
      }
    
      // 最大表示タブ数を取得
      $cat_count = apply_filters('cocoon_index_max_category_tab_count', 3);
    
      global $wp_rewrite;
    
      $number = 1;
      $target_cats = array_slice($cat_ids, 0, $cat_count);
    
      foreach ($target_cats as $cat_id) {
        // カテゴリなしは処理対象外
        if (!is_category_exist($cat_id)) {
          continue;
        }
    
        $number++;
    
        // カテゴリの総ページ数を取得
        $query = new WP_Query([
          'post_type'        => 'post',
          'posts_per_page'   => get_option_posts_per_page(),
          'cat'              => (int) $cat_id,
          'category__not_in' => get_archive_exclude_category_ids(),
          'post__not_in'     => get_archive_exclude_post_ids(),
          'no_found_rows'    => false,
        ]);
    
        // 1ページ以下は処理対象外
        if ($query->max_num_pages <= 1) {
          continue;
        }
    
        $category_link = esc_url(get_category_link($cat_id));
        $is_permalink  = $wp_rewrite->using_permalinks();
    
        // 2ページ目のURLを設定
        $next_url = $category_link;
        if ($is_permalink) {
          $next_url = user_trailingslashit(trailingslashit($next_url) . 'page/2', 'paged');
        } else {
          $next_url = add_query_arg('paged', 2, $next_url);
        }
    
        $next_caption = apply_filters('pagination_next_link_caption', __('次のページ', THEME_NAME));
    
        ob_start();
        ?>
        <div class="pagination-next tab-category-pagination">
          <a href="<?= $next_url; ?>" class="pagination-next-link key-btn"><?= $next_caption; ?></a>
        </div>
    
        <div class="pagination tab-category-pagination">
          <?= paginate_links([
            'base'      => $category_link . '%_%',
            'format'    => $is_permalink ? user_trailingslashit('page/%#%', 'paged') : '?paged=%#%',
            'total'     => $query->max_num_pages,
            'current'   => 1,
            'mid_size'  => 1,
            'prev_text' => '<span class="screen-reader-text">' . __('前へ', THEME_NAME) . '</span><span class="fa fa-angle-left" aria-hidden="true"></span>',
            'next_text' => '<span class="screen-reader-text">' . __('次へ', THEME_NAME) . '</span><span class="fa fa-angle-right" aria-hidden="true"></span>',
          ]); ?>
        </div>
        <?php
        $pagination_html = ob_get_clean();
    
        // 対象タブの「もっと見る」ボタンをページネーションに置換
        $content = preg_replace(
          '/(<div class="tab-cont tb' . $number . '">.*?)(<div class="list-more-button-wrap">.*?<\/div>)/s',
          '$1' . $pagination_html,
          $content
        );
      }
    
      return $content;
    }, 10, 3);
  • ラベル
    CSSを追加

    以下のコードをstyle.cssに追加します。

    .tab-category-pagination {
      display: block !important;
    }
    
    .tab-cont:has(.tab-category-pagination) .list {
      margin-bottom: 3rem;
    }

さいごに

今回紹介した方法を使えば、Cocoonのフロントページ「タブ一覧」において、カテゴリーごとの表示を「もっと見る」ボタンから使いやすいページネーションへと変更することができます。
新着記事タブとデザインが統一されることでサイト全体の美観が向上するだけでなく、ユーザーがアーカイブページに移動することなくシームレスに過去記事を探せるようになります。

タイトルとURLをコピーしました