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_page | WP Query Builder |
| 取得するページ番号を指定する | paged | 生成時は固定値、実装時は現在ページへ置換 |
| URLから現在ページを読む | get_query_var() | WordPressテンプレート |
| 記事を取得する | WP_Query | 生成した$argsを使ってテンプレートで実行 |
| 総ページ数を受け取る | max_num_pages | WP_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詳細設定(全項目)を選び、全項目を開く
- 2投稿タイプをpost、公開状態をpublish、取得件数を5にする
- 3ページ番号を2にし、読み飛ばす件数は空にする
- 4並び方向をDESC、並べ替えの基準をdateにする
- 5性能・キャッシュ設定でno_found_rowsをfalseにする
- 6生成コードが更新されたことと、エラーや警告がないことを確認する
次の画面では、取得件数が5、ページ番号が2になっていることを見てください。この2つは「2ページ目から5件取得する」という別々の指定です。

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は自動高速化より優先されます。

ページリンクに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とループへ組み込んでください。
$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行だけを変更し、前後に現在ページの取得と表示処理を追加します。全体のコードは、この後で紹介します。

この段階では取得条件だけです。まだ投稿一覧やページ送りリンクは表示されません。
生成コードに表示処理を加えたら、本番と分けたWordPress環境でページ送りを試します。検証や公開に使うサーバーをこれから用意する方は、XserverのPHP対応・バックアップ・料金も確認できます。
日本語の物語でも条件を読み返してみる
コードの下にある「日本語の物語」では、同じ条件を文章でも確認できます。今回なら「通常投稿」「公開済み」「2ページ目」「5件」「公開日の降順」が出てくるので、入力したつもりの条件と合っているか読み返してみましょう。少し遊び心のある説明ですが、実際の投稿を取得した結果ではありません。動作は次のコードをWordPressで実行して確かめます。

生成条件を文章にした説明です。実際の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へ、そのまま貼るコードではありません。
<?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とループへ組み込んでください。
$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 | 表示件数 | 総件数・総ページ数 |
|---|---|---|---|
| 1 | 82・81・80・79・15 | 5件 | 23件・5ページ |
| 2 | 14・13・12・11・10 | 5件 | 23件・5ページ |
| 3 | 63・62・61・27・26 | 5件 | 23件・5ページ |
| 4 | 60・59・58・57・56 | 5件 | 23件・5ページ |
| 5(最終) | 55・54・53 | 3件 | 23件・5ページ |
同じ2ページ目の条件でno_found_rowsだけをtrueへ変更すると、5件は取得できても、found_postsとmax_num_pagesはどちらも0になりました。投稿が表示されるだけでは、総ページ数を使うページ送りの確認は終わりません。WP Query Builderではfalseを指定し、実装後に総ページ数も確認してください。
まずは先頭ページです。5件の記事と、現在ページ1を示すページ送りが表示されています。

ID82・81・80・79・15の5件です。取得条件は本文と同じで、ページリンクのURLだけ分離した検証環境に合わせています。
最終ページでは記事が3件になり、現在ページが5へ移ります。「前へ」は残り、「次へ」がなくなるところまで見てください。

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_rows | falseを選べる | max_num_pagesが得られるか |
| ページ送りのリンク | 生成しない | paginate_links()で表示されるか |
| 固定フロントページ | 表示設定は判定しない | ホームページの指定とpageの値を確認 |
| 2ページ目の404 | URLの動作は判定しない | リンク先URL、最終ページ、パーマリンクを確認 |
うまく動かないときは、症状から確認場所を選ぶ
完成コードを何度も足し引きするより、症状を一つに絞ると原因を見つけやすくなります。
| 症状 | 最初に確認 | 次の確認 |
|---|---|---|
| 2ページ目も同じ記事 | get_query_var()の値と$argsのpaged | 固定値2のままになっていないか |
| リンクが出ない | max_num_pages | no_found_rowsと投稿総数 |
| ページ数が合わない | posts_per_page | offset、別フック、絞り込み条件 |
| 固定フロントページだけ動かない | pageの値 | 表示設定とfront-page.php |
| 2ページ目が404 | リンクhrefと最終ページ | rewrite、メインクエリ、パーマリンク |
2ページ目が同じになる、リンクが出ない、404になる場合は、次の記事で症状に合う確認手順をご覧ください。
ページ送りがうまく動かないときにWP_Queryでページネーションが動かない原因現在ページの値、取得条件、リンク先URLを順に調べる方法を確認できます。
記事を読む公開前の確認は、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を確認します。さらにモバイルでリンクが横にはみ出さず、現在ページが識別できることも確認してください。
この記事の検証情報
検証環境
- WordPress
- 7.1.4
- PHP
- 8.3.36
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年11月10日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。


