2026年8月1日
2026年8月1日
WordPressのWP_Queryのpre_get_postsフィルターを使う
はじめに
この記事では、pre_get_postsフィルターを使用してWordPressの投稿クエリ(WP_Query)をカスタマイズする方法について解説します。pre_get_postsは、投稿一覧ページや検索結果ページなどの各種クエリを調整するために使われる重要なフックです。
症状・背景
このフィルターが必要になる主な場面:
- 投稿の表示順序をカスタマイズしたい場合
- 特定のタームに基づいたカスタム投稿タイプのリストを生成する必要がある場合
- 検索結果ページでクエリを制限したり、追加フィールドを検索条件に含めたい場合
手順・設定方法
ステップ1: pre_get_posts フィルターの基本使用法
# pre_get_posts フルーチャーにカスタム関数を登録
add_filter('pre_get_posts', 'custom_pre_get_posts');
ステップ2: 投稿表示順序の変更
# pre_get_posts フィルターで投稿の並び順を変える
function custom_pre_get_posts($query) {
if (!is_admin() && $query->is_main_query()) { // 管理画面とメインクエリに限定する
if (is_home()) { // 投稿一覧ページの場合
$query->set('orderby', 'rand'); // 投稿をランダム順で表示
}
}
}
ステップ3: カスタム投稿タイプのタームに基づいたリスト生成
# pre_get_posts フィルターを使ってカスタム投稿タイプのタームによるクエリを作成
function custom_pre_get_posts($query) {
if (!is_admin() && $query->is_main_query()) { // 管理画面とメインクエリに限定する
if (is_tax('custom_taxonomy')) { // カスタムタームページの場合
$query->set('post_type', 'custom_post_type'); // 特定の投稿タイプを指定
$query->set('posts_per_page', 10); // 投稿数を10件に制限
}
}
}
ステップ4: 検索結果ページのクエリ調整
# pre_get_posts フィルターを使って検索結果ページで特定のフィールドを含める
function custom_pre_get_posts($query) {
if (!is_admin() && $query->is_main_query()) { // 管理画面とメインクエリに限定する
if ($query->is_search()) { // 検索結果ページの場合
$meta_query = $query->get('meta_query');
$meta_query[] = array(
'key' => 'custom_meta_key', // カスタムメタキーを指定
'value' => $_GET['s'], // メタフィールドの値に検索文字列を使用
'compare' => 'LIKE'
);
$query->set('meta_query', $meta_query); // フィルター結果を適用
}
}
}
注意事項
pre_get_postsフィルターは、クエリオブジェクトがまだ実行されていない段階で呼ばれるため、その時点でのオプション設定しか変更できません。- メインの投稿一覧ページや検索結果ページに影響を与える可能性があるため、サイト全体のパフォーマンスに十分注意してください。
- セキュリティを考慮して、フィルター内で使用するユーザー入力データは必ず適切なエスケープ処理を行ってください。
まとめ
1. pre_get_posts フィルターの基本的な利用法: メインクエリで実行されるタイミングと場面を理解することが重要です。
2. 投稿表示順序のカスタマイズ: サイト全体や特定のページでのみ適用したい場合、is_home()やis_tax()などの条件式を使用します。
3. カスタムタームに基づくクエリ: カスタム投稿タイプとその関連タームを利用してサイトのコンテンツを効果的に整理できます。
4. 検索結果ページの調整: 検索文字列をメタフィールド値として使用することで、より高度な検索機能を実現します。
5. パフォーマンスとセキュリティへの注意: フィルターを使用する際は常にサイト全体のパフォーマンスとデータの安全性に気をつけましょう。
関連記事: