pageとpagedは違う!個別ページと一覧ページで使い分けよう

WordPressでオリジナルな一覧ページを作る上で意識して指定しているのが、pagedという値だと思います。

WP_Query( array( 'paged' => $paged ) );といった感じですね。

この$pagedの取得方法が一覧ページと個別ページで取得方法が異なるというお話になります。あまり情報もなく詰まると平気で数十時間を費やすつまずきポイントでもあるので、頭の片隅にでも残しておいてください!

一覧ページでのループ条件の作り方

一覧ページでのループ条件を作るときは、いつもの方法と同じです。

ループ情報の指定方法は以下の記事のサブループを参考にしていただければと思います。

WordPressの任意のループ(サブループ)を作る方法と覚えておきたい指定方法

現在のページ番号を取得するには、get_query_var( 'paged' )という方法になります。

コピー$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$the_query = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => '10', 'paged' => $paged ) );

これが一般的なサブループの作り方です。

一覧ページのテンプレートってどれ?

「一覧ページはget_query_var( 'paged' )で書く!」と言われても、一覧ページって具体的にどれ?って思う方もいるかもしれません。

  • page.php
  • single.php
  • front-page.php

以外のテンプレートと捉えていただけたらと思います。archive.phpやhome.php、category.phpなどなど、多くのページは一覧用のページとなります。上記以外のテンプレートにループを記載するときは、get_query_var( 'paged' )でページ番号を取得するということですね。

個別ページでのループ条件の作り方

一方で個別ページでページ番号を取得するには、get_query_var( 'page' )で取得します。

一覧ページと違いがないと思われるかもしれませんが、よく比べてみると引数の値が違います。pagedpageの違いですね。

一覧ページ get_query_var( 'paged' )
個別ページ get_query_var( 'page' )

個別ページでループするためのサブループを作るとすると、以下のようになります。

コピー$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'page' ) : 1;
$the_query = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => '10', 'paged' => $paged ) );

個別ページのテンプレートってどれ?

個別ページのテンプレートは、よく使うものだと以下のとおりです。

  • single.php
  • page.php
  • front-page.php

個人的によく引っかかるのが、front-page.phpからループを作ろうとしたときですね。いつものようにget_query_var( 'paged' )で書こうとするとページが遷移しない・・・という事態に出くわします。

本来的にはhome.phpをトップページにしてループさせる事案なのかもしれませんが、、、

トップページの指定方法については、以下を参考にしていただき、front-page.phphome.phpの2つが必要かどうか検討すると思います。home.phpだけで十分ならいつものルールで大丈夫です。

WordPressのトップページを任意のテンプレートで指定してブログ一覧を別にする方法

ページャーの指定も変える

サブループ(WP_Queryで作ったループ)で表現している場合は、ページャーの指定方法も気をつけないといけません。なぜなら'current'get_query_var()が使われているからです。

ページャーの表現は以下のような感じですね。
(参考:関数リファレンス/paginate links – WordPress Codex 日本語版

コピー$big = 999999999;
echo paginate_links( array(
	'base'      => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
	'current'   => max( 1, get_query_var( 'paged' ) ),
	'total'     => $the_query->max_num_pages,
	'mid_size'  => 1,
	'end_size'  => 1,
	'prev_text' => '前',
	'next_text' => '次',
	'type'      => 'plane',
) );

ループと同じように、一覧ページならpaged、個別ページならpageといった具合です。

一覧ページ 'current' => max( 1, get_query_var( 'paged' ) )
個別ページ 'current' => max( 1, get_query_var( 'page' ) )

おわり

個別ページと一覧ページでループを回す時のpagepagedの違いでした。こういう小さいことですが、本当に詰まります・・・。

平気で1日とか費やすことになるので、わたしの過去の不幸を繰り返さないためにも頭の片隅に残しておいてください!

このページが役に立ったら
いいね!お願いします

運営の励みになります...。

関連の記事