プラグインを使わずに特定のカテゴリの記事を除外する

意外にも、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' );

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です