050
メインループで出力される投稿一覧から、特定のカテゴリー・タグ・タクソノミーに属する記事を除く
Library
メインループで記事を出力する場合に、ある特定のカテゴリーやタグ、あるいはタクソノミーに属するものを除外したい場合があります。これは、pre_get_postsのアクションフックを用いて、クエリする条件を変更することで実現します。
| 用例 |
|
|---|---|
| 関連 | |
| Codex |
特定のカテゴリーに属する投稿を一覧表示から除外する
メインループのクエリ条件を変更するには、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を参照してください。
Comment