インデックスの除外カテゴリーをページ送りナビに反映する方法

Cocoonカスタマイズ集
この記事は約3分で読めます。
記事内に広告が含まれています。

記事に記載したコードは、スキンに追加されています。

はじめに

エントリーカードやページ送りナビに表示する投稿をカテゴリー単位で制御できます(表1参照)。

Cocoon設定
設定大項目項目設定値
インデックス除外カテゴリー
投稿ページ送りナビ設定除外カテゴリー

ただし注意点があります。

  • インデックスの除外カテゴリー設定は、エントリーカードに反映されます。
  • 投稿のページ送りナビ設定の「除外カテゴリー」は、インデックスとは独立しているため、別途設定する必要があります。

例えば、投稿のページ送りナビ設定で「除外カテゴリー」を指定していない場合、インデックスで除外したカテゴリーに属する投稿であっても、ページ送りナビには表示されてしまいます。

そこで、インデックスで設定した除外カテゴリーを、ページ送りナビにも反映させます。

この記事では、この方法について説明します。

実装手順

以下のコードを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設定→インデックス→「除外カテゴリー」をエントリーカードだけでなくページ送りナビにも反映できるようになります。
これにより、意図しない投稿がページ送りに表示されることを防ぎ、より見やすいサイト構成を実現できます。

タイトルとURLをコピーしました