WordPress で「アーカイブの並び替え」や「検索結果に固定ページを混ぜる」など、細かい出し分けをしたいときは pre_get_posts フィルタが最強です。
本稿では コピペ即動作 の 8 例を紹介します。
「functions.php に貼ってブラウザで確認する」だけで動くので、ぜひローカル環境や開発サーバーで試してみてください。
目次
pre_get_posts フィルタで記事一覧表示を変更する方法 8例
特定の一覧記事をしていちつつ、functions.phpでメインクエリだけ を書き換えるようにに
is_main_query()
で制御すると記事一覧をカスタマイズできます。
1. カテゴリアーカイブから特定サブカテゴリーだけ除外
add_action( 'pre_get_posts', function( $q ){
if ( ! $q->is_main_query() || ! $q->is_category( 'travel' ) ) return;
// ID=123(海外) と 456(危険地帯) を除外
$q->set( 'category__not_in', [ 123, 456 ] );
} );
2. 検索結果に固定ページも混ぜる
add_action( 'pre_get_posts', function( $q ){
if ( ! $q->is_main_query() || ! $q->is_search() ) return;
$q->set( 'post_type', [ 'post', 'page' ] );
} );
3. フロントページの記事を PV 順に並べ替え
add_action( 'pre_get_posts', function( $q ){
if ( ! $q->is_main_query() || ! $q->is_home() ) return;
$q->set( 'meta_key', 'pv' ); // PV を保存している meta_key
$q->set( 'orderby', 'meta_value_num' );
$q->set( 'order', 'DESC' );
} );
4. タグ foo の一覧だけ 30 件ずつ表示
add_action( 'pre_get_posts', function( $q ){
if ( ! $q->is_main_query() || ! $q->is_tag( 'foo' ) ) return;
$q->set( 'posts_per_page', 30 );
} );
5. RSS フィードに “イベント” CPT を追加
add_action( 'pre_get_posts', function( $q ){
if ( ! $q->is_main_query() || ! $q->is_feed() ) return;
$q->set( 'post_type', [ 'post', 'event' ] );
} );
6. 年月アーカイブを毎回ランダム表示
add_action( 'pre_get_posts', function( $q ){
if ( $q->is_date() && $q->is_main_query() ){
$q->set( 'orderby', 'rand' );
}
} );
7. 未ログイン時は会員限定カテゴリを非表示
add_action( 'pre_get_posts', function( $q ){
if ( is_user_logged_in() || ! $q->is_main_query() ) return;
$q->set( 'category__not_in', [ 789 ] ); // 会員限定カテゴリID
} );
8. 検索クエリに日付範囲を追加 (?from=YYYY-MM-DD&to=YYYY-MM-DD)
add_action( 'pre_get_posts', function( $q ){
if ( ! $q->is_main_query() || ! $q->is_search() ) return;
$date_query = [];
if ( $from = $_GET['from'] ?? '' ) $date_query['after'] = $from;
if ( $to = $_GET['to'] ?? '' ) $date_query['before'] = $to;
if ( $date_query ) {
$q->set( 'date_query', [ $date_query ] );
}
} );
まとめ
pre_get_posts
は 「メインクエリの最後の書き換えポイント」。
条件分岐 (is_home()
, is_category()
, is_user_logged_in()
など) を的確に組み合わせれば、
テーマ改造やプラグイン不要で「あったらいいな」を実現できます。
ぜひ自サイトの運営に役立ててください!