はじめに
エントリーカードやページ送りナビに表示する投稿をカテゴリー単位で制御できます(表1参照)。
| 設定 | 大項目 | 項目 | 設定値 |
|---|---|---|---|
| インデックス | 除外カテゴリー | ||
| 投稿 | ページ送りナビ設定 | 除外カテゴリー |
ただし注意点があります。
- インデックスの除外カテゴリー設定は、エントリーカードに反映されます。
- 投稿のページ送りナビ設定の「除外カテゴリー」は、インデックスとは独立しているため、別途設定する必要があります。
例えば、投稿のページ送りナビ設定で「除外カテゴリー」を指定していない場合、インデックスで除外したカテゴリーに属する投稿であっても、ページ送りナビには表示されてしまいます。
そこで、インデックスで設定した除外カテゴリーを、ページ送りナビにも反映させます。
この記事では、この方法について説明します。
実装手順
以下のコードをfunctions.phpに追加します。
add_filter('theme_mod_post_navi_exclude_category_ids', function ($current_mod) {
if (!is_admin()) {
$current_mod = get_archive_exclude_category_ids();
}
return $current_mod;
});
参考:除外アーカイブをページ送りナビに反映する方法

投稿を除外アーカイブに設定すると、投稿一覧などでは非表示になります。
しかし、前後の投稿を移動するページ送りナビには、除外アーカイブに設定した投稿が表示されてしまいます。
そこで、除外アーカイブに設定した投稿をページ送りナビからも非表示にします。
実装手順
以下をfunctions.phpに追加します。
/**
* 投稿ナビの隣接投稿から除外アーカイブ投稿を除外
*
* @param string $where 既存の SQL WHERE句
* @param bool $in_same_term 同じターム内か
* @param array $excluded_terms 除外カテゴリーID配列
* @param string $taxonomy 対象タクソノミー
* @param WP_Post $post 現在の投稿オブジェクト
* @return string $where
*/
if (!function_exists('filter_adjacent_post_excluded_archive')):
function filter_adjacent_post_excluded_archive($where, $in_same_term, $excluded_terms, $taxonomy, $post) {
global $wpdb;
if (is_admin()) {
return $where;
}
$where .= " AND NOT EXISTS (
SELECT 1 FROM {$wpdb->postmeta} pm
WHERE pm.post_id = p.ID
AND pm.meta_key = 'the_page_no_archive'
AND pm.meta_value = '1'
)";
return $where;
}
endif;
// 前後の投稿の対象ステータスを拡張
add_filter('get_previous_post_where', 'filter_adjacent_post_excluded_archive', 10, 5);
add_filter('get_next_post_where', 'filter_adjacent_post_excluded_archive', 10, 5);
さいごに
今回紹介した方法を使えば、Cocoon設定→インデックス→「除外カテゴリー」をエントリーカードだけでなくページ送りナビにも反映できるようになります。
これにより、意図しない投稿がページ送りに表示されることを防ぎ、より見やすいサイト構成を実現できます。

