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

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

コメントを残す

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

keyboard_control_keyTOP