こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
私はPHPエンジニアとして8年~の経験があります。
カスタム投稿のカテゴリ一覧の実装(階層無制限)の件に引き続き、カスタム投稿記事とアーカイブのカテゴリーの表示と、そのリンク先を正しく設定しました。
記事の下に、その記事で設定されているカテゴリ表示のところです。
簡単にWordPressを手軽に構築するならカラフルボックス※広告
カラフルボックスはオールインワンの超快速レンタルサーバー。
まずはWordPressで公開してみたい!という方におすすめです。
赤枠内が該当します。
wp_list_categoriesではできない
wp_list_categoriesだと、カスタム投稿の場合リンクが正しく表示されなくなります。
見た目のカテゴリは正しいけど、リンクするとリンク切れ…404になってしまいます。
実装方法
こんな感じになります。
$category = get_the_category(取得する記事のID);
if($category) {
$catStrAry = array();
foreach($category as $cat) {
$parent = $cat->category_parent;
$slugAry = array();
$slug = '/';
// 親がいた場合は親の情報を取得しに行く
while($parent != 0) {
$parentCat = get_category($parent);
$slugAry[] = $parentCat->slug;
// 親カテゴリ情報を更新
$parent = $parentCat->category_parent;
}
if(!empty($slugAry)) {
$slug .= implode('/', $slugAry) . '/';
}
$url = ホームページの基本URL. '/category' . $slug . $cat->slug . '/?post_type=' . $postType;
$catStrAry[] = $url .':' . $cat->cat_name;
}
$string = implode(" / ", $catStrAry);
}
- 表示する記事のカテゴリを取得
- カテゴリが存在する場合、親カテゴリを確認
- 親カテゴリがある場合、親の情報を取得してスラッグを配列で保存
- 取得した親カテゴリの更に親のカテゴリ情報を更新する
- 親カテゴリがある場合(0でない場合は取得したカテゴリの更に親のカテゴリがある)、3へ戻る
- 親カテゴリのスラッグ配列がある場合、「/」区切りで繋げる
- 最終的なカテゴリURLにする(最後尾にpost-typeパラメータを追加)
実装に回り道した理由
実装方法がちょっと回りくどい感じがしたのに気づいた方はいるでしょうか。
なぜこんなことをしているのかというと、記事カテゴリに子カテゴリを含んでいる場合、
「/category/子スラッグ/?post_type=ポストタイプ名」
にすると、子スラッグ部分がカテゴリの親と解釈されてリンク切れになるためです。
正しく解釈させるには
「/category/親スラッグ/子スラッグ/?post_type=ポストタイプ名」
とする必要があります。
このURLを作るために、親カテゴリを取得する必要があります。
get_the_categoryはそのカテゴリの情報はありますが、自身の親のカテゴリ情報はIDを持っているだけです。そのため、そのIDからスラッグを取得してくる必要が出てきます。
まとめ
- カスタム投稿を使っている場合、カテゴリーのリンク先などに配慮する必要がある。
- 特にデフォルト機能ではそのまま対応できないので要注意
カスタム投稿を使うときは、自動表示で出てくるであろう箇所のリンクが切れていないか確認することが肝要です。サイトの質、制作者の質を問われているような気がします。
簡単にWordPressを手軽に構築するならカラフルボックス※広告
カラフルボックスはオールインワンの超快速レンタルサーバー。
まずはWordPressで公開してみたい!という方におすすめです。