【Breadcrumb NavXT カスタマイズ】複数カテゴリーから指定表示する方法

パンくずリストを自動で表示してくれるWordPressプラグイン「Breadcrumb NavXT」。
とても便利で私もよく使うのですが、表示内容について細かいカスタマイズができないケースもあります。

例えば、複数カテゴリーを持つ投稿の場合、パンくずリストにどのカテゴリーを表示するか、設定することはできません。表示させたい形で表示される場合もありますが、違うカテゴリーを表示したい場合もあるでしょう。

今回は、少し前に担当させていただいた案件でこの問題が発生したとき、実際に行ったカスタマイズの方法についてご紹介いたします。

目次 [ひらく ▼]

Breadcrumb NavXTでやりたいこと

まず、下記のような形でカテゴリーが表示されるよう設定しているパンくずリストを例に挙げます。

TOPページ > カテゴリー > 記事タイトル

投稿に設定されているカテゴリーが複数ある場合、どれかひとつのカテゴリーがパンくずリストに表示されます。

例えば、カテゴリーA・カテゴリーBが設定されている投稿の場合、
下記のどちらかで表示されますが、どちらを表示するか指定することはできません

TOPページ > カテゴリーA > 記事タイトル
TOPページ > カテゴリーB > 記事タイトル

パンくずリストをカテゴリーAで表示したかったのですが、実際にはカテゴリーBで表示されてしまいました。
そこで今回は、独自のカスタマイズを行いました。

「Category Order and Taxonomy Terms Order」などのプラグインを使い、管理画面からカテゴリーを並べ替えることで、カスタマイズを行わなくても解決できる場合があります。

これからご紹介するカスタマイズを行う前に、プラグインをインストールして、カテゴリーの並べ替えを試すのも有効です。
今回の案件の場合、カテゴリーを並べ替えても解決できなかったため、カスタマイズを行いました。

Breadcrumb NavXTのカスタマイズ

それでは本題に移りましょう。実は、「Breadcrumb NavXT」が用意しているフックを使えば、パンくずリストの表示内容を編集することができます。
今回はbcn_after_fillというフックを使います。パンくずリストの内容が作られた後に実行されるフックなので、表示される内容を確認したうえで、好きな内容に変更できます。

Breadcrumb NavXTに限らず、一般的なプラグインではカスタマイズのためにフックが用意されていることが多いです。
プラグインのカスタマイズを行いたいときは、フックが用意されているか、またそのフックの使い方について、google検索などで調べてみるのがおすすめです。
プラグインの公式サイトや、解説サイトをチェックしてみましょう。

プラグインのソースコードを直接カスタマイズしてしまうと、プラグインを更新したときにカスタマイズが消えてしまう、意図しない不具合が起きてしまうなどの問題があります。
しかしフックを使えば、プラグイン内のファイルは変更せずに済むため、プラグインの更新を行っても消えてしまうことはありません。

今回の案件では、下記のコードをWordPressテーマ内のfunction.phpに追加しました。

function change_breadcrumbs($bcnObj) {
  // 投稿詳細ページかどうか
  if(is_single()) {
    // パンくずリストに「カテゴリーB」が含まれる場合、パンくずリストを作り直す
    $isHit = false;
    foreach ($bcnObj->trail as $bread) {
      if ($bread->get_title() == "カテゴリーB") {
        $isHit = true;
        break;
      }
    }

    if ($isHit) {
      // 最初の要素(投稿タイトル)と最後の要素(TOPページ)を取得する
      $postBread = $bcnObj->trail[0]; 
      $topBread = $bcnObj->trail[count($bcnObj->trail) - 1];

      // パンくずリストをいったんすべて削除
      array_splice($bcnObj->trail, 0);

      // 投稿のカテゴリーのデータを取得
      $categories = get_the_category();
      $cat = null;
      foreach( $categories as $category ){
        // カテゴリーB以外を取得
        if( $cat->cat_name != "カテゴリーB" ){
          $cat = $category;
          break;
        }
      }

      // パンくずリストに投稿タイトルを追加
      array_push($bcnObj->trail, $postBread);

      // カテゴリーをパンくずリストに追加
      if ($cat) {
        $breadcrumb = new bcn_breadcrumb(
          $cat->cat_name, 
          null, 
          array('archive'), 
          get_category_link($cat->cat_ID), 
          null, 
          true
        );
        $bcnObj->add($breadcrumb);
      }
      
      // パンくずリストにTOPページを追加
      array_push($bcnObj->trail, $topBread);
    }
  }
}
add_action('bcn_after_fill', 'change_breadcrumbs');


このコードで行っていることについて、ひとつずつ解説いたします。
コードを見ながらご覧いただけると幸いです。

if(is_single())

この案件では、パンくずリストは投稿詳細ページ以外の固定ページなどでも使用していました。

しかし、今回のカスタマイズは投稿詳細ページのみに行いたかったため、
WordPressが用意している関数「is_single()」を使い、投稿詳細ページのときにのみ、下記に記載している内容の処理を行うようにしています。

この部分については、カスタマイズしたい内容にあわせて変更してみてください。

WordPressには、is_page()、is_404()など、現在表示しているページが何なのかを判定するための関数が多数用意されています。
こういった関数について、WordPress公式サイトのドキュメントにまとめられています。
英文のため、ブラウザの翻訳機能などを使いながら読んでみるのがおすすめです。
https://developer.wordpress.org/themes/basics/conditional-tags/

「カテゴリーB」が含まれる場合、パンくずリストを作り直す

パンくずリストの内容は、$bcnObj->trailの中に配列として入っています。
その中に、「カテゴリーB」という名前のパンくずがある場合、パンくずリストを作り直すようにしました。

$bread->get_title()で、パンくずリストに表示される名前を取得できます。
これは、カテゴリー名で特定のカテゴリーかどうかを判定しています。

ちなみに、名前を変更したいときはset_title()を使用します。
$bread->title = “変更後タイトル”;という形はエラーとなり利用できませんのでお気をつけください。

公式ドキュメントには説明がありませんが、プラグインのソースコード内に、コメントで説明が少しだけ記載されています。
こちらも英語にはなりますが、詳細についてはGitHubのソースにてご確認ください。
https://github.com/mtekk/Breadcrumb-NavXT/blob/master/class.bcn_breadcrumb.php

最初と最後の要素を取得

さて、今回ご紹介しているのは、このような表示のパンくずリストを…

TOPページ > カテゴリーB > 記事タイトル

以下のような表示に変えたい、というときに行うカスタマイズです。

TOPページ > カテゴリーA > 記事タイトル

方法はいくつかありますが、今回は、パンくずリストをいったんすべて削除して作り直す形にしました。
具体的に言うと、array_splice()で配列内の要素をすべて削除しています。

あとから使用するため、パンくずリストを削除する前に「TOPページ」「記事タイトル」の部分はコピーしておきましょう。

内容が変えられればよいので、パンくずリストの中身をすべて削除する必要はありません。
「カテゴリーB」の部分を「カテゴリーA」に変更するだけでよいはずです。

今回は、説明を簡単にするため省略していますが、実際の案件では、カテゴリーBの下に「子カテゴリー」「孫カテゴリー」が紐づく場合がありました。
そのため、パンくずリストに並ぶ項目数がいくつになるか分からないので、いったんすべて削除する形で実装しました。

投稿のカテゴリーのデータを取得

投稿のカテゴリーはget_the_category()で取得できます。
戻り値は配列の形になっています(投稿はカテゴリーが複数設定されている場合があるため)。
foreachを使ってひとつずつカテゴリー名を確認し、パンくずリストに使いたいカテゴリー名を取得します。

カテゴリーをパンくずリストに追加

カテゴリー情報をもとに、パンくずリストへ追加します。

bcn_breadcrumbというクラスが、パンくずリストひとつ分の項目です。
new bcn_breadcrumb()で、パンくずリストひとつ分の項目を作成し、引数に必要な情報を設定していきます。

今回のカスタマイズで使用したのは、下記の引数です。

  • 1つ目の引数:パンくずリストに表示される階層名
  • 3つ目の引数:項目のタイプ(post、archiveなど)
  • 4つ目の引数:クリックしたときに遷移するリンク先URL
  • 6つ目の引数:trueにするとリンクありfalseだとリンクなしの項目になる

bcn_breadcrumbについても、公式ドキュメントに記載はありませんでした…
こちらも詳細については、GitHubのソースにてご確認ください。
https://github.com/mtekk/Breadcrumb-NavXT/blob/master/class.bcn_breadcrumb.php

作ったパンくずリストの項目は、$bcnObj->add()でパンくずリストに追加します。
これで、パンくずリストに表示されるようになります。

後に追加された項目ほど、パンくずリストの左側(先祖側)に追加されていきます。
最終的に表示したいパンくずリストの階層を考えながら、追加していきましょう。

まとめ

Breadcrumb NavXTによるパンくずリストは自動生成されるため、意図しない表示になることがあります。
しかしフックを使えば、表示内容を自由にカスタマイズすることが可能です。

今回のような形以外にも、カテゴリー一覧ページや、特定の1ページだけ表示を変えることも可能です。
パンくずリストに困ったときは、この記事を参考にカスタマイズしてみてください。

松下 将大
Front-end , Back-end engineer

1990年生まれ。複数のシステム開発会社にてPHP、VB.NET、C#を経験。2022年からフリーランスに。応用情報技術者試験合格。10年以上の業界経験を活かし、「PHPのエラーが直せなくなった…」「WordPressのカスタマイズをしたい…」「よくわからないけど動かない…」などのお悩み解決をお手伝いいたします。メンターご相談はこちらから