こんにちは、Ryohei(@ityryohei)です!

本記事では、WordPressのアクションフックのpre_get_postsを使って、メインクエリから特定のカテゴリーの投稿を除外する方法をご紹介しています。

WordPressのメインクエリから特定のカテゴリを除外したいな。良い方法ないかな?

上記の疑問にお答えします。

では、解説していきます。

メインクエリから特定のカテゴリーの投稿を除外する

テーマ内のfunctions.phpに下記フックを追加します。下記では、読み込まれたページがトップページであれば、$queryにcategory__not_inを設定し、指定したカテゴリーIDの投稿を除外しています。

function my_pre_get_posts($query){
    if(is_admin() || !$query->is_main_query()){
        return;
    }

    if(is_front_page() || is_home()){
        $query->set('category__not_in', array('カテゴリID'));
    }
}
add_action('pre_get_posts', 'my_pre_get_posts');

上記ではトップページを対象にしていますが、カスタム投稿のアーカイブページで実行したい場合は下記のようにします。

function my_pre_get_posts($query){
    if(is_admin() || !$query->is_main_query()){
        return;
    }
    if(is_post_type_archive()){
        $query->set('post_type_name');
    }
}
add_action('pre_get_posts', 'my_pre_get_posts');

pre_get_postsとは

上記コード内に登場しているpre_get_postsについて補足します。

処理内容で察している方も多いと思いますが、pre_get_postsはメインクエリのループ実行前に呼び出されるフックです。pre_get_postsにフックすることで、メインクエリを変更することができます。メインクエリを変更するには、$query->set()でパラメータを渡します。メインクエリを変更することで、取得する投稿情報の内容を変更することができます。

以前はquery_posts等が使用されていましたが、query_postsは現在非推奨関数に指定されています。メインループのクエリを変更したい場合はpre_get_postsを使う方法が主流となっていますので、覚えておくとよいかもしれません。

参考:https://developer.wordpress.org/reference/hooks/pre_get_posts/

最後に

メインクエリは各テンプレートに使用されるため、pre_get_postsの使い方をマスターすれば取得する情報をコントロールすることができます。メインクエリを思い通りにコントロールすることができればWordPressをマスターしたといっても過言ではないため、開発環境等で色々動作を試していただいて、使い方をマスターしてくださいね!

以上、WordPressのpre_get_postsでメインクエリから特定のカテゴリーの投稿を除外する方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。