
意外にも、2010年に書きました古い記事の「Advanced Category Excluder : 特定のカテゴリの記事を表示させないプラグイン」のアクセスが多いので、この記事もアップしようと思いました。
プラグインを使わずに、特定のカテゴリの記事を除外することは簡単にできます。ですので、最近はプラグインを使っていません。
サイドバーや固定ページなどで使いやすいサブループ(WP_Query)と、「pre_get_posts」を使うメインループの2種類の方法をご紹介します。
WP_Queryで、特定のカテゴリの記事を除外する
サイドバーや固定ページなどでは、以下のようにサブループで、除外したいカテゴリのID番号に「-」を付けて指定します。
<?php $args = array( 'post_type' => 'post', 'cat' => -5, /* 除外したいカテゴリのID番号に「-」を付けて指定 */ 'posts_per_page' => 10, ); ?> <?php $my_query = new WP_Query( $args ); ?> <ul> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?> <li> <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3> <p class="published"><?php the_time( get_option( 'date_format' ) ); ?></p> </li> <?php endwhile; ?> </ul> <?php wp_reset_postdata(); ?>
'cat=-12,-34,-56'
のように、複数指定することもできます。
'category__not_in'
を使用しますと、以下のように「-」を付けずに複数指定することもできます。
<?php $args = array( 'post_type' => 'post', 'category__not_in' => array( 2, 6 ), /* 除外したいカテゴリのID番号を指定 */ 'posts_per_page' => 10, ); ?> <?php $my_query = new WP_Query( $args ); ?> <ul> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?> <li> <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3> <p class="published"><?php the_time( get_option( 'date_format' ) ); ?></p> </li> <?php endwhile; ?> </ul> <?php wp_reset_postdata(); ?>
pre_get_postsで、特定のカテゴリの記事を除外する
「functions.php」に、以下のように記述することで、メインクエリを制御できます。
以下は、トップページでは特定のカテゴリの記事を除外して表示する例です。
function change_posts_per_page($query) { /* 管理画面,メインクエリに干渉しないために必須 */ if ( is_admin() || ! $query->is_main_query() ){ return; } /* トップページの表示件数を10件にする */ if ( $query->is_home() ) { $query->set( 'posts_per_page', '10' ); $query->set( 'cat','-5' ); /* 除外したいカテゴリのID番号に「-」を付けて指定 */ return; } } add_action( 'pre_get_posts', 'change_posts_per_page' );
以下のように記述することで、複数指定することもできます。(「-」は付けなくて良い)
function change_posts_per_page($query) { /* 管理画面,メインクエリに干渉しないために必須 */ if ( is_admin() || ! $query->is_main_query() ){ return; } /* トップページの表示件数を10件にする */ if ( $query->is_home() ) { $query->set( 'posts_per_page', '10' ); $query->set( 'category__not_in',array(2,6) ); /* 除外したいカテゴリのID番号を指定 */ return; } } add_action( 'pre_get_posts', 'change_posts_per_page' );