こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。
あなたのWordPressサイトでは、カスタム投稿を使っていますか?
実は、WordPress管理画面のWidgetから使えるカテゴリ一覧は、通常の投稿しか対応できません。
よくあるカテゴリ一覧、赤枠内のことです。
CustomPostUIなどでカスタム投稿を追加している場合は、独自に作成しなければなりません。
ここでは記述するファイルは出力したいところのファイルです。使用しているテーマ内ファイルを修正します。アップグレードの影響が少ない、子テーマ内が理想です。
私はサイドバーに出したかったので、sidebar.phpに記述しました。
カテゴリ取得の考え方(階層無制限)
子カテゴリまで、と決め打ちにすれば楽なのですが、そこはプログラム組むんだから、いくらでも階層深くてOKにしたいところ。
そうなると、再帰処理が必要です。結構複雑になります。文字に起こすと中々に伝わりにくいのですが…。
- 親カテゴリを取得
- 親カテゴリがある場合、指定の親カテゴリの子カテゴリ以下を探しに行く
- 子カテゴリを取得
- その下の子カテゴリがあるか確認(再帰、3に戻る)
- 子カテゴリがない場合はそこで探索終了
- 子カテゴリがあったら格納
子カテゴリ以下を取得するソース
ソースで書くと以下のようになります。再帰処理を行うことで、親以下すべてのカテゴリを取得できます。孫だろうとひ孫だろうとOKです。
// カテゴリ一覧
// 親カテゴリを取得
$catAry = array();
// 親カテゴリを取得
$args = array(
'type' => 'post',
'parent' => 0,
'taxonomy' => 'category',
'pad_counts' => true
);
$catAry = get_categories($args);
// 親カテゴリがある場合、子カテゴリ以下を探しに行く
if(!empty($catAry)) {
foreach($catAry as $key=>$pCat) {
$childAry = getCats($pCat->cat_ID);
$catAry[$key]->child = $childAry;
}
}
/**
* 子カテゴリ以下を取得
* $id 指定の親カテゴリID これを元に子カテゴリを取得する
* $catAry 取得した子カテゴリ配列
* return 子カテゴリ以下のオブジェクト配列(WPで取得したものはオブジェクト配列で返ってくる)
*/
function getCats($id, $catAry=array()) {
// 子カテゴリを取得
$args = array(
'type' => 'post',
'parent' => $id,
'taxonomy' => 'category',
'pad_counts' => true
);
$cats = get_categories($args);
if(!empty($cats)) {
// 指定の親カテゴリ以下の子カテゴリを取得
foreach($cats as $cat) {
// 更に子カテゴリを探しに行く
$ary[$cat->cat_ID] = $cat;
$child = getCats($cat->cat_ID, $ary);
$catAry = $ary;
if(!empty($child)) {
$catAry[$cat->cat_ID]->child = $child;
}
}
} else {
return;
}
return $catAry;
}
出力側の処理の考え方(階層無制限)
こちらも子以下まで自動で出力するので、再帰処理が必要です。
でも子カテゴリ以下を取得するソースができていれば、楽ですよ。
- カテゴリがある場合のみ、表示する
- 所属親のカテゴリポストタイプを取得(自分で設定する)…ここでは技術情報のポストタイプは「program_info」としています。
- URLを生成…通常のカテゴリアーカイブにポストタイプのパラメータを追加します。
- 出力したいようにソースを設定する(ここではTwentyseventeenのカテゴリウィジェットをベースにしています)
- 子カテゴリ以下が存在する場合は表示処理(再帰)
- HTMLソースの後処理(タグを閉じるとか)
まとめ
- カスタム投稿を扱う上で、カテゴリー一覧を表示したい場合は標準機能以外にカスタマイズが必要
- 再帰処理はプログラムを書く上で使えたらとても便利なもの
- 慣れないうちはデバッグをかけながら練習してみる
再帰処理は複雑なものですが、使えるととても便利なものです。
WordPressでカスタム投稿を使う場合は、「通常の機能に追加して動くようにする」ことも多くあります。
そのような現場に出くわしたときは、是非、この考え方を参考にしてください。