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カスタマイズ依頼

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

【不具合報告】階層タクソノミーで親子チ...
 
通知
すべてクリア

【不具合報告】階層タクソノミーで親子チェック時、パンくずが親タームで止まってしまう

14 投稿
3 ユーザー
6 Reactions
266 表示
(@natsume-sawajiri)
Active Member Registered
結合: 4週間前
投稿: 5
トピックスターター  

Cocoon バージョン:2.9.0.10

要望内容:
カスタム投稿タイプなどで階層を持つタクソノミーを使用している際、親子両方のタームにチェックを入れていると、パンくずリストの起点が「親ターム」になってしまいます。これを、より具体的な「子ターム」を優先して取得するように改善していただきたいです。

原因箇所:
geminiと相談しながら原因を調べたのでこれが原因か100%の自信はありませんが

tmp/breadcrumbs.php(または該当するパンくず生成ロジック)内の以下のコードが原因と思われます。

$cats = wp_get_post_terms($post->ID, reset($hierarchical_taxonomies), $args);
if (!empty($cats)) {
// 最初のタクソノミーを取得
$cat = $cats[0];
}

詳細な理由:

wp_get_post_terms で取得される配列 $cats は、標準では「ID順」や「名前順」で並びます。

親子両方にチェックが入っている場合、「親ターム」が配列の先頭($cats[0])にくることがあります。

その結果、コードが「0番目」だけを正解として採用するため、より深い階層にある子タームが無視され、パンくずが親で止まってしまいます。

改善案:
配列の先頭をそのまま取るのではなく、取得したタームを「階層の深さ順(より深いものが先頭)」にソートしてから [0] を取得するように変更していただけないでしょうか。

(例:usort 等で get_ancestors の数が多いものを優先するなど)

今の挙動にも理由はあるかもしれませんが、少なくともオプションにする価値はあると思います。

これにより、ユーザーが「パンくずを子タームにするために、わざわざ親タームのチェックを外す」という不自然な運用をしなくて済むようになります。ご検討いただけますと幸いです。



   
わいひら reacted
引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 4年前
投稿: 4367
 

●回答

不具合でなく要望では?

パンくずリストの起点が「親ターム」になってしまいます。

「子から表示(親を隠す)」という見せ方は、パンくずリストの本来の目的(現在地と構造の把握)から外れるため、一般的ではありません。

パンくずリストの基本的な考え方と、階層の扱いについて整理します。

通常は 「ホーム > 親 > 子 > 孫(現在地)」 という順序で、左から右へ階層が深くなるように並べます。

なぜ「親」を省略しないのか?
パンくずリストには以下の2つの重要な役割があるからです。

  • ユーザーのため: 1クリックで「親」や「ホーム」に戻れるようにする。
  • 検索エンジン(SEO)のため: Googleなどのロボットに「このサイトはこういう階層構造になっている」と正しく伝える。

もし「子 > 孫」だけを表示してしまうと、ユーザーは「さらにその上の親カテゴリ」に移動したい時に、メニューを探し直さなければならなくなります。

CocoonとWordPress7.0で導入される「パンくず」ブロックを添付します。

運用例を示して頂けると、意図が分かるかと思います。

 



   
わいひら reacted
返信引用
(@natsume-sawajiri)
Active Member Registered
結合: 4週間前
投稿: 5
トピックスターター  

すみません書き方が悪かったですが

ホーム>親>子

になることもあれば

ホーム>親

だけになることもあるってことです。

$cats = wp_get_post_terms($post->ID, reset($hierarchical_taxonomies), $args);
if (!empty($cats)) {
// 最初のタクソノミーを取得
$cat = $cats[0];
}

ここで最初のタクソノミーを取得してるので挙動がwp_get_post_terms で取得される配列 $catsに依存してしまうってことです。
これはタクソノミーの親子構造を考慮してないと思うのです。
少なくとも自分で検証したときはそうでした。



   
返信引用
(@natsume-sawajiri)
Active Member Registered
結合: 4週間前
投稿: 5
トピックスターター  
    $args = array(
        'order'   => 'ASC', // 昇順に並べる
        'orderby' => 'name', // 名前順で並べる
    );

    // 最初の階層型タクソノミーでタームを取得
    $cats = wp_get_post_terms($post->ID, reset($hierarchical_taxonomies), $args);
    if (!empty($cats)) {
      // 最初のタクソノミーを取得
      $cat = $cats[0];
    }

すみません追記です。
ソートが名前順なので親子の名前によって$catが何になるか変わっちゃうことになると思います。
違ってたらすみません。。。



   
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 4年前
投稿: 4367
 
具体的な実例を併記していただければ、よりスムーズに状況を把握できるかと思います。
 
バグと言うより仕様、考え方ですね。
----------------------------------------------
テーマ名:Cocoon
バージョン:2.9.0.12
カテゴリー数:18
タグ数:123
投稿数:1748
固定ページ数:12
ユーザー数:1
----------------------------------------------
●設定
投稿に「親カテゴリー(アメブロ)」と「子カテゴリー(イベント)」の両方を設定した。

●原因
現在のロジックでは、カテゴリーを名前順(A-Z)で取得しているため、配列の先頭には親である「アメブロ」が格納される。
 
その結果、変数 $cat に親カテゴリーが代入されてしまい、続く「親へさかのぼる処理」において、起点となるべき「子(イベント)」が無視される。
 
 
これにより、パンくずリストが「ホーム > アメブロ」で止まってしまい、「ホーム > アメブロ > イベント」という期待通りの階層表示にならない。
※WordPress 7.0環境においても同様の挙動を確認済み(図参照)。

●注意点
カテゴリー名の命名(アルファベット順など)によって、取得順序および表示結果が変動してしまう。

●案
 
$cats = wp_get_post_terms($post->ID, reset($hierarchical_taxonomies), $args);
if (!empty($cats)) {
  $cat = $cats[0]; 

  // 子があるか検索し、最初の子を基点とする
  foreach ($cats as $t) {
    if ($t->parent !== 0) {
      $cat = $t;
      break;
    }
  }
}
 


   
わいひら reacted
返信引用
(@natsume-sawajiri)
Active Member Registered
結合: 4週間前
投稿: 5
トピックスターター  

@chu-ya 

ご返信ありがとうございます。

説明不足ですみませんでした。

提案されているコードですが、単純に親以外(parent !== 0)を探すだけの修正案では、3階層以上(親 > 子 > 孫)の構造がある場合に、中間階層で止まってしまうなど、適切に動作しないケースが考えられます。

また、一律に子を優先に書き換えてしまうと、従来の挙動を前提に運用していたユーザーに影響が出るため、Cocoon設定のパンくずリストタブでのオプション選択制とするのが合理的ではないかと考えております。

【提案するオプション案】

1. 最も深い階層を持つタームを優先して表示
(タームの階層の深さを判定し、最も深い階層を持つタームを起点にする。同階層が複数ある場合の優先度問題は残るが実装は2. より簡単になるとおもいます)

2. 選択された全てのタームのパンくずを並列表示
(個人的にはこの形が最も理想的です。設定でのオプション選択制だけで対応する場合、1列限定表示だと優先度問題が残るので。欲を言えば並列表示の順番も個別指定できれば嬉しいですけど、実装が面倒そうな気がします。タームID順や名前順なら$argsの設定だけでいけそう)

3. 従来通り(デフォルト)
(既存ユーザーの表示を変えないための互換性維持。名前順なので非推奨になると思います)

ご検討いただけますと幸いです。よろしくお願いいたします。



   
わいひら reacted
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 4年前
投稿: 4367
 

@natsume-sawajiri さん

1. 最も深い階層を持つタームを優先して表示

上記の案で機能を試作しました。
修正済みのbreadcrumbs.php を下記にアップしています。

https://notepad.pw/share/ap63czmdm

検証用に Cocoon 設定画面へ切り替え項目を追加してみました。

https://notepad.pw/share/2y99r07kc

私はCocoonを愛用している一介のユーザーに過ぎません。
最終的な判断は作者であるわいひらさんにお任せします。

 



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

●補足

運用でカバーできるかと思います。

カテゴリーに階層(a > b > c > d)がある場合、投稿には最下層の「d」だけを付与すれば十分ではないでしょうか。

上位カテゴリー(a, b, c)の一覧ページにも、その子要素である「d」に属する投稿は自動的に表示されるからです。
また、パンくずリストも「d」から親カテゴリーを遡って生成されるため、投稿側でわざわざ親カテゴリーまで選択する必要ないように思います。

ただ、投稿のカテゴリー・タグ表示には、「d」のみとなりますが。


●余談

簡単なカスタマイズで、カテゴリーにカレント表示する方法もあるかと思います。



   
返信引用
(@natsume-sawajiri)
Active Member Registered
結合: 4週間前
投稿: 5
トピックスターター  

@chu-ya 

ご返答ありがとうございます。

一点、もし他の人が見てそうするとまずいと思ったので言うのですが

>運用でカバーできるかと思います。

これはわいひらさんの対応がないことが確定していて、phpも何も触れない人向けの最後の手段です。
もちろん、本当にそうしていい、悪影響が一切ないと思うのであればいいのですが、やむを得ず、という感じであれば現段階で運用で対応するのはよくありません。

何十、何百記事と書いた後でやっぱりそうすべきじゃなかった、と後悔した場合、手動はもちろん、プログラム的に処理しようとしてもphpファイルをいじるよりはるかに手間がかかります。

どちらにせよ、今はわいひらさん待ちでいいように思います。


この投稿は4週間前ずつnatsume.sawajiriに変更されました

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

@natsume-sawajiri さん

どちらにせよ、今はわいひらさん待ちでいいように思います。

その通りですね。



   
返信引用
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 8年前
投稿: 18448
 

ご提案いただきありがとうございます。

投稿者:: @natsume-sawajiri

2. 選択された全てのタームのパンくずを並列表示
(個人的にはこの形が最も理想的です。設定でのオプション選択制だけで対応する場合、1列限定表示だと優先度問題が残るので。欲を言えば並列表示の順番も個別指定できれば嬉しいですけど、実装が面倒そうな気がします。タームID順や名前順なら$argsの設定だけでいけそう)

これだと検索エンジンからだと一番上のものが採用されやすいので、検索エンジン対応目線で言うと以前と変わらないような気はします(もちろん、読者目線だとどんなカテゴリーに属しているのか分かりやすいというのはある)。
だからこそ、順番変更と書かれているのだと思いますが、書かれている通り、そこまでするのは結構面倒そうに思います(ユーザー的にも分かりづらく、扱いづらい)。

ですので、「一番長いタームのもの」か「デフォルト」で選択するというのが現実的なような気がします。
【提案するオプション案】の中であれば1番と3番の選択式というのであれば、すぐにでも実装できると思いますが、ひとまずはこれでいかがでしょうか。


この投稿は4週間前ずつわいひらに変更されました

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

@yhira さん

1、一番深い子を基点とする。3、設定画面で従来との切り替えを可能とする。

1は、提示したテンプレート置き換えで対応できます。

3は、Cocoon設定画面に組み込む必要があります。(私の提示したコードはお試しとしてフックで対応したので)

 



   
わいひら reacted
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 4年前
投稿: 4367
 

@yhira さん

こちらで該当部分を反映してみました。
メールにてソースを送ったので確認願います。



   
わいひら reacted
返信引用
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 8年前
投稿: 18448
 

投稿者:: @natsume-sawajiri

1. 最も深い階層を持つタームを優先して表示
(タームの階層の深さを判定し、最も深い階層を持つタームを起点にする。同階層が複数ある場合の優先度問題は残るが実装は2. より簡単になるとおもいます)

お待たせして恐れ入ります。
この第1案に対する機能を実装させていただきました。
https://github.com/xserver-inc/cocoon/commit/872acf50a87b872d7ed8e0f70153acae036c5e7d#diff-7bb7901763f4871a01150be7b9c1e25c38694a75a5badb5118004c7359678490



   
返信引用
共有:

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

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

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

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

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

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

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

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