WordPressでオリジナルな一覧ページを作る上で意識して指定しているのが、paged
という値だと思います。
WP_Query( array( 'paged' => $paged ) );
といった感じですね。
この$paged
の取得方法が一覧ページと個別ページで取得方法が異なるというお話になります。あまり情報もなく詰まると平気で数十時間を費やすつまずきポイントでもあるので、頭の片隅にでも残しておいてください!
一覧ページでのループ条件の作り方
一覧ページでのループ条件を作るときは、いつもの方法と同じです。
ループ情報の指定方法は以下の記事のサブループを参考にしていただければと思います。
現在のページ番号を取得するには、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' )
で取得します。
一覧ページと違いがないと思われるかもしれませんが、よく比べてみると引数の値が違います。paged
かpage
の違いですね。
一覧ページ | 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.phpとhome.phpの2つが必要かどうか検討すると思います。home.phpだけで十分ならいつものルールで大丈夫です。
ページャーの指定も変える
サブループ(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' ) ) |
おわり
個別ページと一覧ページでループを回す時のpage
とpaged
の違いでした。こういう小さいことですが、本当に詰まります・・・。
平気で1日とか費やすことになるので、わたしの過去の不幸を繰り返さないためにも頭の片隅に残しておいてください!