サイト内検索
Cocoonフォーラム
書き込みの前に以下の3点をご確認ください。
何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。
不具合・カスタマイズ対象ページのURL:
相談内容:
不具合の発生手順:
解決のために試したこと:
※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。
環境情報の取得方法はこちら。
→ https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
→ https://wp-cocoon.com/theme-trouble/
フォーラム利用ガイドリンク
- フォーラムガイドライン
- よくある質問と答え(FAQ)
- サポート対象外のケース
- 原因不明の不具合用トラブルシューティング
- トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw)
- 真っ白画面でのエラーメッセージの確認方法
- ブラウザ環境チェックツール
- Cocoonカスタマイズ依頼
フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。
トピックスターター 2022年6月30日 22:10
初めて質問させていただきます。
不具合・カスタマイズ対象ページのURL:
相談内容:
サイドバーだけでなく、グローバルメニューにもカテゴリーごとの投稿数を表示させたいのですが、調べて見つけた方法だと、親カテゴリーの投稿数が0と表示されてしまいます。
投稿のカテゴリー選択で、子カテゴリーのみにチェックを入れており、親カテゴリーにはチェックを入れていないためにこのような表示になっているのだと思いますが、親カテゴリーと子カテゴリーの両方にチェックを入れるのはできれば避けたいため、親カテゴリーの投稿数を子カテゴリーの投稿数の合計で表示させる方法がありましたら教えていただけると幸いです。
具体的には、
親カテゴリー「外国語」
子カテゴリー「英語」
というカテゴリー階層の下、
投稿のカテゴリーで「英語」のみにチェックを入れた場合に、
外国語 (0)
- 英語 (1)
ではなく、
外国語 (1)
- 英語 (1)
となるようにしたいです。
なお、サイドバーのカテゴリーウィジェットに関しては、
外観 > ウィジェット > サイドバー > カテゴリー > 投稿数を表示
にチェックを入れることで、親カテゴリーにチェックを入れる・入れないに関わらず
外国語 (1)
- 英語 (1)
と表示されるため、この設定に関するソースコードが見れればカスタマイズの参考にできるかなと思った次第ですが、
「投稿数を表示」にチェックを入れることによって具体的にテーマファイルのどの部分に影響するのかがわかりませんでした。
解決のために試したこと:
①下記リンクの記事を参考にしてfunctions.phpに下記コードを追加しました。
「メニュー内のカテゴリー項目の件数表示の件で」
function my_the_title_menu_category( $title, $post_ID ) { if ( 'nav_menu_item' == get_post_type( $post_ID ) ) { if ( 'taxonomy' == get_post_meta( $post_ID, '_menu_item_type', true ) && 'category' == get_post_meta( $post_ID, '_menu_item_object', true ) ) { $category = get_category( get_post_meta( $post_ID, '_menu_item_object_id', true ) ); if ( $category->count >= 0) { $title .= sprintf( ' (%d)', $category->count ); } } } return $title; } add_filter( 'the_title', 'my_the_title_menu_category', 10, 2 );
※参考にした記事では、
if ( $category->count > 0 )
と書かれていましたが、投稿数が0件の場合も表示したかったため
if ( $category->count >= 0 )
と自分のほうで書き換えています。
その他、下記リンクの記事も読みましたが、内容があまり理解できませんでした。
「Wordpress カテゴリ 親子 合計記事数 表示したい」
https://teratail.com/questions/194787
「WordPressの親カテゴリーの件数に子カテゴリーの件数を含めて表示させたい」
https://teratail.com/questions/173703
※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:
----------------------------------------------
サイト名:まなっぴーブログ
サイトURL: https://manappy.com
ホームURL: https://manappy.com
コンテンツURL:/wp-content
インクルードURL:/wp-includes/
テンプレートURL:/wp-content/themes/cocoon-master
スタイルシートURL:/wp-content/themes/cocoon-child-master
親テーマスタイル:/wp-content/themes/cocoon-master/style.css
子テーマスタイル:/wp-content/themes/cocoon-child-master/style.css
スキン:/wp-content/themes/cocoon-child-master/skins/lightning-skin-customized/style.css
WordPressバージョン:6.0
PHPバージョン:7.4.28
ブラウザ:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
サーバーソフト:Apache
サーバープロトコル:HTTP/1.1
言語:ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7
----------------------------------------------
テーマ名:Cocoon
バージョン:2.4.5.4
カテゴリ数:18
タグ数:3
ユーザー数:1
----------------------------------------------
子テーマ名:Cocoon Child
バージョン:1.1.3
style.cssサイズ:845バイト
functions.phpサイズ:1834バイト
※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。
2022年7月1日 00:24
WordPressの親カテゴリーの件数に子カテゴリーの件数を含めて表示させたい を参考に get_terms() でやってみました。
あまり詳しくチェックはしていませんが、投稿数は表示できると思います。
function my_the_title_menu_category( $title, $post_ID ) { if ( 'nav_menu_item' == get_post_type( $post_ID ) ) { if ( 'taxonomy' == get_post_meta( $post_ID, '_menu_item_type', true ) && 'category' == get_post_meta( $post_ID, '_menu_item_object', true ) ) { $cats = get_terms([ 'taxonomy' => 'category', 'pad_counts' => true, 'hide_empty' => false ]); foreach ( $cats as $cat ) { if ( $cat->name === $title ) { $title .= sprintf( ' (%d)', $cat->count ); } } } } return $title; } add_filter( 'the_title', 'my_the_title_menu_category', 10, 2 );
この投稿は2年前 2回ずつAkiraに変更されました
2022年7月1日 01:00
●ご参考
勉強になりました、ありがとうございます。
Akiraさんのコードですが、同一カテゴリ名称の時、問題かと?
function my_the_title_menu_category( $title, $post_ID ) { if ('nav_menu_item' == get_post_type( $post_ID )) { if ('taxonomy' == get_post_meta( $post_ID, '_menu_item_type', true ) && 'category' == get_post_meta( $post_ID, '_menu_item_object', true ) ) { $category = get_category(get_post_meta( $post_ID, '_menu_item_object_id', true )); $cnt = 0 ; if ($category -> parent) { // 孫子 $cnt = $category->count; } else { // 親の場合 $cats = get_categories(array( 'child_of' => $category->term_id, )); // 親に属する孫子の情報取得 foreach($cats as $cat) { $cnt += $cat->count; } } $title .= sprintf('(%d)', $cnt); } } return $title; } add_filter( 'the_title', 'my_the_title_menu_category', 10, 2 );
トピックスターター 2022年7月1日 08:41
トピックスターター 2022年7月1日 09:00
@chu-ya さん
元々追加していたコードをコメントアウトして、
頂戴したコードに書き換えてみたところ、実現したかった
「親カテゴリーの投稿数が子カテゴリーの投稿数の合計」で表示されました !
ありがとうございます !!
PHPにあまり詳しくなく、コードの意味をきちんと理解できていないので、返信後に一つ一つ読み解いて勉強させていただきます。
なお、コメントアウトのところに孫子と書いてあったので、孫カテゴリーを作っても同じことが成り立つのかなと思い、試しに
理科
- 物理
-- 量子力学
-- 統計力学
- 化学
- 生物
- 地学
というように孫カテゴリーまで用意してみたのですが、この場合は
親カテゴリー(理科)の投稿数は子カテゴリーと孫カテゴリーの合計になるものの、
子カテゴリー(物理)の投稿数は孫カテゴリーの合計にはならず0となるようでした。
(孫カテゴリーにチェックを入れる投稿は親カテゴリー・子カテゴリー共にチェックを入れない場合)
親カテゴリーの投稿数は全ての子カテゴリーと孫カテゴリーの投稿数の合計で表示して、
子カテゴリーの投稿数は全ての孫カテゴリーの投稿数の合計で表示する、つまり
理科 (5)
- 物理 (2)
-- 量子力学 (1)
-- 統計力学 (1)
- 化学 (1)
- 生物 (1)
- 地学 (1)
のように表示させるとなると、コードがかなり複雑になりそうですね?
ただ、今のところ孫カテゴリーまで作る予定はなく、頂戴したコードでやりたいことが実現できたので、こちらを使わせていただきます。
改めてありがとうございました ?
トピックスターター 2022年7月1日 09:15
@chu-ya さん
連投失礼します。
先ほどコメントの返信で、
「ただ、今のところ孫カテゴリーまで作る予定はなく、頂戴したコードでやりたいことが実現できたので、こちらを使わせていただきます。」と申し上げましたが、もし
「親カテゴリーの投稿数は全ての子カテゴリーと孫カテゴリーの投稿数の合計で表示して、
子カテゴリーの投稿数は全ての孫カテゴリーの投稿数の合計で表示する」
を実現できるようなコードが書けそうであれば、後学のために教えていただいてもよろしいでしょうか...?
(欲張りですみません...笑)
時間を要してchu-yaさんのご負担になるようでしたら無理なさらなくて大丈夫です?
ちなみにサイドバーウィジェットでは添付のスクリーンショットのように「物理 (2)」と、孫カテゴリーの投稿数の合計で表示されているので、サイドバーの設定の裏側の仕組みが見れたら良いのですが...
2022年7月1日 11:10
@manappy さん
Akiraさんのコードですが、同一カテゴリ名称の時、問題かと?
おっしゃる通りですね。ご指摘ありがとうございます。
また、メニューを変更するのにフィルターフック the_title を使うのが、私にはしっくりきません。
さらに、manappy さんの「親カテゴリーの投稿数は全ての子カテゴリーと孫カテゴリーの投稿数の合計で表示して、子カテゴリーの投稿数は全ての孫カテゴリーの投稿数の合計で表示する」を実現するために、このように書いてみました。
add_filter( 'wp_get_nav_menu_items', function( $items ) { $cats = get_categories([ 'pad_counts' => 1, 'hide_empty' => 0 ]); foreach ( $items as $item ) { if ( $item->object === 'category' ) { foreach ( $cats as $cat ) { if ( $item->object_id === (string)$cat->term_id ) { $item->title .= ' (' . $cat->count . ')'; } } } } return $items; });
添付画像の右 4 つが、親 > 子 > 孫A と 孫B の階層になっているカテゴリーです。孫Aに 2 つ、孫B に 1 つの投稿があり、親と子は何も投稿がありません。また、親や子に投稿がある場合は、その投稿数が加算されます。左から 2 つ目の親は同じ名前のメニューがある場合のテスト用で、何も階層にはなっていません。
この投稿は2年前 2回ずつAkiraに変更されました
2022年7月1日 14:04
@akira さん
上記コードを実行した際、以下の現象となりました。
●現象
件数表示の対象が、ヘッダーメニューだけでなく、ボックスメニューのタイトルも件数表示される。
●疑問
何故か、ボックスメニューとヘッダーメニューで件数が異なり。
get_categoriesの配列を見ると、category_count、countの値が異なっており。
【ヘッダーメニュー】
[18] => WP_Term Object (
[term_id] => 10
[name] => 車
[slug] => %e8%bb%8a
[term_group] => 0
[term_taxonomy_id] => 10
[taxonomy] => category
[description] =>
[parent] => 0
[count] => 24
[filter] => raw
[term_order] => 3
[cat_ID] => 10
[category_count] => 24
[category_description] =>
[cat_name] => 車
[category_nicename] => %e8%bb%8a
[category_parent] => 0 )
【ボックスメニュー】
[term_id] => 10
[name] => 車
[slug] => %e8%bb%8a
[term_group] => 0
[term_taxonomy_id] => 10
[taxonomy] => category
[description] =>
[parent] => 0
[count] => 0
[filter] => raw
[term_order] => 3
[cat_ID] => 10
[category_count] => 0
[category_description] =>
[cat_name] => 車
[category_nicename] => %e8%bb%8a
[category_parent] => 0 )
わいひら reacted
2022年7月2日 01:19
少し調べましたが、wp_get_nav_menu_itemsを以下で用いており。
件数がタイトルに付加されてしまいます。
- navi_list
- box_menu
この時、先にも書きましたが、カテゴリが以下の時、
ヘッダーメニューは車(24)となるが、なぜかボックスメニューは車(0)となり。
同じメニューを、ヘッダーメニューと、ボックスメニューに設定しているのに、値が異なる原因が不明です。
車(0)
+ ポルシェ(4)
+ ラパン(20)
わいひら reacted
2022年7月2日 14:41
@manappy さん
この方法はダメかもしれません。スマホでメニューを表示した際に、投稿数が正常に取得できていないです。
ちょうど不具合としてご報告のあった カテゴリーの記事数カウントがPCとスマホで異なる と同じ現象が起きています。
これが WordPress 、具体的には get_categories() の仕様なのか不具合なのか判断できていません。仕様との前提でコードを変更するのがいいように思えます。コードをどう書くか考えますが、申し訳ありませんが返事は遅くなると思います。
わいひら reacted
問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。
また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。
(CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。
フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。
最近の書き込みはこちら。
詳細なカスタマイズ依頼をするならこちら。