タイトルの件について、子カテゴリの一覧を親カテゴリごとに個別に表示させることはできるのですが、子カテゴリを親カテゴリ別に分けた上で、任意の並び順(親カテゴリ)にしてまとめて表示させたいという時にどうしたら良いのかで躓いています。
###カテゴリの構成
親カテゴリ1 子カテゴリ 子カテゴリ 親カテゴリ2 子カテゴリ 子カテゴリ
###表示条件
検索結果でのみ表示
is_search()
で検索結果でのみ表示させる。
任意の並び順
親カテゴリのスラッグ(またはID)を表示したい順に並べた配列を引数として渡し、それを元に並び順を制御できないかと考えています。
選択中のカテゴリはリンク構造を変える
選択中のカテゴリと未選択のカテゴリでリンクの構造を変える。
実行時に表示はしない
実行した時は取得のみで表示はしない。
表示はecho
で任意に行う。
表示結果
イメージとしてはこのようなHTMLを出力したいです。
HTML
1<div class="parent-category1-slug"> 2 <ul class="parent-category1-slug__child-category"> 3 <li><a class="selected" href="selected-link">子カテゴリ</a></li> 4 <li><a href="link">子カテゴリ</a></li> 5 <li><a href="link">子カテゴリ</a></li> 6 </ul> 7</div> 8 9<div class="parent-category2-slug"> 10 <ul class="parent-category2-slug__child-category"> 11 <li><a href="link">子カテゴリ</a></li> 12 <li><a href="link">子カテゴリ</a></li> 13 <li><a href="link">子カテゴリ</a></li> 14 </ul> 15</div>
現状のコード
現状ではこの関数を親カテゴリごとに実行して、取得したリストをecho
で表示しているという状態です。
これをループで回しても良いのですが、できれば一つの関数にまとめたいと考えています。
PHP
1// カテゴリースラッグを渡して、その子カテゴリのリストを取得 2function get_category_list($category_slug) { 3 if (is_search() === false) { 4 return; 5 } 6 7 global $wp_query; 8 $query = $wp_query -> query; 9 10 // カテゴリスラッグからIDを取得 11 // スラッグは分かりやすくて良いが、最初からIDを渡した方が無駄がない(保留) 12 $cat = get_category_by_slug($category_slug); 13 $cat = $cat -> term_id; 14 15 // 指定した親カテゴリにある子カテゴリの情報を取得 16 $category = get_terms('category', array('parent' => $cat)); 17 18 // クエリにあるカテゴリを配列にする 19 if (empty($query['category_name']) === false) { 20 $query_cat = explode('+', $query['category_name']); 21 $query_cat = array_flip($query_cat); 22 } 23 24 // 表示用の配列 25 $cat_items = []; 26 27 // クエリにカテゴリがある時 28 if (isset($query_cat)) { 29 30 // クエリと一致するカテゴリ用のフォーマット 31 $format = '<li><a href="%1$s" class="selected">%2$s</a></li>'; 32 33 // クエリと一致するカテゴリを配列の要素として変数に格納 34 foreach ($category as $cat) { 35 if (isset($query_cat[$cat -> slug])) { 36 $cat_items[] = sprintf( 37 $format, 38 esc_url(get_bloginfo('url')) . '/?s', 39 esc_html($cat -> name) 40 ); 41 } 42 } 43 } 44 45 // クエリと一致しないカテゴリ用のフォーマット 46 $format = '<li><a href="%1$s">%2$s</a></li>'; 47 48 // クエリと一致しなかったカテゴリを配列の要素として変数に格納 49 foreach ($category as $cat) { 50 if (!isset($query_cat[$cat -> slug])) { 51 $cat_items[] = sprintf( 52 $format, 53 esc_url(get_bloginfo('url')) . '/?s&category_name=' . urlencode($cat -> slug), 54 esc_html($cat -> name) 55 ); 56 } 57 } 58 59 unset($cat); 60 61 $cat_items = implode(PHP_EOL, $cat_items); 62 63 return $cat_items; 64}
回答1件
あなたの回答
tips
プレビュー