function.phpに以下のコードをコピペすればOKです。
//【親】カテゴリ新着記事一覧から【子】メモを除外する
function exclude_child_category_from_parent($query) {
if ($query->is_main_query() && !is_admin() && $query->is_category()) {
$current_cat = get_queried_object(); // 表示中のカテゴリ情報を取得
// 親カテゴリのスラッグが 'blog' の場合(スラッグは自分の環境に合わせてね)
if ($current_cat && $current_cat->slug === 'blog') {
// 除外したい子カテゴリID(ここでは「メモ」)
$exclude_cat = get_cat_ID('メモ');
// 現在のカテゴリID(親)を指定して、子カテゴリだけ除外
$query->set('category__not_in', array($exclude_cat));
}
}
}
add_action('pre_get_posts', 'exclude_child_category_from_parent');
コード内のコメントにしたがって、適宜ご自身の環境に置き換えてください。
挙動の詳細。Cocoon設定の非表示設定とはどう違うのか
このコードで除外設定をすると以下のようになります。
- 特定の親カテゴリに特定の子カテゴリの投稿記事一覧が非表示になる。
- 子カテゴリの投稿記事一覧ページには、きちんとその子カテゴリの投稿記事一覧が表示される。
- 該当の子カテゴリの関連ページにも、該当の子カテゴリのページが表示される。
(※ただし親カテゴリ判定での抽出になるので、子カテゴリの記事のみで埋め尽くされるわけではない)
Cocoon設定の特定カテゴリの非表示設定だと、該当の子カテゴリの記事一覧ページからも投稿記事一覧すべて非表示になってしまいます。
それでは具合の悪い方は、上記コードを使うとよいでしょう。
おまけ。新着記事一覧から該当カテゴリの投稿記事一覧を除外する
以下のコードをfunction.phpにコピペすればOKです。
//サイトトップの新着記事から特定カテゴリの除外
function exclude_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-66' );//マイナスをつけてカテゴリIDを除外する
}
}
add_action( 'pre_get_posts', 'exclude_category' );
コード内のコメントにしたがって、適宜ご自身の環境に置き換えてください。
最初に紹介した『特定【子】カテゴリの投稿記事を特定【親】カテゴリから除外する』コードと合わせ技で使えば、かなりスッキリとサイト表示が整理できると思います。
※本記事は私的備忘録です。自己責任でのご利用をお願いします。