[WP] 子カテゴリー名の取得

タグ :

WordPress カスタマイズについてまとめるシリーズです。
今回は、子カテゴリー名の取得についてまとめます。

前記事「カテゴリーをツリービューに」で子カテゴリーもツリー内に含んで表示するようにしました。
そこで一つ問題となったのが、子カテゴリーをクリックした後の遷移先のタイトル名が「子カテゴリー名にならない」ということです。
使用するテーマによって変わってくるかもしれませんが、子カテゴリーを選択したときに取得するカテゴリー名は、なぜか親カテゴリー名になってしまいます。

そんなときの対処法をまとめます。

現象と原因

本ブログでは、カテゴリー名をクリックしたときのページは、そのカテゴリーの記事の一覧を表示するページに遷移させるようにしています。
その一覧のタイトルには、

[ “カテゴリー名” ]に関する記事

という文言を表示させるようにしています。
そのカテゴリー名を表示させる PHP のコードを以下のように記述していました。

[ archive.php ]
<?php if ( is_category() ) : ?>
<h3><?php
	printf(
		__( '[ %s ]に関する記事'),
		get_query_var('category_name')
	);
?></h3>
<?php endif; ?>
5行目の get_query_var() で WordPress 内のカテゴリーや記事に関する情報を取得することができます。
引数に「category_name」を入れると、カテゴリー名が取得できます。

結果を見てみると、残念ながらカテゴリー名ではなくカテゴリーのスラッグが取得されています。そもそも間違っていたみたいですね。。。
さらに子カテゴリーを選択した場合には、親カテゴリーのスラッグ名が取得されてきてしまいます。なんかむちゃくちゃだったみたいですね。。。

それでは、正しくカテゴリー名を取得するようにし、さらにちゃんと子カテゴリー名が取得できるように修正してみましょう。

カテゴリー名の取得

まずは、カテゴリー名を取得をちゃんとできるようにします。

[ archive.php ]
<?php if ( is_category() ) : ?>
<?php
	$cat = get_the_category();
	$cat = $cat[0];
	$strcat = $cat->name;
?>
<h3><?php
	printf(
		__( '[ %s ]に関する記事'),
		$strcat
	);
?></h3>
<?php endif; ?>
3,4行目で代入された $cat に現在のページのカテゴリー情報が入ります。
その情報とは、ID、名前、スラッグ、記事の投稿数などが含まれています。
5行目で $strcat にカテゴリー名が代入されます。

結果を見てみると、見事にカテゴリー名が取得できています。
ですが、これではまだ子カテゴリー名の取得はできていません。

子カテゴリー名の取得

子カテゴリーの取得方法は色々とあると思いますが、とりあえず無理矢理取得して表示する方法でやってみました。

[ archive.php ]
<?php elseif ( is_category() ) : ?>
<?php
	$cat = get_the_category();
	$cat = $cat[0];
	$strcat = $cat->name;
	$catChildren = get_category_children($cat->cat_ID);
	if ($catChildren) {
		$catIDs = explode('/',$catChildren);
		foreach($catIDs as $child) {
			$cat = get_category($child);
			if ($cat->slug == get_query_var('category_name')) {
				$strcat = $strcat.' - '.$cat->name;
				break;
			}
		}
	}
?>
<h3><?php
	printf(
		__( '[ %s ]に関する記事'),
		$strcat
	);
?></h3>
6行目の get_category_children() で子カテゴリーのIDを取得してきます。
引数には親カテゴリーのIDを指定しますが、指定した親カテゴリーの全ての子カテゴリーを「/」区切りの文字列として取得してきてしまいます。
8行目の explode() にて取得した文字列を「/」区切りで配列に格納します。
9行目〜15行目で配列化した子カテゴリーから現在のページのカテゴリー名を取得しています。

結果を見てると、ちゃんと子カテゴリー名を取得できています。
分かり易いように「親カテゴリー名 – 子カテゴリー名」と表示するようにしました。

まとめ

子カテゴリー名を直接取得するという関数は無いみたいです。
こういった直接的に取得できる関数が無い場合は、無理矢理にでも取得してくるしか無いのでしょうかね。
今回の取得方法以外にもっと簡単に取得する方法はあると思いますが、とりあえずの対処法ということで。。。

Share

  • このエントリーをはてなブックマークに追加

Comment

コメントを残す

*がついている欄は必須項目です。

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed