【WordPress】メインクエリから特定のカテゴリーの投稿を除外する【pre_get_posts】
※本ページのリンクにはプロモーションが含まれています。
こんにちは、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
を使う方法が主流となっていますので、覚えておくとよいかもしれません。
最後に
メインクエリは各テンプレートに使用されるため、pre_get_postsの使い方をマスターすれば取得する情報をコントロールすることができます。メインクエリを思い通りにコントロールすることができればWordPressをマスターしたといっても過言ではないため、開発環境等で色々動作を試していただいて、使い方をマスターしてくださいね!
以上、WordPressのpre_get_postsでメインクエリから特定のカテゴリーの投稿を除外する方法のご紹介でした!