Cocoon設定の【インデックス】タブで、アーカイブから該当カテゴリを除外すると、その該当カテゴリは新着記事一覧・関連記事一覧からも姿を消す。
だが、困ったことに、このとき、カテゴリトップページ=該当カテゴリの記事一覧ページが消滅する。
404になってしまう。ガチ消滅。
というわけで、ガチ消滅した該当カテゴリトップページを復活させる方法を記したのがこのページです。
前提条件
前提条件は
Cocoon設定>【インデックス】タブで、アーカイブから該当カテゴリを除外
すること。
funtion.phpに記載するコード
以下のコードをfuntion.phpに記載してアップロードしましょう。
除外したいカテゴリIDを「数値」で設定すること!!
//Cocoon設定の関連記事で除外設定したカテゴリトップを復活させる
// 除外したいカテゴリIDを「数値」で
$excluded_cat_ids = array(10, 20);
// カテゴリアーカイブの最終調整(親カテゴリでは子カテゴリ記事を除外/
/* 除外カテゴリ自身のアーカイブは生かす) */
add_action('pre_get_posts', function($q) use ($excluded_cat_ids){
if (is_admin() || !$q->is_main_query() || !$q->is_category()) return;
$term = get_queried_object();
if (!($term && isset($term->term_id))) return;
$term_id = (int) $term->term_id;
// 1) 除外カテゴリ自身のアーカイブは「生かす」
if (in_array($term_id, $excluded_cat_ids, true)) {
// このカテゴリだけを対象にし、除外条件を外す
$q->set('category__in', array($term_id));
$q->set('category__not_in', array());
// tax_query に category の NOT IN/NOT EXISTS があれば取り除く
$tax = $q->get('tax_query');
if (is_array($tax)) {
$clean = array();
foreach ($tax as $clause) {
if (isset($clause['taxonomy'], $clause['operator'])
&& $clause['taxonomy'] === 'category'
&& in_array($clause['operator'], array('NOT IN','NOT EXISTS'), true)) {
continue;
}
$clean[] = $clause;
}
$q->set('tax_query', $clean);
}
return;
}
// 2) それ以外(親カテゴリなど)では、除外カテゴリの記事を出さない
$q->set('category__not_in', $excluded_cat_ids);
}, 50);
※本記事は私的備忘録です。自己責任でのご利用をお願いします。