半分自作のパンくずリスト表示コードがカスタム投稿タイプに対応してなかった
前回まででひととおりカスタム投稿タイプ対応はできたかと思ったけど、よく見たらパンくずリストがちゃんと表示されない。カテゴリーのところが空欄になってしまう。パンくずリストの表示にプラグインを使っていない。ネットを検索して見つけたパンくずリストを表示するソースコードを自分のブログ向けに修正して使っていた。
このコードがカスタム投稿タイプのことを考慮していないコードだった。
パンくずリストを表示するコードはだいたい
if (is_date()) {
...
} elseif (is_category()) {
...
} elseif (is_page()) {
...
} elseif (is_single()) {
...
} elseif ...
という感じになる。
個別投稿での表示は以下のようにしてた。
なお以降のコードでは項目間の区切り文字や<li>とか<span>などは省略しています。
elseif (is_single()) {
$categories = get_the_category($post->ID);
$cat = $categories[0];
if ($cat->parent != 0) {
// 親子関係をさかのぼる
}
$output .= '<a href="' . get_category_link($cat->term_id)
. '">' . $cat->cat_name . '</a>';
...
みたいな感じだったのだけど get_the_category() がカスタム投稿タイプのときに値を返さない。それは当たり前ではある。
カスタム投稿タイプの個別投稿でのパンくずリスト対応
ということで カスタム投稿タイプかの判定があまり良くないとは思うけれど以下のようにした。以前も書いたけど目的のものを得るためにはカスタム投稿タイプやタクソノミー関連は関数が多いので何をどうしたらいいのか調べるのが大変。$categories = get_the_category($post->ID);
$cat = $categories[0];
if (empty($cat)) {
$cpt = get_post_type();
$cptobj = get_post_type_object($cpt);
$output .= '<a href="' . get_post_type_archive_link($cpt)
. '">' . $cptobj->label . '</a>';
$output .= get_the_term_list($post->ID, $cptobj->taxonomies[0]);
} else {
// 標準の投稿タイプのときの処理
}
このコードはカテゴリーの親子関係は考慮していない。
自分のブログではカテゴリーに親子関係を持たせないことにしてるし、過去ブログのインポートのための使っているカスタム投稿タイプなのでとりあえずこれでいいのだ。
カスタム投稿タイプのカテゴリーアーカイブページのパンくずリスト対応
さてこれだとカテゴリーへのリンクがあるけれどこれも実際はタクソノミーなのでタクソノミーを表示するテンプレートが必要となる。それを書いたらそのページでのパンくずリストがちゃんと表示されなかったのでさらにコードに追加が必要だった。タクソノミーを表示するページでのパンくずリストのためには以下のように if (is_single()) と同じレベルで if (is_tax()) で判断して表示する。
... elseif (is_category()) {
...
} elseif (is_tax()) {
$termobj = get_queried_object();
$cpt = get_post_type();
$cptobj = get_post_type_object($cpt);
$output .= '<a href="' . get_post_type_archive_link($cpt)
. '">' . $cptobj->label . '</a>'
$output .= get_taxonomy($termobj->taxonomy)->label
. ':' . $termobj->name
}
下の方の get_taxonomy($termobj->taxonomy)->label はいらない人が多いと思うけど一応。
これでやっと自分に必要な最低限のパンくずリストへの追加ができた。
taxonomy.php の作成
taxonomy.phpの内容は 標準の カテゴリー category.php や タグ tag.php とほぼ同じでタイトルを single_cat_title() を single_term_title() にすればいい。これで「旧ブログを専用のカスタム投稿タイプへインポートする」関連の作業は終了。
たぶんこれでとりあえずOKということにして運用中。旧ブログをインポートし標準の投稿と区別することが目的だったのでこのカスタム投稿タイプに新規投稿などはしないのでこれで十分なはず。
自分、おつかれさまでした。