質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2916閲覧

子カテゴリの一覧を任意の条件で表示させたい

flat

総合スコア617

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/04/08 11:46

編集2016/04/08 12:00

タイトルの件について、子カテゴリの一覧を親カテゴリごとに個別に表示させることはできるのですが、子カテゴリを親カテゴリ別に分けた上で、任意の並び順(親カテゴリ)にしてまとめて表示させたいという時にどうしたら良いのかで躓いています。

###カテゴリの構成

親カテゴリ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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/04/08 18:33

カテゴリのリンクは検索の絞込みが目的でしょうか。カテゴリアーカイブ代わりということでしょうか。クエリと一致したカテゴリリンクはキーを入力しない検索ページへのリンクになっているし、それ以外のリンクもカテゴリのみ絞り込んでいる状態です。
flat

2016/04/08 21:12

ご質問ありがとうございます。目的はその両方です。
guest

回答1

0

自己解決

これをループで回しても良いのですが、できれば一つの関数にまとめたいと考えています。

こんな事を自分で言っている時点で気付くべきでしたが、関数をループさせるのではなく処理自体をループさせれば良い事に気付き自己解決しました。
具体的には新たに親カテゴリのIDを格納した配列を回すforeachのループを作成し、その中に質問にあるコードのループ処理の部分を加える形にすることで解決しました。

投稿2016/04/08 21:14

flat

総合スコア617

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問