『Breadcrumb NavXT』使用時におけるカスタム投稿タイプの表示不具合を改善

WordPressで構築したサイトに簡単にパンくずリスト(トピックパス)を実装できるプラグイン『Breadcrumb NavXT』。バージョンも3.9.0まで上がり(2011.6.20現在)、今や〈定番〉といってもいいポジションにいるのではないかと思います。

そんな『Breadcrumb NavXT』、今まで作ったいろんなサイトに組み込んでいるものの、どうもカスタム投稿タイプとの相性がよろしくない様子(プラグインのそのものはカスタム投稿タイプに対応している、ということになっているのですけれども)。

『Custom Post Type UI』プラグインを使った私の設定に原因があるのかもしれませんが、あるサイトでこんなパンくずリストが出力されました。

何が起きた?

ホーム > [カスタム投稿タイプのラベル] > [カテゴリー名] > 記事タイトル

HTMLを見てみるとこんな感じです。

<ul>
<li><a title="ホーム" href="http://www.example.com">ホーム</li><li><a title="[カスタム投稿タイプのラベル]" href="">[カスタム投稿タイプのラベル]</a></li><li><a title="[カテゴリー名]" href="http://www.example.com/path/to/category">[カテゴリー名]</a></li><li>記事タイトル</li>
</ul>

だらだらと書いてしまいましたが、結局

<li><a title="[カスタム投稿タイプのラベル]" href="">[カスタム投稿タイプのラベル]</a></li>

が余計に出力されてしまっているのです。

bcn_display() に引数を与えて解決

公式サイトにもあるようにこのプラグインは、テンプレートの任意の箇所に

<?php
if ( function_exists( 'bcn_display' ) ) {
	bcn_display();
}
?>

と記述することによりパンくずリストを表示するようになっています。ところが、このままでは上記の〈余計なリンク〉が出力されてしまいます。

実は bcn_display() という関数(WordPress的にいうとテンプレートタグ)には、

bcn_display( true );

と書くことにより、PHPで処理できる形として値を返すオプションがあります。つまり、たとえば

$str = bcn_display( true );

と書けば変数 $str にパンくずリストの文字列をいったん格納し preg_replace() などで不必要な箇所をカットして表示させることができるのです。

このオプションを活用して、上記の〈余計なリンク〉問題は

if ( function_exists( 'bcn_display' ) ) {
	$str = preg_replace( "/<li><a title=\"[カスタム投稿タイプのラベル].+?li>/", "", bcn_display( true ) );
 
	echo '<ul>';
	echo $str;
	echo '</ul>';
}

と回避。我ながら変則的なやりかたと思いながらも表示の不具合を解消できたのでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です