query_postsを使わずに固定ページにすべての投稿一覧をページネーションさせる方法

yakei
すべての投稿記事の一覧をトップページ以外に作る場合、固定ページでquery_postsを使う方法以外でどう実現するか?
今回はこれを考えてみようと思います。

補足:このページの内容は「なぜ固定ページでquery_postsを使うのはよくないのか?」と少しだけ関連します。

よくあるページ構成のサンプルサイト

例えば、よくあるサイトとして以下のような構成のサイトがあるとします。
よくあるサイト構成
トップページでは投稿記事の最新の数件を表示させ、ページングはしません。
ですからget_postsを使えばそれでOKとなります。

ブログ一覧ページでは投稿記事をカテゴリや日付などの限定をせずに一覧表示させ、ページングを行います。
今回問題にするのはこのページです。これをquery_postsを使わずに実現させます。

カテゴリや日付などの限定をした一覧の場合

先に説明しておきますと、もしこの「ブログ一覧」ページが特定のカテゴリ一覧の場合なら、

http://www.ドメイン/archives/category/カテゴリースラッグ名

というURLにリンクさせ、テンプレートファイルはcategory.phpだけを用意しておけばOKになります。
日付アーカイブも同じ理屈でdate.phpで実現できます。

固定ページを用意しておいて以下のような記述をするやり方はスマートではないでしょう。

query_posts('cat=カテゴリID');

なぜスマートではないかと言うと、固定ページのメインクエリは一覧を表示させるものではないからです。
それに対し、category.phpやdate.phpなどのアーカイブページは一覧表示がメインクエリです。

すべての投稿一覧の場合

さて、すべての投稿(カテゴリや日付などの限定をしない)を一覧表示させる場合、それがトップページならfront-page.phpやhome.phpで一覧表示させ、ページングも行えます。

しかし上の画像のサンプルサイトのように、トップページ以外のページですべての投稿一覧(ページングあり)を表示させる場合は、

1、まずWordPress管理画面で「トップページ」と「ブログ一覧ページ」を固定ページとして作成しておき、(本文欄は空でOK)
2、設定 → 表示設定にある「フロントページの表示」でフロントページと投稿ページのプルダウンからそれぞれ指定します。
フロントページの表示設定
3、すると、管理画面での固定ページ一覧に「フロントページ」と「投稿ページ」という表示が出現します
固定ページ一覧
4、上画像にある固定ページ「ブログ一覧」のページにすべての投稿一覧が表示されることになります。
そのため、このページは本文を書く欄がありません。
本文欄がない
5、home.phpを用意する。
上記の固定ページ「ブログ一覧」はpage.phpやpage-スラッグ名.phpなどの固定ページ用テンプレートファイルは必要ありません。
home.phpだけ存在していればOKです。
URLは画面に表示されているのでわかりますよね。
投稿一覧ページのURL
補足:トップページの表示はfront-page.php
サイトのトップページの表示は上記手順2で固定ページ「トップページ」を指定していますが、これに関してもpage.phpやpage-スラッグ名.phpなどのテンプレートファイルは必要ありません。
front-page.phpだけを用意しておけばOKです。

front-page.phpとhome.phpを使い分けることによってトップページ以外にすべての記事一覧をページング表示できる

以上のように設定すればquery_postsを使わなくても一覧表示とページングが実現できます。
このやり方を使えば「http://www.~~~.com/」のようなルートドメインではfront-page.phpによってトップページが表示され、固定ページ「ブログ一覧」ではhome.phpによって、

<?php if(have_posts()): while(have_posts()): the_post(); ?>
ここにループ
<?php endwhile; endif; ?>

だけですべての投稿記事のループ表示が実現できます。

1ページに最大何件表示させたいかの設定はfunction.phpにてpre_get_postsを使って設定してください。
その設定方法は「なぜ固定ページでquery_postsを使うのはよくないのか?」のページで解説しています。

front-page.phpとhome.phpのメインクエリ

この場合、front-page.php(トップページ)は固定ページと同じ扱いになり、home.php(ブログ一覧)ページはアーカイブページと同じ扱いになります。

上記の「フロントページの表示」の設定によってfront-page.phpの扱いが変化するところが、今回の問題の最もわかりにくい点なのではないかと思います。
参考ページ:「1ページに表示する最大投稿数」が適用されるテンプレートファイルは?

それぞれがメインクエリに沿ったページの表示ができ、query_postsを使うよりとてもスマートだと思います。