web制作

WordPress固定ページにページネーションと投稿一覧を設置する方法

本ページにはプロモーションが含まれています。

現在フリーのweb制作者として活動しているしょーご(@samuraibrass)です。

WordPressの固定ページにページネーションを表示する方法をコピペでできるように、解説していきます。

しょーごログさんの参考記事  90分彷徨ってこの記事を見つけ、この通りやったら本当に3分でできた笑

さっそく実装していきましょう。

しょーご

この記事を書いたのは
しょーご@samurabrass

当ブログ「しょーごログ」の運営者。2018年からWeb制作・フロントエンドエンジニアとして主にWordPressでのサイト制作やシステム開発のフロントエンドを担当。同時にブログとYouTubeで情報発信を行っている。駆け出しエンジニアのコーディング課題添削も行い、スクール講師を4年以上している経験を活かした分かりやすい記事制作を心がけている。

\現役エンジニアのレビュー付き/

実践レベルのコーディング課題公開中

デザインカンプからのコーディング練習課題【オリジナルポートフォリオを準備できるようになりました】
販売ページはこちら
  • デザインカンプからのコーディングを経験したい
  • 現役エンジニアのレビューを受けてみたい
  • 即戦力級のポートフォリオを用意したい

2024年にデザインを完全リニューアルしています!

コーディングに自身をつけるにはプロからのレビューを貰うのが必須なため、制作会社も利用するレビューツールで添削をしています。

しょーごログ-コーディング課題のレビュー
レビューの様子

Web制作学習ロードマップにも取り入れているため、学習終了まで迷わず進むことが可能です。コーディングを本気で仕事したい方はぜひご活用ください!

無料の入門編から本格企業サイトまで/

なぜWordPress固定ページではページネーションが出せないのか

WordPressの固定ページで標準のページネーション機能(the_posts_pagination())が使えない理由は、この関数がブログ投稿アーカイブページ用に設計されているためです。

固定ページは通常、単一のコンテンツを表示するためのものであり、複数の投稿をリストアップするものではありません。

固定ページでページネーションを実装する方法はいくつかあります。

  1. カスタムクエリを使用する: 固定ページ内でカスタムクエリを作成し、そのクエリに基づいてページネーションを実装することができます。
  2. プラグインを使用する: 固定ページ内でページネーションを可能にするプラグインがいくつか存在します。
  3. コンテンツを分割する: WordPressの「続きを読む」タグ(<!–nextpage–>)を使用して、長いコンテンツを複数のページに分割することができます。
  4. カスタム関数を作成する: 固定ページ用のカスタムページネーション関数を作成することも可能です。

今回はこの中で一番万能な、「❶カスタムクエリを使用する」を取り上げます。

固定ページでページネーションするコード

とりあえずコードだけコピペしたい方は以下をどうぞ。

<?php
 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
 $the_query = new WP_Query( array(
     'post_status' => 'publish',
     'paged' => $paged,
     'posts_per_page' => 5, // 表示件数
     'orderby'     => 'date',
     'order' => 'DESC'
 ) );
  
  
 if ($the_query->have_posts()) :?><?php
    while ($the_query->have_posts()) : $the_query->the_post();?>
//コンテンツ
<?php endwhile;?><?php endif; ?>
<!-- pagenation -->
<div class="pagenation">
<?php 
if ($the_query->max_num_pages > 1) {
    echo paginate_links(array(
        'base' => get_pagenum_link(1) . '%_%',
        'format' => 'page/%#%/',
        'current' => max(1, $paged),
        'mid_size' => 1,
        'total' => $the_query->max_num_pages
    ));
}
wp_reset_postdata();?>
</div><!-- /pagenation -->

全体の流れ

  1. 現在のページ番号を取得し、クエリを設定
  2. 投稿が存在する場合にループで投稿を表示
  3. 複数ページが存在する場合にページネーションを表示
  4. クエリ後にグローバルな投稿データをリセット

このようにして、固定ページで複数の投稿を表示し、ページネーションを実現します。

固定ページ-ページネーションの詳細解説

詳しくコードを解説します。

❶クエリの設定

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$the_query = new WP_Query( array(
    'post_status' => 'publish',
    'paged' => $paged,
    'posts_per_page' => 5, // 表示件数
    'orderby' => 'date',
    'order' => 'DESC'
));

$paged:現在のページ番号を取得します。get_query_var(‘paged’) は現在のページ番号を取得し、指定がなければ1ページ目をデフォルトにします。
WP_Query:カスタムクエリを作成します。ここでは公開されている投稿(post_statusがpublish)を、1ページに5件ずつ(posts_per_pageが5)、日付で降順(orderbyがdate、orderがDESC)に並べて取得します。

❷投稿の表示

if ($the_query->have_posts()) :
    while ($the_query->have_posts()) : $the_query->the_post();
        // コンテンツ
    endwhile;
endif;

if ($the_query->have_posts()):投稿が存在する場合にループを開始します。
while ($the_query->have_posts()) : $the_query->the_post();:投稿を1つずつ取得して表示します。ここに表示するコンテンツを記述します。

❸ページネーションの設定

<div class="pagenation">
<?php 
if ($the_query->max_num_pages > 1) {
    echo paginate_links(array(
        'base' => get_pagenum_link(1) . '%_%',
        'format' => 'page/%#%/',
        'current' => max(1, $paged),
        'mid_size' => 1,
        'total' => $the_query->max_num_pages
    ));
}
wp_reset_postdata();
?>
</div>

if ($the_query->max_num_pages > 1):複数のページがある場合にページネーションを表示します。
paginate_links:ページネーションリンクを生成します。

  • ‘base’ => get_pagenum_link(1) . ‘%_%’:ページ番号のベースURLを設定します。
  • ‘format’ => ‘page/%#%/’:ページ番号のフォーマットを設定します。
  • ‘current’ => max(1, $paged):現在のページ番号を設定します。
  • ‘mid_size’ => 1:現在のページ番号の前後に表示するページ番号の数を設定します。
  • ‘total’ => $the_query->max_num_pages:総ページ数を設定します。


wp_reset_postdata():カスタムクエリの後にグローバルな投稿データをリセットします。

固定ページはサブループをWP_Queryで回す

foreachで回しても良いですが、ページネーションならこっちの方が都合がいいし、個人的にWP_Queryは使い勝手がよくて好きなので…

サブループ内のキーと値は、公式リファレンスを参考にお好みで。

最新順に、5つ表示になってます。

paginate_links ページネーション内処理まとめ

paginate_linksのキーと値の設定を以下にまとめました。

キー値の説明サンプル値
baseページ番号のベースURLを設定します。get_pagenum_link(1)%_%を追加することでページリンクのベースを作成します。get_pagenum_link(1) . '%_%'
formatページ番号のフォーマットを指定します。%#%がページ番号に置き換えられます。'page/%#%/'
current現在のページ番号を設定します。max(1, $paged)は、最小値が1となるようにします。max(1, $paged)
mid_size現在のページ番号の前後に表示するページ番号の数を設定します。1
total総ページ数を設定します。$the_query->max_num_pages
prev_text前のページリンクに表示するテキストを設定します。省略可能です。'&laquo; Previous'
next_text次のページリンクに表示するテキストを設定します。省略可能です。'Next &raquo;'
end_size最初と最後に表示するページ番号の数を設定します。省略可能です。1
show_alltrueに設定すると全てのページ番号を表示します。省略可能です。false
typeページネーションの戻り値の形式を指定します。省略可能です。plain(デフォルト)、arraylistが使用できます。'plain'
add_argsページ番号リンクに追加するクエリ引数を設定します。省略可能です。array('foo' => 'bar')
add_fragmentページ番号リンクに追加するフラグメント(#以下の部分)を設定します。省略可能です。'#content'

実績一覧や商品一覧によく使う

記事一覧ページなんて、archive.phpやcategory.phpの仕事やろ!

とは言え、決まったカテゴリーの投稿を、決まったスラッグで運用するのなら、固定ページで投稿一覧を作った方が効率が良い場合があります。

特にグローバルナビゲーションなどメニューに載せたい場合などです。

スラッグも間に「category」などを挟まないため、

sample.com/works

のようにシンプルにできます(スラッグ指定されてる案件も多いので)。

独自レイアウトの固定ページで一覧ページを作るなら、例えば実績一覧ページなら

page-works.php

など、独自の固定ページを作成して上記コードを埋め込めば、独自レイアウトで投稿一覧をページャー付きで実装できます。

しょーご

以下宣伝です!

実案件レベルのWordPress課題を出しています

私が出している「コーディング課題-上級編」では、実案件レベルのWordPressサイト制作を練習することが可能です。

ポートフォリオとしてそのまま活用可能です。

コーディング課題 上級
課題デザインの一部抜粋
しょーご

ページネーションについても下層で二箇所実装場所があります。ぜひ練習してみてください!

模擬案件チャレンジ開催のお知らせ

超実践編では納期厳守の模擬案件を経験し、スキル面以外にコミュニケーションも徹底レビューを受けることができます。

【超実践編】納期厳守の模擬コーディング案件で実務への自信を身につける!【学習沼からあなたを卒業させます】

最近は実案件のノウハウも多いですが、「納期が短い案件の中で、丁寧なコミュニケーションを本当に実践できますか?

この課題では、極限まで実案件に近い状況で、発注者である私とコミュニケーションを取りながら、

  1. 見積書提出
  2. 実装→初稿提出
  3. レビュー→修正
  4. 再修正→納品
  5. 請求書

この流れを実践していただき、最後にzoomであなたに全体レビューを行います。

【超実践編】納期厳守の模擬コーディング案件で実務への自信を身につける!【学習沼からあなたを卒業させます】
  • 学習はだいたい終わったけど、納期までに納品できるか不安
  • 中々継続と紹介で案件が回らない

このような中級者を飛躍させる超実践編、受講には条件がありますので、詳細はリンク先よりご確認下さい。

しょーご

あなたの挑戦を待っています!!

\レビューを受けて圧倒的な自信を身につける!/

応援して頂ける方へ

ご寄付を頂けると今後の更新の励みになります!

🍺 ビールをプレゼントする

あなたに是非読んでほしい記事です!
});