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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

WordPress

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

PHP

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

4262閲覧

WordPressで階層的なカテゴリサイドバーを作成したい。

no23h

総合スコア49

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

WordPress

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

PHP

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2017/02/14 06:10

編集2017/02/14 06:12

###前提
お世話になります。
カテゴリ項目の出力について質問です。
質問掲示板や参考サイトを元に、現在以下ソースコードでサイドバーを表示しております。
出力条件としては、「本年度のみ投稿が存在するカテゴリ」でして、投稿数を出す関数を使ってフィルタリングをしております。

###該当のソースコード

// sidebar.php <?php function hierarchical_category_tree( $cat, $year, $taxonomy = 'category' ) { $args = array( 'parent' => $cat, ); $categories = get_categories($args); if( $categories ) : foreach( $categories as $cat ) : $count = my_get_count_posts( $year, $cat ); if ( $count > 0 ) { // 投稿数があるカテゴリを出力 echo '<ul><li><a href="URL">' . $cat->name . ' (' . $count . ')</a></li></ul>'; hierarchical_category_tree( $cat->term_id, $year ); } endforeach; endif; echo "\n"; } function my_get_count_posts( $year, $term ) { //投稿数を出す $the_query = new WP_Query( array( 'year' => $year, 'cat' => $term->term_id, 'posts_per_page' => -1 )); return $the_query->post_count; } ?> <?php hierarchical_category_tree( 0, date('Y') );?>

上記コードで以下のように出力されます。

<ul><li><a href="URL">親 (7)</a></li></ul> <ul><li><a href="URL">子A (2)</a></li></ul> <ul><li><a href="URL">孫A (2)</a></li></ul> <ul><li><a href="URL">子B (5)</a></li></ul> <ul><li><a href="URL">孫B (3)</a></li></ul> <ul><li><a href="URL">孫C (2)</a></li></ul>

###実現したいこと

理想は以下のように、親>子>孫とネストされた状態かつ、ulタグに階層に沿ったクラス名を出力したいです。

またできれば、wp_list_categories()のcurrent_categoryパラメータのように、
表示中ページに該当するカテゴリ名にクラス名「current-cat」、上位カテゴリに「current-cat-parrent」をつけたいです。

<ul class="sidebar parent"> <li><a href="URL" >親 (7)</a> <ul class='child'> <li><a href="URL" >子A (2)</a> <ul class='grandchild'> <li><a href="URL" >孫A (2)</a></li> </ul> </li> <li class="current-cat-parent"><a href="URL" >子B (5)</a> <ul class='grandchild'> <li class="current-cat"><a href="URL" >孫B (3)</a></li> <li><a href="URL" >孫C (2)</a></li> </ul> </li> </ul> </li> </ul>

###試したこと
各パラメータやタグ位置をいじってみたりと色々試したのですが解決せず、
おそらくget_categories()のパラメータやforeach()の部分を改変する必要があると思いますが、
そこまでの能力がなく、参考サイトを漁っていますが進展がありません。
どなたかお力添えをいただけないでしょうか。
宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

2017/2/15 コードができあがったので、回答を全面更新しました

以下の機能を実装しています。

  • 親>子>孫とネストされた状態
  • ulタグに階層に沿ったクラス名を出力
  • 表示中ページに該当するカテゴリ名にクラス名「current-cat」
  • 上位カテゴリに「current-cat-parrent」

PHP

1// sidebar.php 2<?php 3 4function hierarchical_category_tree( $cat, $year, $depth = 0, $taxonomy = 'category' ) { 5 6 $now_cat = get_query_var('cat'); 7 $now_cat_ancestors = (empty($now_cat)) ? ('') : (get_ancestors($now_cat, $taxonomy)); 8 9 // $ul_class 10 if( $depth == 0 ) { 11 $ul_class = ' class="parent"'; 12 } 13 else if( $depth == 1 ) { 14 $ul_class = ' class="child"'; 15 } 16 else if( $depth == 2 ) { 17 $ul_class = ' class="grandchild"'; 18 } 19 else { 20 $ul_class = ''; 21 } 22 23 $args = array( 24 'parent' => $cat, 25 ); 26 $categories = get_categories($args); 27 if( $categories ) : 28 echo '<ul' . $ul_class . '>'; 29 foreach( $categories as $cat ) : 30 $count = my_get_count_posts( $year, $cat ); 31 32 if ( $count > 0 ) { // 投稿数があるカテゴリを出力 33 // $li_class 34 if( $cat->term_id == $now_cat) { 35 $li_class = ' class="current-cat"'; 36 } 37 else if( !empty($now_cat_ancestors) ) { 38 if( $cat->term_id == $now_cat_ancestors[0] ) { 39 $li_class = ' class="current-cat-parent"'; 40 } 41 else { 42 $li_class = ''; 43 } 44 } 45 else { 46 $li_class = ''; 47 } 48 49 echo '<li' . $li_class . '>'; 50 echo '<a href="'. get_category_link( $cat->term_id ) . '">' . $cat->name . ' (' . $count . ')</a>'; 51 echo '</li>'; 52 hierarchical_category_tree( $cat->term_id, $year, $depth+1 ); 53 } 54 endforeach; 55 echo '</ul>'; 56 endif; 57} 58 59function my_get_count_posts( $year, $term ) { //投稿数を出す 60 $the_query = new WP_Query( array( 'year' => $year, 'cat' => $term->term_id, 'posts_per_page' => -1 )); 61 return $the_query->post_count; 62} 63 64?> 65 66<?php hierarchical_category_tree( 0, date('Y') );?>

投稿2017/02/14 13:08

編集2017/02/15 07:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

no23h

2017/02/14 19:38

miz様 ご返信ありがとうございます。 ご提示いただきましたコードで理想の形になりました。 if文でカウントした深度を付与してやればいいのですね。 ここ数日サイドバーで手こずっていましたので、本当に助かりました。 感謝申し上げます。 (もしcurrent-cat-parrentが実装可能になりましたら、恐れ入りますが宜しくお願いいたします。)
退会済みユーザー

退会済みユーザー

2017/02/15 07:44

コードが完成したため、回答を書き換えました。 To: kei344さん get_ancestors()が役立ちました。ありがとうございます!
no23h

2017/02/16 15:28

miz様 kei344様 ありがとうございます! 最終的に全てのli要素にcat-itemが欲しかったので、以下に修正し理想のかたちになりました! if ( $count > 0 ) { // 投稿数があるカテゴリを出力 // $li_class if( $cat->term_id == $now_cat) { $li_class = ' class="cat-item current"'; } else if( !empty($now_cat_ancestors) ) { if( $cat->term_id == $now_cat_ancestors[0] ) { $li_class = ' class="cat-item current-parent"'; } else { $li_class = ' class="cat-item"'; } } else { $li_class = ' class="cat-item"'; } ご回答、本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問