プラグインを使わずに特定のカテゴリの記事を除外する
意外にも、2010年に書きました古い記事の「Advanced Category Excluder : 特定のカテゴリの記事を表示させないプラグイン」のアクセスが多いので、この記事もアップしようと思いました。
プラグインを使わずに、特定のカテゴリの記事を除外することは簡単にできます。ですので、最近はプラグインを使っていません。
サイドバーや固定ページなどで使いやすいサブループ(WP_Query)と、「pre_get_posts」を使うメインループの2種類の方法をご紹介します。
WP_Queryで、特定のカテゴリの記事を除外する
サイドバーや固定ページなどでは、以下のようにサブループで、除外したいカテゴリのID番号に「-」を付けて指定します。
<?php
$args = [
'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 = [
'post_type' => 'post',
'category__not_in' => [ 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' );