WP で固定ページも一覧する方法 pre_get_posts を使う

WordPressのロゴ。

トップページやアーカイブページなどで複数のページを取得して一覧するとき、固定ページも含めたい場合があります。 pre_get_posts アクションにフックして、WordPress が一覧するページを取得する条件を変更することで、固定ページを一覧に含めることができます。

pre_get_posts にフックする具体的な方法

ここでは、未分類カテゴリを除いた投稿・固定ページを取得するように設定します。

具体的には次のようなコードになります。解説は後述します。

add_action('pre_get_posts', 'custom_pre_get_posts');
function custom_pre_get_posts($query)
{
    if(is_admin() || !($query -> is_main_query()))
    {
        return;
    }

    if(is_home() || is_archive())
    {
        $query -> set('post_type', array('page', 'post'));
    }
}

管理画面でも pre_get_posts は呼び出されるので注意する

is_admin は管理画面などで情報を取得する場合に true を返します。is_admin のチェックは重要です。 特殊な会員制サービスなどでない限り、管理画面にはすべての投稿が表示されるべきです。

pre_get_posts 関数(アクション)は、ログインユーザが見る管理画面でも呼び出されています。 例えば投稿ページの一覧などです。

管理画面では特別な設定を抜きに、標準の設定のまま一覧されてほしいので、 管理画面であるか、あるいは管理画面で発生したクエリであるときには、何も処理しません。

クエリとは

Wordpress におけるクエリ (query) とは、データベースから必要な情報を取得するための命令です。

Wordpress はデータベースに「Xの情報をください」とクエリ(命令)を送り、 データベースから送られてきた情報を処理してページに出力します。クエリの詳細については公式の資料を参照してください。

query_posts - WordPress.org
http://codex.wordpress.org/Template_Tags/query_posts

メインクエリ / サブクエリ

is_main_query はクエリがメインクエリであるときに true を返します。 メインクエリとは Wordpress 本体が(自動的に)発行したクエリです。

一方で、サブクエリは任意に発行されたクエリです。 ここではサブクエリの場合には、未分類カテゴリも対象に含めるようにしています。

固定ページを含める

Wordpress の既定の設定では、投稿ページのみが取得されます。 パラメータ post_type に page (固定ページ) を追加して、固定ページも取得対象に含めます。