サイト内検索
Cocoonフォーラム
書き込みの前に以下の3点をご確認ください。
何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。
不具合・カスタマイズ対象ページのURL:
相談内容:
不具合の発生手順:
解決のために試したこと:
※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。
環境情報の取得方法はこちら。
→ https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
→ https://wp-cocoon.com/theme-trouble/
フォーラム利用ガイドリンク
- フォーラムガイドライン
- よくある質問と答え(FAQ)
- サポート対象外のケース
- 原因不明の不具合用トラブルシューティング
- トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw)
- 真っ白画面でのエラーメッセージの確認方法
- ブラウザ環境チェックツール
- Cocoonカスタマイズ依頼
フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。
トピックスターター 2025年10月29日 19:48
平素よりお世話になっております。
「アーカイブに出力しない」場合の、仕様の確認をさせてください。
(過去にも何回かお問い合わせ等あり、少しこんがらがってきたり、前のことも忘れてしまいました)
①
カテゴリー「Archive page TEST」には、4件の投稿があります。
②
この内の1件の投稿には、「アーカイブに出力しない」にチェックがあります。
③
その場合のカテゴリーアーカイブページですが、以下のような表示です。
インデックスに表示される投稿は3件で、これは意図したものだと思います。
ただ、カテゴリーウィジェットの件数は、4件になっています。
これが仕様がどうか、確認させてください。
ばっと見では、インデックスリストとカテゴリーウィジェットの件数に、差異があり、違和感がありました。
(昨日のお問い合わせ中に、気づいて少し違和感がありました)
確かにこのカテゴリーには、4件投稿があると言えばありますし。
(フロント側にそれが出ていると、隠している意味が、という気もしますし、get_termsで介入できそうな気もしますし)
(フロント側にそれが出ていると、隠している意味が、という気もしますし、get_termsで介入できそうな気もしますし)
その辺りの、確認をさせていただければと思います。
2025年10月29日 20:27
ばっと見では、インデックスリストとカテゴリーウィジェットの件数に、差異があり、違和感がありました。
「アーカイブ」ウィジェットの方が分かりいいかもしれません。
「アーカイブ」ウィジェットの投稿数も不一致になります。
本件ですが、除外カテゴリーでも同様なことが言えます。
除外(public)≠非公開(private)なので、件数を合わせるには自前で除外する必要があります。
実際、コード書きましたが、結構面倒です。
トピックスターター 2025年10月29日 21:16
昨日のお問い合わせで、少し違和感があったことと。
過去の経緯等忘れてしまいましたので、まずは仕様確認をという感じでした。
「アーカイブ」ウィジェットの投稿数も不一致になります。
言われてみれば。
とりあえず、カテゴリーの方は考えていましたが、アーカイブウィジェットの方はすっぽり抜けていました。
ChatGPTに修正をお願いすると、以下のような感じにはなりました。
(除外カテゴリー考慮に入れていません。テストもほぼしていません。子テーマに追加しただけですね)
add_filter('widget_display_callback', 'set_widget_exclude_filter', 10, 3);
// 除外投稿リスト対象取得用
$excluded_posts_cache = null;
function set_widget_exclude_filter($instance, $widget, $args) {
// id_base存在確認
if (!isset($widget->id_base)) {
return $instance;
}
// カテゴリーウィジェット
if ($widget->id_base === 'categories') {
add_filter('get_terms', 'filter_cat_counts', 10, 3);
}
// アーカイブウィジェット
if ($widget->id_base === 'archives') {
add_filter('getarchives_where', 'filter_archive_counts', 10, 2);
}
return $instance;
}
// 除外する投稿を取得
function get_excluded_posts() {
global $excluded_posts_cache;
if ($excluded_posts_cache === null) {
// 除外対象投稿IDを取得
$excluded_posts_cache = get_posts(array(
'post_type' => 'post',
'posts_per_page' => -1,
'fields' => 'ids',
'meta_query' => array(
array(
'key' => 'the_page_no_archive',
'value' => 1,
'type' => 'NUMERIC',
),
),
));
}
// 2回目以降は前回のものを使用
return $excluded_posts_cache;
}
// カテゴリーウィジェット
function filter_cat_counts($terms, $taxonomies, $args) {
// カテゴリーのみ対象
if (!in_array('category', (array)$taxonomies, true)) {
return $terms;
}
$excluded_posts = get_excluded_posts();
foreach ($terms as $key => $term) {
$query = new WP_Query(array(
'post_type' => 'post',
'posts_per_page' => 1, // found_postsだけ使用
'fields' => 'ids',
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $term->term_id,
),
),
'post__not_in' => $excluded_posts,
));
// 再計算した投稿数
$terms[$key]->count = $query->found_posts;
}
// フィルター解除
remove_filter('get_terms', 'filter_cat_counts', 10);
return $terms;
}
// アーカイブウィジェット
function filter_archive_counts($where, $r) {
global $wpdb;
$excluded_posts = get_excluded_posts();
if ($excluded_posts) {
$excluded_ids = implode(',', array_map('absint', $excluded_posts));
// WHERE に除外投稿IDを追加
$where .= " AND {$wpdb->posts}.ID NOT IN ($excluded_ids)";
}
// フィルター解除
remove_filter('getarchives_where', 'filter_archive_counts', 10);
return $where;
}
今日は、フォーラムに顔を出せるのは、これまでです。
また後日・・・。(明日は通院ですので、更にその後日に)
2025年10月30日 00:07
●補足
本件ですが、「カレンダー」ウィジェットも同様のことが言えます。
除外とした日アーカイブにリンクが表示され、クリックすると404ページとなります。
●意見
除外カテゴリー、除外アーカイブは余り使われる機能ではないと思うので、そこまで頑張る必要があるか?と思います。
このため、マニュアルに明記でいいのでは?
除外するなら、投稿を「非公開」としWordPressコアに任せるのが本来かと思います。
問題とするなら、除外アーカイブがページ送りに反映されてしまうことです。
トピックスターター 2025年10月30日 09:57
カレンダーウィジェット
(ちょっと強引か・・・)
add_filter('get_calendar', 'filter_calendar_links');
function filter_calendar_links($output) {
// カレンダーの日付リンクを抽出
if (!preg_match_all('#<a\s+href="([^"]+/(\d{4})/(\d{2})/(\d{2})/)"[^>]*?>(\d+)</a>#u', $output, $matches, PREG_SET_ORDER)) {
return $output;
}
$excluded_posts = get_excluded_posts();
foreach ($matches as $match) {
list(, $url, $year, $month, $day, $label) = $match;
// 指定日の投稿を取得
$posts = get_posts(array(
'post_type' => 'post',
'posts_per_page' => -1,
'fields' => 'ids',
'year' => $year,
'monthnum' => $month,
'day' => $day,
));
if (empty($posts)) {
continue;
}
// すべて除外投稿ならリンクを削除
$all_excluded = true;
foreach ($posts as $post_id) {
if (!in_array($post_id, $excluded_posts, true)) {
$all_excluded = false;
break;
}
}
if ($all_excluded) {
// 対応するリンクを数字に置き換え
$pattern = sprintf(
'#<a\s+href="%s"[^>]*?>%s</a>#u',
preg_quote($url, '#'),
$label
);
$output = preg_replace($pattern, $label, $output);
}
}
return $output;
}
ページ送りナビ
add_filter('get_previous_post_where', 'custom_adjacent_post', 10, 5);
add_filter('get_next_post_where', 'custom_adjacent_post', 10, 5);
function custom_adjacent_post($where, $in_same_term, $excluded_terms, $taxonomy, $post) {
$excluded_posts = get_excluded_posts();
if ($excluded_posts) {
$excluded_ids = implode(',', array_map('absint', $excluded_posts));
$where .= " AND p.ID NOT IN ($excluded_ids)";
}
return $where;
}
- どちらも、アーカイブウィジェットのところの関数を使用しています
- 現段階で、除外カテゴリーは考慮していません
- ほぼ確認はしていません
- 同じように、違和感をもった方がいらしたら、叩き台くらいにはなるかなという柔らかさです
トピックスターター 2025年10月30日 10:02
特に、以下のようなことは、現段階では思ってはおらず。
- この機能そのものがどうとか
- こうあるべきとか
- 修正して欲しいとか
先に書いたように、
「アーカイブに出力しない」場合の、仕様の確認をさせてください。
(過去にも何回かお問い合わせ等あり、少しこんがらがってきたり、前のことも忘れてしまいました)
そもそも、どうだったかとか、過去の背景とか。
まずは、確認させていただいてから考えれば良いのではないか、くらいにしか思っていませんでした。
(数は少ないにしろ「アーカイブに出力しない」は過去のトピックで見掛けたイメージはあり、今回のお問い合わせもあり、少し確認してみようくらいの動機)
どうやら、そういう確認すらも憚られる空気のようですので、これにてクローズしてしまおうかと思います。
(今日はこれから通院で、返信などもできないと思いますし、明日以降に、またどうこう考えるのも、もう良いかなと)
問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。
また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。
(CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。
フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。
最近の書き込みはこちら。
詳細なカスタマイズ依頼をするならこちら。






