【WordPress】アーカイブページによって投稿数などの表示条件を変更|pre_get_posts

WordPressでサイトを作成していると、アーカイブページによって、投稿数などの表示条件を変更したい場合があると思います。

今回は、そのような場合に利用できる方法となり、メインクエリ(データベースへの問い合わせ)を、pre_get_postsフックを使い変更する例となります。

アーカイブページによって投稿数などの表示条件をを変更する例

以下がソースコードの例となりfunctions.phpファイルに記述します。

例では、pre_get_postsフックを使用し以下の条件でクエリを変更しています。

  • トップページでは、投稿数を6件、表示順をランダムで表示
  • 検索ページでは、投稿数を12件で表示
  • その他のページはデフォルトの設定で表示
function my_pre_get_posts( $query ) {
	// 管理画面または、メインクエリ以外の場合
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    // トップページの場合
    if ( $query->is_home ) {
      $query->set( 'posts_per_page', '6' );
      $query->set( 'orderby', 'rand' );
    }
    // 検索結果ページの場合
    if ( $query->is_search ) {
      $query->set( 'posts_per_page', '12' );
    }
};
add_action( 'pre_get_posts', 'my_pre_get_posts' );

ソースコードの説明

pre_get_postsフックについて

WordPressにはメインクエリをはじめ、データベースへの問い合わせ(クエリ)全般で使用するWP_Queryクラスがあります。

pre_get_postsフックで登録した関数の引数には、そのWP_Queryオブジェクト($query) が渡され、そのオブジェクトを変更することでクエリの内容を変更できます。

また、pre_get_postsフックが呼び出されるタイミングは、メインクエリによるデータベースへの問い合わせが実行される前となります。

pre_get_postsフックの影響をメインクエリのみに制限

pre_get_postsフックでクエリを変更すると、管理画面のクエリやメインクエリ以外も影響がでる場合があります。

そのため、まず、例のソースコード2行目からの箇所で、管理画面やメインクエリ以外では、クエリを変更せず返します。

set()メソッドを使用しクエリを変更

pre_get_postsフックで登録した関数内で、クエリを変更するにはset()メソッドを使用します。

set()メソッドでは、第1引数にWP_Queryのパラメータ、第2引数にそのパラメータに対応した値を指定してクエリを変更します。

例では、ソースコード6行目からの箇所で、指定したページによってset()メソッドを使いメインクエリを変更しています。

pre_get_postsフックやWP_Queryのパラメータの詳細は、以下のページや参考サイト・書籍を確認してみてください。

参考サイト、参考書籍

コメント投稿またはTwitterで返信

コメントは、以下の項目(*は必須項目)を入力し「コメントを送信」ボタンから送信お願いします。メールアドレスは公開されることはありません。
Twitterで返信する場合はコチラから。