状況
ちょっと特殊な事をしたので状況を簡潔に書くと、
- 「サポート」というページの配下にarchiveがtrueのカスタム投稿タイプ「よくあるご質問」があるように見せかけたい。
- 「サポート」は固定ページ。スラッグは「/support/」。
- よくあるご質問のスラッグは「/faq/」。
- Breadcrumb NavXTの管理画面で「よくあるご質問」を選択し、「よくあるご質問のルートページ」で「サポート」を選択。
で、どうなったかと。
- よくあるご質問のアーカイブ
- ホーム > よくあるご質問
- よくあるご質問のタクソノミーアーカイブ
- ホーム > サポート > よくあるご質問 > タクソノミーアーカイブ
- よくあるご質問の投稿
- ホーム > サポート > よくあるご質問 > タクソノミーアーカイブ > なんか質問
カスタム投稿タイプのアーカイブだけ設定したルートページが表示されない。
対処
で、プラグインのソースを確認。Breadcrumb NavXTディレクトリ内の「breadcrumb_navxt_class.php」を見てみると、bcn_breadcrumbクラスのメソッドdo_homeで件の処理を実行している様子。で、この中で$post_idという変数に記事IDが渡されるとルートページが表示されるようになるっぽい。
シングルページの場合は以下のようにきちんと変数が設定されてるけど、アーカイブの場合は処理がされていない。
if(is_singular() && !$this->is_builtin($type->post_type)) { //This will assign a ID for root page of a custom post if(is_numeric($this->opt['post_' . $type->post_type . '_root'])) { $posts_id = $this->opt['post_' . $type->post_type . '_root']; } }
なので、770行目あたりを下記のように修正。
if(is_post_type_archive()) { /* 追加 */ if(is_numeric($this->opt['post_' . $type->name . '_root'])) { $posts_id = $this->opt['post_' . $type->name . '_root']; } /* end */ //Place the breadcrumb in the trail, uses the constructor to set the title, prefix, and suffix, get a pointer to it in return $breadcrumb = $this->add(new bcn_breadcrumb(post_type_archive_title('', false), $this->opt['post_page_prefix'], $this->opt['post_page_suffix'])); if(is_paged() && $this->opt['paged_display']) { //Deal with the anchor $breadcrumb->set_anchor($this->opt['blog_anchor'], get_post_type_archive_link(get_post_type())); } }
これで変数はセットされたけど、さらに下のほう(恐らくタグ生成部分?)でアーカイブがまたもやはぶられているのでそこも修正。815行目あたり。ifでアーカイブが除かれているのでそこを対処(後でわからなくなりそうだったので僕は条件式を1に変更しました)。
// 下記をコメントアウトして必ず実行されるように修正 // if(!is_post_type_archive()) // 下記を追加 if( 1 )
これで、
- よくあるご質問のアーカイブ
- ホーム > サポート > よくあるご質問
というように期待した出力がされるようになりました。
ただ、プラグインのアップデートがあった場合は恐らくまた元通りだと思うので、自動アップデートには注意。また、修正版も入念にチェックしたわけではく、何らかの不具合があるかもしれませんので、修正は自己責任で。明らかにわざと外されているところをみると何らかのバグがあってそうしていたのかもしれませんねぇ。2011年12月あたりにバージョンアップを予定しているっぽいので、それで修正されれば良いのですが…。