Categories: WordPress開発

Breadcrumb NavXT で独自の項目を追加する

独自のページが有る場合、 Breadcrumb NavXT 導入時に、パンくずリストにそのページを追加する方法を調べました。

Breadcrumb NavXT には、アクションフックが二つ用意されています。

add_action('bcn_before_fill', 'my_filter_breadcrumbs_before');
add_action('bcn_after_fill', 'my_filter_breadcrumbs_after');

bcn_before_fill は、パンくずリスト生成前、 bcn_after_fillは、パンくずリスト生成後のアクションフックです。
パンくずリストを追加することを考えますので、bcn_after_fillを使います。

以下の例は、とあるページ(投稿ページ、固定ページなど)にitemnameというクエリパラメータがついていたら、そのページ下層の独自ページとする。
という前提です。(例 http://test.com/?p=123&itemname=あいうえお)

add_action('bcn_after_fill', 'my_filter_breadcrumbs_after');
function my_filter_breadcrumbs_after($bcnObj) {
	if ( count($bcnObj->trail) > 0 ) {
		$itemname = htmlspecialchars($_GET["itemname"]);
		if ($itemname){
			//独自ページのパンくず生成
			$trail_add[0] = clone $bcnObj->trail[0];//クローンを用意 ※1
			$trail_add[0]->set_title($itemname);//タイトルを設定 ※2
			if($bcnObj->opt['bcurrent_item_linked']){// ※3
				$query = array('itemname' => $itemname);
				$seturl = add_query_arg( $query , get_permalink()) ;
				$trail_add[0]-> set_url($seturl);// ※4
			}else{
				//親ページをリンク付きに変更
				$bcnObj->trail[0]->set_url(get_permalink());//URLを設定 ※5
				$bcnObj->trail[0]->set_template($bcnObj->opt['Hpost_post_template']);//テンプレートを設定 ※6
			}
			$bcnObj->trail = array_merge ($trail_add, $bcnObj->trail);//ここでマージ ※7
		}
	}
	return $bcnObj;
}

フックで受け取った変数$bcnObjにパンくずの情報が入っています。
$bcnObj->opt にBreadcrumb NavXTの設定ページした情報が入っています。
$bcnObj->trail に表示するパンくずが配列で入っています。

$bcnObj->trail[0] が一番右側で、 ホーム > 親ページ > 投稿ページ のようなパンくずリストの場合、 $bcnObj->trail[2] > $bcnObj->trail[1] > $bcnObj->trail[0] という感じになっています。
そこで、一番右にパンくずを追加したいのなら、[0]のところにもう一つ挿入すればいいということになります。

ホーム > 親ページ > 投稿ページ > あいうえお

$bcnObj->trail[3] > $bcnObj->trail[2] > $bcnObj->trail[1] > $bcnObj->trail[0]

なので、$bcnObj->trail[0] からクローンを取り出して、(※1) タイトルを設定して、(※2 例ではクエリパラメータをそのまま突っ込んでます。) 内容を書き換えて、マージするようにしてみました。(※7)

設定で、「現在のページを示す項目にリンクを張る」がONの場合(※3)は、独自ページのところにもリンクを追加したいので、set_urlメソッドで独自ページのリンクを追加します。(※4)

その一方、「現在のページを示す項目にリンクを張る」がOFFの場合は、本来の現在のページにはリンクがついていないので追加します。(※5)

set_template関数でパンくずのテンプレートを設定しますが、$bcnObj->opt[‘Hpost_post_template’] はBreadcrumb NavXTの設定にある、投稿タイプの投稿テンプレートです。(※6) (その他のテンプレートは、プラグインのclass.bcn_breadcrumb_trail.php にありますが、設定ページのソースコード(HTML)を覗いても大体わかります。)

参考: http://notnil-creative.com/blog/archives/981 http://tenman.info/labo/snip/archives/3761

 

nakaike