言語(PHP他)PHPWordPress
更新日 : 2023年12月11日
投稿日 : 2017年11月26日

WordPressのカテゴリー一覧にカスタム投稿のものも追加する方法

WordPressのカテゴリー一覧にカスタム投稿のものも追加する方法の画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。

あなたのWordPressサイトでは、カスタム投稿を使っていますか?

実は、WordPress管理画面のWidgetから使えるカテゴリ一覧は、通常の投稿しか対応できません。

サイドバーのカテゴリー表示イメージ

よくあるカテゴリ一覧、赤枠内のことです。

CustomPostUIなどでカスタム投稿を追加している場合は、独自に作成しなければなりません。

ここでは記述するファイルは出力したいところのファイルです。使用しているテーマ内ファイルを修正します。アップグレードの影響が少ない、子テーマ内が理想です。
私はサイドバーに出したかったので、sidebar.phpに記述しました。

カテゴリ取得の考え方(階層無制限)

子カテゴリまで、と決め打ちにすれば楽なのですが、そこはプログラム組むんだから、いくらでも階層深くてOKにしたいところ。

そうなると、再帰処理が必要です。結構複雑になります。文字に起こすと中々に伝わりにくいのですが…。

  1. 親カテゴリを取得
  2. 親カテゴリがある場合、指定の親カテゴリの子カテゴリ以下を探しに行く
  3. 子カテゴリを取得
  4. その下の子カテゴリがあるか確認(再帰、3に戻る)
  5. 子カテゴリがない場合はそこで探索終了
  6. 子カテゴリがあったら格納

子カテゴリ以下を取得するソース

ソースで書くと以下のようになります。再帰処理を行うことで、親以下すべてのカテゴリを取得できます。孫だろうとひ孫だろうと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;
	}

出力側の処理の考え方(階層無制限)

こちらも子以下まで自動で出力するので、再帰処理が必要です。

でも子カテゴリ以下を取得するソースができていれば、楽ですよ。

  1. カテゴリがある場合のみ、表示する
  2. 所属親のカテゴリポストタイプを取得(自分で設定する)…ここでは技術情報のポストタイプは「program_info」としています。
  3. URLを生成…通常のカテゴリアーカイブにポストタイプのパラメータを追加します。
  4. 出力したいようにソースを設定する(ここではTwentyseventeenのカテゴリウィジェットをベースにしています)
  5. 子カテゴリ以下が存在する場合は表示処理(再帰)
  6. HTMLソースの後処理(タグを閉じるとか)

まとめ

  • カスタム投稿を扱う上で、カテゴリー一覧を表示したい場合は標準機能以外にカスタマイズが必要
  • 再帰処理はプログラムを書く上で使えたらとても便利なもの
  • 慣れないうちはデバッグをかけながら練習してみる

再帰処理は複雑なものですが、使えるととても便利なものです。

WordPressでカスタム投稿を使う場合は、「通常の機能に追加して動くようにする」ことも多くあります。

そのような現場に出くわしたときは、是非、この考え方を参考にしてください。

PR

※本サイトはアフィリエイトプログラムを利用して商品を紹介しています。