Go to top Go to bottom

メインループで記事を出力する場合に、ある特定のカテゴリーやタグ、あるいはタクソノミーに属するものを除外したい場合があります。これは、pre_get_postsのアクションフックを用いて、クエリする条件を変更することで実現します。

特定のカテゴリーに属する投稿を一覧表示から除外する

メインループのクエリ条件を変更するには、pre_posts_getアクションフックを利用します。クエリのパラメータでカテゴリのIDをマイナスをつけて渡すか、またはcategory__not_inを利用すると、特定のカテゴリーに含まれる投稿を除外することができます。query_posts()は使いません

IDにマイナスをつけて除外

function twpp_exclude_category( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }

  if ( $query->is_home() ) {
    $query->set( 'cat', '-15,-16' );
  }
}

add_action( 'pre_get_posts', 'twpp_exclude_category' );

category__not_inで除外

function twpp_exclude_category( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }

  if ( $query->is_home() ) {
    $query->set( 'category__not_in', array(15, 16) );
  }
}

add_action( 'pre_get_posts', 'twpp_exclude_category' );

どちらの方法でやっても結果は同じですが、コードを見たときにわかりやすいのは後者だと思います。ただし、category__not_inの場合は渡す値が1つの場合でも配列にしてください。

なお、is_home()を用いて処理を投稿ページに限定していますが、条件を変えればどのページにも適用することができます。

カテゴリーやタグ・タクソノミーのIDを調べる

カテゴリーやタグなどのIDは、管理画面から調べることができます。カテゴリーの場合は管理画面において[投稿]→[カテゴリー]とたどると、カテゴリー一覧が現れます。調べたいカテゴリーをクリックした後で、URLを見てください。/wp-admin/term.php?taxonomy=post_tag&tag_ID=14&post_type=post…のようになっていると思いますが、このtag_IDがカテゴリーのIDです。タグやタクソノミーの場合も同様です。

特定のタグを付与した投稿を一覧表示から除外する

考え方はカテゴリーと同じですが、タグの場合はマイナスによる記法は使えませんtag__not_inを使用します。

function twpp_exclude_tag( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }

  if ( $query->is_home() ) {
    $query->set( 'tag__not_in', array(14, 15) );
  }
}

add_action( 'pre_get_posts', 'twpp_exclude_tag' );

渡すタグのIDが1つであっても配列として渡します。

特定のタクソノミーに属する投稿を一覧表示から除外する

WordPressバンドルのカテゴリーやタグ以外をタクソノミーとして追加している場合、特定のタクソノミーに属する投稿を除外することもできます。パラメータは'tax_query'を使いますが、渡す値は特殊な配列です。

function twpp_exclude_taxomnomy( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }

  if ( $query->is_home() ) {
    $tax_query = array(
      array(
        'taxonomy'  => 'genre',
        'terms'     => array( 15, 16 ),
        'operator'  => 'NOT IN',
      ),
    );
    $query->set( 'tax_query', $tax_query );
  }
}

add_action( 'pre_get_posts', 'twpp_exclude_taxomnomy' );

タクソノミーのクエリパラメータには、複数の値を受け取ることが想定されているため、配列の配列を渡します。'taxonomy'にはタクソノミーの名前(register_taxonomy()の第1引数で渡した名前)を、'terms'には対象となるIDを数値または配列で、'operator'には'NOT IN'(含まれない)を渡します。パラメータに関する詳細はCodexを参照してください。