WordPress pre_get_posts の備忘録

すぐ忘れるので備忘録。

基本形

functions.phpに記述。

function my_pre_get_posts($query)
{
  // 管理画面とメインクエリに干渉しないようにする
  if (is_admin() || !$query->is_main_query()) {
    return;
  }

  // 処理
  if ($query->is_front_page()) {
    $query->set('orderby', 'title');
    $query->set('order', 'ASC');
  }
}
add_action('pre_get_posts', 'my_pre_get_posts');

処理に使う条件いろいろ

<?php
$query->is_home()
$query->is_single()
$query->is_singular($post_types) // 引数は投稿タイプのスラッグまたは配列
$query->is_page()
$query->is_archive()
$query->is_category()
$query->is_category(array(3,'slug-name','カテゴリ名')) // カテゴリを複数指定。ID, スラッグ, ラベルが使える
$query->is_tag()
$query->is_tax() // 全てのタクソノミーページ
$query->is_tax('slug-name') // タクソノミーのスラッグを指定
$query->is_tax('tax-slug', array('term-slug-1','term-slug-2')) // タクソノミー 'tax-slug' のアーカイブページが表示されており、そのタクソノミーのタームが 'term-slug-1'または'term-slug-2' である場合。
$query->is_search()
$query->is_post_type_archive('post_type') // カスタム投稿タイプのスラッグを指定
$query->is_date()
$query->is_year()
$query->is_month()
$query->is_author()
$query->is_feed()
$query->is_404()

処理の設定

<?php
$query->set('posts_per_page', 20);
$query->set('cat','3'); // カテゴリID3の記事を取得
$query->set('cat','-3'); // カテゴリID3の記事を除外
$query->set('category_name', 'cat-slug') // カテゴリをスラッグで取得
$query->set('category__not_in', array('cat-slug-1', 'cat-slug-2'); // カテゴリを除外
$query->set('post_type','post'); // 投稿タイプを限定

// カスタムタクソノミー
$tax_query = [
  [
    'taxonomy' => 'tax-slug',
    'field' => 'slug',
    'terms' => ['term-slug']
  ];
];
$query->set('tax_query', $tax_query);

// カスタムフィールド
$meta_query = [
  'key' => 'field_key',
  'value' => 'value',
  'compare' => '!=' // = != < <= > >=
];
$query->set('meta_query', $meta_query);