本文へ移動

ツール連携

WordPressの投稿一覧にページ送りを付ける方法
|WP Query Builderでpagedを設定

WP Query Builderでpagedを設定すると、何ページ目の記事を取得するか指定できます。ただし、「1・2・3」というページ送りのリンクまで自動で付くわけではありません。この記事では、公開中のWP Query Builderで生成したコードに、現在ページの取得とリンクの表示を追加し、2ページ目以降も切り替わる一覧を実装します。

Huddly Huddly 投稿日: 2026年11月10日 読了目安: 7分

WP Query Builderの生成コードに、現在ページの取得とリンク表示を追加します

ページ送りは、posts_per_pageで1ページの件数を決め、pagedへ現在ページ番号を渡し、paginate_links()へ総ページ数と現在ページを渡して完成します。

WP Query Builderは$argsを作る道具です。生成した’paged’ => 2は動作確認用の固定値なので、実装時はget_query_var()で取得した$current_pageへ置き換えます。総ページ数が必要なため、no_found_rowsはfalseにします。

ページ送りは、記事を取る処理とリンクを出す処理に分かれる

投稿一覧の下に「1・2・3」というページ送りを表示するには、記事を取得する処理とリンクを表示する処理を、それぞれ用意する必要があります。WP Query Builderで作るのは記事の取得条件です。生成後のコードに、URLから現在ページを読み取る処理と、ページ送りのリンクを表示する処理を追加します。

役割使う値・関数設定・実装する場所
1ページの件数を決めるposts_per_pageWP Query Builder
取得するページ番号を指定するpaged生成時は固定値、実装時は現在ページへ置換
URLから現在ページを読むget_query_var()WordPressテンプレート
記事を取得するWP_Query生成した$argsを使ってテンプレートで実行
総ページ数を受け取るmax_num_pagesWP_Queryの実行結果
ページ送りのリンクを表示するpaginate_links()WordPressテンプレート

ブロックエディターで一覧を作っている方は、Query Loopブロックのページネーションで実現できるかを先に確認してみてください。PHPを書かずに済む場合があります。

この記事のPHP例は、クラシックテーマのテンプレートに投稿一覧を追加する場合が対象です。 本番サイトを直接編集せず、バックアップを取った検証環境で試しましょう。

まだ一覧を作っていない方は、次の設定手順から進めてください。すでに実装していて困っている方は、後半の症状別の確認表から確認する場所を選べます。

作る一覧の表示場所・投稿タイプ・件数を決める

今回は、通常の固定ページに「公開済みの通常投稿を新しい順に5件ずつ」表示する一覧を作ります。WP Query Builderでは、2ページ目の条件を確認するためにpagedへ2を入力します。あとで、この固定値をURLに応じて変わる値へ置き換えます。

固定ページをサイトのホームページに指定している場合は、現在ページ番号を読み取る方法が異なります。まずは次の4項目を決め、どちらの設置先なのかを確認しましょう。

先に決める4項目

  • 通常投稿ならpost、カスタム投稿なら登録済みの投稿タイプ名を確認する
  • 公開記事の一覧ならpost_statusはpublishにする
  • 1ページに何件出すかを決める。この記事では5件にする
  • 通常の一覧・固定ページ・固定フロントページのどこへ置くか確認する

WP Query Builderで5件・2ページ目の条件を入力する

公開中のWP Query Builderで「詳細設定(全項目)」を選び、「全項目を開く」を押します。「基本設定」で投稿タイプをpost、公開状態をpublish、取得件数を5にします。「ページング / 並び順」のページ番号へ2を入力し、並び方向はDESC、並べ替えの基準はdateを選びます。読み飛ばす件数(offset)は空のままです。

WP Query Builderへ入力する順番

  1. 1
    詳細設定(全項目)を選び、全項目を開く
  2. 2
    投稿タイプをpost、公開状態をpublish、取得件数を5にする
  3. 3
    ページ番号を2にし、読み飛ばす件数は空にする
  4. 4
    並び方向をDESC、並べ替えの基準をdateにする
  5. 5
    性能・キャッシュ設定でno_found_rowsをfalseにする
  6. 6
    生成コードが更新されたことと、エラーや警告がないことを確認する

次の画面では、取得件数が5、ページ番号が2になっていることを見てください。この2つは「2ページ目から5件取得する」という別々の指定です。

WP Query Builderの基本設定で通常投稿post、公開状態publish、取得件数5、ページ番号2を入力した画面
ページング条件1ページ5件・2ページ目で生成する

pagedの2は確認用の固定値です。offset欄の薄い0は入力例で、実際の値は空にしています。

no_found_rowsはfalseを明示する

確認した公開中のWP Query Builderでは、自動高速化がONでno_found_rowsを未指定にすると、生成コードへ’no_found_rows’ => trueが補われます。総件数や総ページ数を使わない一覧では有効な設定ですが、paginate_links()で総ページ数を使うページ送りには向きません。

ページ送りでは総ページ数が必要なので、「総件数の取得を省略」(no_found_rows)をfalseにします。「Performance / Cache」(性能・キャッシュ設定)を開いて変更してください。手動で選んだfalseは自動高速化より優先されます。

WP Query Builderの総件数の取得を省略という入力欄でno_found_rowsをfalseにした画面
総ページ数を残すno_found_rowsをfalseにする

ページリンクにmax_num_pagesを使うため、総件数の計算を省略しません。

設定する場所が分かったら、WP Query Builderで同じ条件を入力してみましょう。生成したコードのpagedを現在ページの変数へ置き換える手順は、この後で説明します。

5件ずつ取得するページ送りの条件を作る

取得件数5・ページ番号2・日付降順で生成し、no_found_rows=falseが入っていることを確認しましょう。

生成されたコードを確認し、pagedの固定値を置き換える

次は、2026年9月6日に公開中のWP Query Builderで上の設定を入力し、生成結果をそのままコピーしたコードです。キャッシュ関連の自動設定も省略していません。pagedが2なので、このまま実行すると常に2ページ目の投稿を取得します。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPbuilder-generated-pagination.php公開WP Query Builderからコピーした未編集の取得条件
$args = array(    'post_type' => 'post',    'post_status' => 'publish',    'posts_per_page' => 5,    'paged' => 2,    'order' => 'DESC',    'orderby' => 'date',    'no_found_rows' => false,    'ignore_sticky_posts' => true,    'update_post_meta_cache' => false,    'update_post_term_cache' => false,    'lazy_load_term_meta' => false);

生成した’paged’ => 2を残すと、何ページ目を開いても2ページ目の投稿を取得します。 実装では、URLから読み取った現在ページ番号を$current_pageへ入れ、’paged’ => $current_pageへ置き換えます。取得条件の配列はこの1行だけを変更し、前後に現在ページの取得と表示処理を追加します。全体のコードは、この後で紹介します。

公開WP Query Builderが生成した1ページ5件・2ページ目・日付降順・no_found_rows falseのコード
未編集の生成結果本文と同じコードが生成されていることを確認する

この段階では取得条件だけです。まだ投稿一覧やページ送りリンクは表示されません。

生成コードに表示処理を加えたら、本番と分けたWordPress環境でページ送りを試します。検証や公開に使うサーバーをこれから用意する方は、XserverのPHP対応・バックアップ・料金も確認できます。

日本語の物語でも条件を読み返してみる

コードの下にある「日本語の物語」では、同じ条件を文章でも確認できます。今回なら「通常投稿」「公開済み」「2ページ目」「5件」「公開日の降順」が出てくるので、入力したつもりの条件と合っているか読み返してみましょう。少し遊び心のある説明ですが、実際の投稿を取得した結果ではありません。動作は次のコードをWordPressで実行して確かめます。

同じ取得条件を通常投稿・公開済み・2ページ目の5件・公開日の降順と説明する日本語の物語
日本語で条件を確認物語に出てくる件数とページ番号も見てみる

生成条件を文章にした説明です。実際のWordPressでの取得結果とは区別してください。

通常のテンプレートでページ送りまで実装する

次は、生成した$argsの’paged’ => 2だけを’paged’ => $current_pageへ置き換え、現在ページの取得、投稿を表示するループ、ページ送り、投稿データのリセットを追加したコードです。自動で出力されたキャッシュ設定は残しています。今回はタイトルとリンクだけを表示しますが、画像・カテゴリー・カスタムフィールドを追加するときは、必要な先読み設定も見直してください。

子テーマのtemplate-parts/paginated-post-list.phpへ保存し、通常の固定ページを表示するpage.phpなどからget_template_part( ‘template-parts/paginated-post-list’ );で1回呼び出します。呼び出す場所は、固定ページの本文を出すメインループを終えた後など、一覧を表示したい位置です。すでに一覧がある場合は置き換え、二重に表示しないようにしてください。PHPを投稿エディターへ貼り付ける例ではありません。

次のコードにはPHP開始タグが付いています。新規ファイルならそのまま保存し、既存のPHP内へ追加するときは先頭の<?phpを除きます。page.phpから呼び出す1行もPHPの内側へ記述してください。

クラシックテーマのテンプレート(またはテンプレートパーツ)で、一覧を表示したい位置に置く例です。投稿本文やfunctions.phpへ、そのまま貼るコードではありません。

PHPtemplate-parts/paginated-post-list.php通常投稿を5件ずつ表示し、ページ送りリンクを付ける
<?php$current_page = max( 1, absint( get_query_var( 'paged', 1 ) ) ); $args = array(    'post_type' => 'post',    'post_status' => 'publish',    'posts_per_page' => 5,    'paged' => $current_page,    'order' => 'DESC',    'orderby' => 'date',    'no_found_rows' => false,    'ignore_sticky_posts' => true,    'update_post_meta_cache' => false,    'update_post_term_cache' => false,    'lazy_load_term_meta' => false); $post_list = new WP_Query( $args ); if ( $post_list->have_posts() ) {   echo '<ul class="post-list">';    while ( $post_list->have_posts() ) {      $post_list->the_post();      printf(         '<li><a href="%1$s">%2$s</a></li>',         esc_url( get_permalink() ),         esc_html( get_the_title() )      );   }    echo '</ul>';    $pagination = paginate_links(      [         'total'   => $post_list->max_num_pages,         'current' => $current_page,         'type'    => 'list',      ]   );    if ( $pagination ) {      echo '<nav aria-label="投稿一覧のページ送り">';      echo wp_kses_post( $pagination );      echo '</nav>';   }} else {   echo '<p>表示できる記事がありません。</p>';} wp_reset_postdata();

最初のget_query_var( ‘paged’, 1 )は、WordPressがURLから読み取ったページ番号を取得する処理です。値がないときは第2引数の1を使います。absint()で0以上の整数へ整え、max()で最低でも1になるようにしています。

paginate_links()のtotalには、この独自WP_Queryが持つmax_num_pagesを渡します。currentには、取得条件のpagedへ渡したものと同じ$current_pageを使います。typeをlistにすると、ページ番号がul要素の一覧として返ります。最後のwp_kses_post()は、WordPressの記事本文で許可されるHTMLだけを残して出力する処理です。

投稿を取得するときとリンクを出すときで、同じ現在ページ番号と、同じクエリの総ページ数を使います。 参照先を混ぜると、表示中の記事とページ送りの現在位置がずれます。

固定フロントページではpageへ切り替える

通常の固定ページでは、上のコードのget_query_var( ‘paged’, 1 )を使います。一方、「設定 → 表示設定」で固定ページをホームページに指定し、そのホームページへ一覧を置く場合は、get_query_var( ‘page’, 1 )から番号を読み取ります。WP_Queryの取得条件へ渡すキーは、どちらもpagedのままです。

上のテンプレートパーツをfront-page.phpから呼ぶ場合は、パーツの先頭にある$current_pageの1行だけを次へ置き換えます。$argsを作る前に置き、元の行と重ねて書かないでください。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPtemplate-parts/paginated-post-list.php固定フロントページで使う場合の先頭1行の差し替え
$current_page = max( 1, absint( get_query_var( 'page', 1 ) ) );

pageとpagedを推測で混ぜず、表示設定と実際のテンプレートを確認してください。通常ページで動くコードを固定フロントページへ移した後に2ページ目が同じになる場合は、最初にここを見直します。

1ページ5件で、最終ページまで表示を確かめる

23件の投稿を5件ずつ表示すると、1〜4ページ目は5件、最後の5ページ目は残り3件になります。次はWordPress 7.1/PHP 8.4.20のローカル環境で、本文と同じ日付降順の条件を使った結果です。IDは共通サンプルサイトの値なので、ご自身のサイトでは異なります。

現在ページ取得した投稿ID表示件数総件数・総ページ数
182・81・80・79・155件23件・5ページ
214・13・12・11・105件23件・5ページ
363・62・61・27・265件23件・5ページ
460・59・58・57・565件23件・5ページ
5(最終)55・54・533件23件・5ページ

同じ2ページ目の条件でno_found_rowsだけをtrueへ変更すると、5件は取得できても、found_postsとmax_num_pagesはどちらも0になりました。投稿が表示されるだけでは、総ページ数を使うページ送りの確認は終わりません。WP Query Builderではfalseを指定し、実装後に総ページ数も確認してください。

まずは先頭ページです。5件の記事と、現在ページ1を示すページ送りが表示されています。

共通サンプルサイトの制作ノート1ページ目に5記事を表示し、全23件と全5ページを確認
WordPressでの実行結果先頭ページには5件を表示する

ID82・81・80・79・15の5件です。取得条件は本文と同じで、ページリンクのURLだけ分離した検証環境に合わせています。

最終ページでは記事が3件になり、現在ページが5へ移ります。「前へ」は残り、「次へ」がなくなるところまで見てください。

同じ共通サンプルサイトの最終5ページ目に残り3記事を表示
最終ページ残り3件を表示してページ送りを終える

5ページ目はID55・54・53の3件です。現在ページは5、前へリンクは残り、次へリンクはありません。

WP Query Builderで設定することと、実装後に確認すること

WP Query Builderでコードを生成できても、ページ送りのリンクや設置先が自動で用意されるわけではありません。まずは今回のように絞り込みを増やさず、5件ずつ取得してページを移動できるところまで試しましょう。その後にカテゴリーなどの条件を1つずつ加えると、どの変更で結果が変わったかを確認しやすくなります。

確認項目WP Query Builderでの設定実装後の確認
post_type / post_status / 件数画面で指定できる実データで期待した投稿を取得できるか
pagedの固定値数値を入力できるURLから読み取った現在ページへ置換したか
no_found_rowsfalseを選べるmax_num_pagesが得られるか
ページ送りのリンク生成しないpaginate_links()で表示されるか
固定フロントページ表示設定は判定しないホームページの指定とpageの値を確認
2ページ目の404URLの動作は判定しないリンク先URL、最終ページ、パーマリンクを確認

うまく動かないときは、症状から確認場所を選ぶ

完成コードを何度も足し引きするより、症状を一つに絞ると原因を見つけやすくなります。

症状最初に確認次の確認
2ページ目も同じ記事get_query_var()の値と$argsのpaged固定値2のままになっていないか
リンクが出ないmax_num_pagesno_found_rowsと投稿総数
ページ数が合わないposts_per_pageoffset、別フック、絞り込み条件
固定フロントページだけ動かないpageの値表示設定とfront-page.php
2ページ目が404リンクhrefと最終ページrewrite、メインクエリ、パーマリンク

2ページ目が同じになる、リンクが出ない、404になる場合は、次の記事で症状に合う確認手順をご覧ください。

ページ送りがうまく動かないときにWP_Queryでページネーションが動かない原因記事を読む

公開前の確認は、1ページ目だけで終わらない

実装や公開へ進む前に、見落としやすい項目をまとめて確認します。

ページ送りの最終確認

  • 1ページ目・2ページ目・最終ページで、別の記事と正しい件数が表示される
  • 最終ページを1つ超えたURLが、意図した404または案内画面になる
  • 現在ページにaria-currentが付き、キーボードでもリンクを移動できる
  • 画面幅320pxでもページ番号が横にはみ出さない
  • ループ後にwp_reset_postdata()があり、検証用のログや一時投稿を削除した

WP_Queryのページ送りに使う公式資料

WP_QueryではPagination Parametersのposts_per_page、paged、page、offsetと、結果のfound_posts・max_num_pagesを確認します。現在ページはget_query_var()、リンク生成はpaginate_links()を別に開くと、どの値がずれているか追いやすくなります。

WordPress公式

公式資料

URLに合わせて記事とページ番号が切り替われば完成

最後は実際にリンクを押し、1ページ目・2ページ目・最終ページで記事と現在ページの表示が一緒に切り替わることを確かめましょう。ページ数が多い場合はリンクの途中が省略されるため、画面に見えるリンクの個数だけでは判断しないでください。

WP Query Builderのpagedには最初から$current_pageと入力できますか?

公開中のWP Query Builderのpagedは数値入力です。まず2などの固定値で生成内容を確認し、WordPressへ置く前に$current_pageへ置き換えます。

pagedを2にしただけで1・2・3のリンクは表示されますか?

表示されません。pagedは取得するページ番号です。リンク表示にはテンプレート側でpaginate_links()を追加します。

no_found_rowsはtrueのほうが速いのではありませんか?

総件数が不要な一覧では有効です。ただしpaginate_links()に渡すmax_num_pagesが必要なページ送りでは、falseまたは未指定にして総件数を計算します。WP Query Builderでは自動高速化を使う場合、falseを手動指定してください。

固定フロントページでもpagedを使いますか?

通常の固定ページではget_query_var( ‘paged’, 1 )で番号を読み取ります。固定ページをサイトのホームページに指定した場合はget_query_var( ‘page’, 1 )を使います。読み取った番号をWP_Queryへ渡すキーは、どちらもpagedです。

paginate_links()が何も返さないのはなぜですか?

総ページ数が1以下ならリンクは不要なため、何も返しません。投稿総数、posts_per_page、no_found_rows、対象WP_Queryのmax_num_pagesを確認します。

offsetとpagedは一緒に使えますか?

単純に併用すると取得位置と総ページ数がずれやすくなります。まずoffsetなしでページ送りを完成させ、必要な場合だけ件数計算と重複・欠落を個別に設計します。

ページ送りはメインクエリにも独自WP_Queryにも必要ですか?

メインクエリの一覧を変えるだけなら、独自WP_Queryを増やさずpre_get_postsで条件を限定する方法があります。本記事はページ内へ別の投稿一覧を追加する独自WP_Queryが対象です。

公開前に最低限どこまで確認しますか?

1ページ目、2ページ目、最終ページ、最終ページを1つ超えたURLを確認します。さらにモバイルでリンクが横にはみ出さず、現在ページが識別できることも確認してください。

WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

Web制作 / フロントエンドエンジニア

WordPressとフロントエンド実装で迷いやすい点を、公式情報と検証結果を分けながら、初学者にも追いやすい順序で整理しています。

この記事の検証情報

検証環境

WordPress
7.1.4
PHP
8.3.36
テーマ
wpq-media + DDEV
対象
カスタム投稿 / taxonomy / meta_query

更新履歴

  • 2026年11月10日 初回公開

この記事を活用する

あとで見返す・共有する

お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。

任意のご支援 役に立ったときだけ、活動を応援できます OFUSEはサイト・記事制作に使います。支援の有無で、読める内容や使える機能は変わりません。