WordPress:pre_get_postsを用いてカテゴリページや検索結果の表示を調整する

TwitterFacebookHatena
  • 公開:2019-3-25
  • 更新:2024-11-12
  • 文章量:1700
  • WordPress

TL;DR

今回はアクションフックを使って、カテゴリページの表示件数や、検索結果で 5 年以内の記事を返すなど「表示の調整」を行う方法をご紹介します。例えば管理画面で投稿記事は 10 件に設定しているけれどカテゴリーページは 15 件の表示をしたいとき。または、古い検索結果は出力したくないといったように、メインクエリに対する操作を行いたいときはアクションフックpre get postsを使います。

pre_get_posts

pre_get_posts はデータベースへの検索が行われるクエリ実行前(記事データの問い合わせ前)に呼び出されます。WP_Query がセットアップされる前に実行されるので、データベースへの問い合わせが 1 度で済むので高速であり、functions.php の中に書くことで保守性が高くなります。

pre_get_posts の基本的な記述例

is_main_query()はメインクエリ(記事データ)、is_admin()は管理画面のことで、管理画面とメインクエリ以外では適用しないという記述をしておきます。$query->setではパラメータと値をセットします。

add_action( 'pre_get_posts', function( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) { // 管理画面またはメインクエリ以外で
    return; // 適用しない
  }
  if ( 条件 ) {
    $query->set( 'パラメータ', '値' );
    return;
  }
} );
アーカイブページかつスマホの時は表示件数を 14 件に変更する

例えばスマホのアーカイブページで最大表示件数を変更したい場合。1 ページあたりの表示件数を指定できるposts_per_pageをパラメータに設置します。こんなに短い記述で調整できるので便利ですね。

add_action( 'pre_get_posts', function( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }
  if ( $query->is_archive() && wp_is_mobile() ) {
    $query->set( 'posts_per_page', 14 );
    return;
  }
} );
検索結果で 5 年以内の記事を返す

検索結果で ○ 年以内のものを返すケース。他に ○○ 年以降という指定もできます。これを実現するには、複雑な指定ができる日付パラメータdate_queryを使います。after は指定した日付より後、before は指定した日付より前の投稿を取得します。「1 year ago」や「2017-01-10」といった表記が使えます。

add_action( 'pre_get_posts', function( $query ) {
  if ( ! is_admin() && $query->is_main_query() ) {
      if ($query->is_search) {

  $query->set( 'date_query',
      [    [
      'after' => '5 year ago', // 5年以内
      // 'after' => '2017-01-10', // 2017年1月10日以降
      // 'before' => '2017-01-10', // 2017年1月10日以前
      ]    ]
      );
      }
    }
} );

Plugin API/Action Reference/pre get posts « WordPress Codex \

WordPress:pre_get_postsを用いてカテゴリページや検索結果の表示を調整する