WordPress│pre_get_posts フィルタで記事一覧表示を変更する方法

WordPress で「アーカイブの並び替え」や「検索結果に固定ページを混ぜる」など、細かい出し分けをしたいときは pre_get_posts フィルタが最強です。

本稿では コピペ即動作 の 8 例を紹介します。

「functions.php に貼ってブラウザで確認する」だけで動くので、ぜひローカル環境や開発サーバーで試してみてください。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

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() など) を的確に組み合わせれば、
テーマ改造やプラグイン不要で「あったらいいな」を実現できます。

ぜひ自サイトの運営に役立ててください!

  • URLをコピーしました!

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次