Cocoonフォーラム

サイト内検索
書き込みの前に以下の3点をご確認ください。
  1. 1つのトピックにつき1つの質問を書き込んでください
  2. 不具合・カスタマイズ対象ページのURLを提示高速化を無効にしてください
  3. 該当部分のキャプチャ・環境情報とともに書き込んでいただけると助かります

何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。

不具合・カスタマイズ対象ページのURL:

相談内容:

不具合の発生手順:

解決のために試したこと:

※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:

※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。

環境情報の取得方法はこちら。
https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
https://wp-cocoon.com/theme-trouble/

フォーラム利用ガイドリンク

  1. フォーラムガイドライン
  2. よくある質問と答え(FAQ)
  3. サポート対象外のケース
  4. 原因不明の不具合用トラブルシューティング
  5. トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw
  6. 真っ白画面でのエラーメッセージの確認方法
  7. ブラウザ環境チェックツール
  8. Cocoonカスタマイズ依頼

フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。

「アーカイブに出力しない」場合のカテゴ...
 
共有:
通知
すべてクリア

「アーカイブに出力しない」場合のカテゴリーウィジェットの件数について

3 投稿
2 ユーザー
0 Reactions
18 表示
mk2
(@mk2_mk2)
Illustrious Member Moderator
結合: 5年前
投稿: 9240
トピックスターター  

平素よりお世話になっております。

「アーカイブに出力しない」場合の、仕様の確認をさせてください。
(過去にも何回かお問い合わせ等あり、少しこんがらがってきたり、前のことも忘れてしまいました)

 

カテゴリー「Archive page TEST」には、4件の投稿があります。

 
 
 
この内の1件の投稿には、「アーカイブに出力しない」にチェックがあります。
 
 
 
その場合のカテゴリーアーカイブページですが、以下のような表示です。
 
 
インデックスに表示される投稿は3件で、これは意図したものだと思います。
 
ただ、カテゴリーウィジェットの件数は、4件になっています。
これが仕様がどうか、確認させてください。
 
 
ばっと見では、インデックスリストとカテゴリーウィジェットの件数に、差異があり、違和感がありました。
(昨日のお問い合わせ中に、気づいて少し違和感がありました)
 
確かにこのカテゴリーには、4件投稿があると言えばありますし。
(フロント側にそれが出ていると、隠している意味が、という気もしますし、get_termsで介入できそうな気もしますし)

その辺りの、確認をさせていただければと思います。


   
引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 4年前
投稿: 3890
 

投稿者:: @mk2_mk2

ばっと見では、インデックスリストとカテゴリーウィジェットの件数に、差異があり、違和感がありました。

「アーカイブ」ウィジェットの方が分かりいいかもしれません。

「アーカイブ」ウィジェットの投稿数も不一致になります。


本件ですが、除外カテゴリーでも同様なことが言えます。

除外(public)≠非公開(private)なので、件数を合わせるには自前で除外する必要があります。
実際、コード書きましたが、結構面倒です。


この投稿は2時間前ずつ大門未知子に変更されました

   
返信引用
mk2
(@mk2_mk2)
Illustrious Member Moderator
結合: 5年前
投稿: 9240
トピックスターター  

昨日のお問い合わせで、少し違和感があったことと。
過去の経緯等忘れてしまいましたので、まずは仕様確認をという感じでした。

投稿者:: @chu-ya

「アーカイブ」ウィジェットの投稿数も不一致になります。

言われてみれば。

とりあえず、カテゴリーの方は考えていましたが、アーカイブウィジェットの方はすっぽり抜けていました。
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;
}

 

今日は、フォーラムに顔を出せるのは、これまでです。
また後日・・・。(明日は通院ですので、更にその後日に)


この投稿は1時間前 3回ずつmk2に変更されました

   
返信引用
共有:

問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。

また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。

「いいね!」機能はフォーラム登録者のみが利用できる機能です。

CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。

フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。

最近の書き込みはこちら。

詳細なカスタマイズ依頼をするならこちら。

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