WordPressの固定ページでページネーションした時のメモ

技術情報

WordPressで記事が増えてきたので、カテゴリ別に表示したくなりました。

そこで固定ページを作って記事のカテゴリごとに表示できるようにしたのですが、ページネーション(次のページへ、のボタン)が表示されず、最新記事5件までというような表示のみになってしまいました。これだと訪問してくれた方が、過去の記事を見つけずらいため、ページネーションをつけることを考えました。

調べてみると投稿ページにはページネーションはあるものの、固定ページはその名の通り固定した内容を表示するので、ページネーションの機能は内容そうです。そのため、プログラムを書いて実装するしかないとのことでした。

ページネーションの実装に必要なphpには詳しくないので、おおよその実装方法を調べつつchatGPTにお願いしながらコードとデザイン用のCSSを作成してもらい何とか表示できるようになったので、ここにその方法とコードを記録しておきます。どなたかの参考になると幸いです。

ページネーションの実装のために大きく3つのことを行いました。①ページネーション用のショートコード作成プログラムの準備、②固定ページにショートコードの記述、③記事の表示デザインのためのCSSの準備。固定ページのテンプレートはデフォルトのものを使いました。

①ページネーション用のショートコード作成プログラムの準備

以下のプログラムをfunction.phpに追記しました。function.phpは、ダッシュボードの「外観>テーマファイルエディター」の右側の列にあるテーマファイルのところにあります。

function shortcode_post_list_with_cards($atts) {
  // 初期値と属性の取得
  $atts = shortcode_atts(array(
    'category_id' => '', // カテゴリID
  ), $atts);

  ob_start();

  $paged = (get_query_var('paged')) ? get_query_var('paged') : (get_query_var('page') ? get_query_var('page') : 1);

  $args = array(
    'post_type' => 'post',
    'posts_per_page' => 6,
    'paged' => $paged,
  );

  // カテゴリIDが指定されていたら追加
  if (!empty($atts['category_id'])) {
    $args['cat'] = (int)$atts['category_id'];  // カテゴリIDを指定
  }

  $the_query = new WP_Query($args);

  if ($the_query->have_posts()):
    echo '<div class="card-container">';
    while ($the_query->have_posts()): $the_query->the_post();
      echo '<div class="card">';
      if (has_post_thumbnail()) {
        echo '<div class="card-thumb"><a href="' . get_permalink() . '">' . get_the_post_thumbnail(null, 'medium') . '</a></div>';
      }
      echo '<div class="card-content">';
      echo '<h2 class="card-title"><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
      echo '<p class="card-excerpt">' . get_the_excerpt() . '</p>';
      echo '</div>';
      echo '</div>';
    endwhile;
    echo '</div>';

    echo '<div class="pagination">';
    echo paginate_links(array(
      'base' => esc_url(add_query_arg('paged', '%#%')),
      'format' => '',
      'current' => max(1, $paged),
      'total' => $the_query->max_num_pages,
      'prev_text' => '前へ',
      'next_text' => '次へ',
    ));
    echo '</div>';
  else:
    echo '<p>投稿が見つかりませんでした。</p>';
  endif;

  wp_reset_postdata();
  return ob_get_clean();
}
add_shortcode('custom_post_cards', 'shortcode_post_list_with_cards');

このショートコードでは、指定された”category_id”の記事を6記事まで表示し、それ以上の部分は「次のページ」へと表示するものです。プログラムの内容までは理解していませんが、6記事以上を表示したければ、以下の部分の数字を変更すればよいと思います。

  $args = array(
    'post_type' => 'post',
    'posts_per_page' => 6,
    'paged' => $paged,
  );

②固定ページにショートコードの記述

固定ページに①で作成したショートコードを記述して、固定ページに記事一覧を表示できるようにします。

[custom_post_cards category_id="13"]

category_id=”13″の13はカテゴリIDです。ダッシュボードの「固定ページ>固定ページ一覧」にあるIDの数字のことです。

③記事の表示デザインのためのCSSの準備

①と②で固定ページに記事とページネーションが表示されます。表示をもう少しかっこよくしたかったので、CSSで表示デザインを行いました。

以下のCSSを追加CSSに記述しました。追加CSSは、ダッシュボードの「外観>カスタマイズ」で左側の列にあります。

.card-container {
  display: flex;
  flex-direction: column;
  margin: 20px 0;
}

.card {
  display: flex;
  align-items: flex-start; /* サムネイルとタイトルを縦中央に揃える */
  border-bottom: 1px solid #ddd;
  padding-bottom: 1px;
}

.card-thumb {
  width: 120px;
  height: 80px;
  flex-shrink: 0;
  margin-right: 15px;
	margin-top:5px;
}

.card-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.card-content {
  flex-grow: 1;
}

.card-title {
  font-family: 'Noto Sans JP', sans-serif;
  font-size: 20px;
  font-weight: bold;
  background-color: transparent !important; /* ← 背景を無色(透明)に */
  margin-bottom: 10px;
  line-height: 1.2;
  height: 80px;
  display: flex;
  align-items: center;
}

.card-title a {
  text-decoration: none;
  color: #000;
}

.card-title a:hover {
  text-decoration: underline;
}

.card-excerpt {
  display: none !important;
}

このCSSで以下のように表示されます。カード形式で左側にアイキャッチの画像で、右側に記事のタイトルが表示されます。

デザインなので好みがあると思います。このCSSも全部chatGPTに書いてもらったので、思い通りになるまで何度も入力すればよいと思います。

コメント

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