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

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

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

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

PHP

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

Q&A

解決済

2回答

4994閲覧

Wordpress カテゴリ 親子 合計記事数 表示したい

khoroshoshow

総合スコア11

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/06/13 07:44

編集2019/06/14 08:16

お世話になります。

親カテゴリ を指定して、子カテゴリ の合計記事数を表示させようとしています。

■北海道・東北(1)
・子:北海道(2)
・子:青森県(1)
・子:岩手県(0)
〜〜以下省略〜〜

北海道・東北が(3)にならず困っています。

イメージ説明

■現在の記事数
イメージ説明

北海道・東北カテゴリに該当する記事は3つあるので、合計は(3)と表示されるはずなのですが、
現状は(1)と表示されます。

これはテスト02の記事は、親カテゴリ 北海道・東北にチェックを入れているためです。

親カテゴリにチェックを入れなくても、子カテゴリの合計のみを表示させたいです。

使用しているコードは下記になります。

<td width="18%" align="center" valign="middle" bgcolor="#ccffff"> // リンク付きカテゴリ名を表示 <?php $args = array( 'orderby' => 'name', 'include' => '2' ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .' </a>'; } ?><br/> <?php $args = array( 'orderby' => 'name', 'include' => '2', 'pad_counts'        => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo . $category->count .; } ?> </td>

include =>'2' が 北海道・東北のカテゴリ ID。

pad_counts =>1 (true) が 子カテゴリの合計記事の取得。

これで表示できると思ったのですが。。

Wordpres Codex 関数リファレンス get terms

このコードで表示させると、記事編集画面で親カテゴリ のチェックも入れないと記事合計の数字が表示できません。

記事編集画面で子カテゴリのみチェックを入れて、合計を表示したいと思っています。

色々試してみましたが、解決できずご質問させていただきました。

ご回答よろしくお願いいたします。


■回答1_miyabi_takatsuk様のコードを反映してみました

イメージ説明

・修正したコードを反映した状態です
イメージ説明

・phpファイル内のキャプチャです。
イメージ説明


■回答2_YukiYamashina様のコードを反映してみました
イメージ説明

■コード全体
front-page.php

古いtableレイアウトで組んであるページを
Wordpresへ載せ替えを行っています。

table2段目の関東以下にはphpをまだ反映していません。

◯Webページのキャプチャ画面
イメージ説明


<table class="line tcenter" width="734px" border="0" cellpadding="0" cellspacing="1" bgcolor="#666666"> <tbody><tr> <td width="18%" align="center" valign="middle" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '2' ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .' </a>'; } ?><br/> <?php $parent_id = 2; $args = array( 'orderby' => 'name', 'pad_counts' => 1, ); // 全カテゴリーを取得する. $categories = get_categories( $args ); // 親カテゴリーだけを取得する. $parent_category = wp_list_filter( $categories, array( 'term_id' => $parent_id ) )[0]; // 親カテゴリーの投稿数. echo $parent_category->count; // 子カテゴリーだけを取得する. $child_categories = wp_list_filter( $categories, array( 'parent' => $parent_id ) ); foreach( $child_categories as $child_category ) { // 子カテゴリーの投稿数. echo $child_category->count; } ?> </td> <td width="10%" align="center" valign="top" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '13', 'hide_empty' => 0, 'pad_counts' => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .'</a><br/>('.$category->count .')'; } ?> </td> <td width="10%" align="center" valign="top" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '14', 'hide_empty' => 0, 'pad_counts' => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .'</a><br/>('.$category->count .')'; } ?> </td> <td width="10%" align="center" valign="top" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '15', 'hide_empty' => 0, 'pad_counts' => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .'</a><br/>('.$category->count .')'; } ?> </td> <td width="10%" align="center" valign="top" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '16', 'hide_empty' => 0, 'pad_counts' => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .'</a><br/>('.$category->count .')'; } ?> </td> <td width="10%" align="center" valign="top" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '17', 'hide_empty' => 0, 'pad_counts' => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .'</a><br/>('.$category->count .')'; } ?> </td> <td width="11%" align="center" valign="top" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '18', 'hide_empty' => 0, 'pad_counts' => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .'</a><br/>('.$category->count .')'; } ?> </td> <td width="11%" align="center" valign="top" bgcolor="#ccffff"> <?php $args = array( 'orderby' => 'name', 'include' => '19', 'hide_empty' => 0, 'pad_counts' => 1 ); $categories = get_categories( $args ); foreach ( $categories as $category ) { echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .'</a><br/>('.$category->count .')'; } ?> </td> <td width="10%" align="center" valign="top" bgcolor="#FFFFFF">  </td></tr> <tr> <td align="center" valign="middle" bgcolor="#FFFF99"> </td> <td align="center" valign="top" bgcolor="#FFFF99"><a href="http://www.takamikk.jp/sys/index.asp?ID=216">茨城県</a><br>(116)</td> <td align="center" valign="top" bgcolor="#FFFF99"><a href="http://www.takamikk.jp/sys/index.asp?ID=219">栃木県</a><br>(74)</td> <td align="center" valign="top" bgcolor="#FFFF99"><a href="http://www.takamikk.jp/sys/index.asp?ID=258">群馬県</a><br>(98)</td> <td align="center" valign="top" bgcolor="#FFFF99"><a href="http://www.takamikk.jp/sys/index.asp?ID=164">埼玉県</a><br>(65)</td> <td align="center" valign="top" bgcolor="#FFFF99"><a href="http://www.takamikk.jp/sys/index.asp?ID=270">千葉県</a><br>(83)</td> <td align="center" valign="top" bgcolor="#FFFF99"><a href="http://www.takamikk.jp/sys/index.asp?ID=251">東京都</a><br>(60)</td> <td align="center" valign="top" bgcolor="#FFFF99"><a href="http://www.takamikk.jp/sys/index.asp?ID=246">神奈川県</a><br>(34)</td> <td align="center" valign="top" bgcolor="#FFFFFF"> </td> </tr> ~~~~~~~~~~~~~ 文字数上掲載できなかったので省略。 地域別で繰り返しになっています。 ~~~~~~~~~~~~~ </tbody></table> </article> </section> </div> <!-- / content -->

■回答1_miyabi_takatsuk様のコードで実装できました。

イメージ説明

・使用コード

イメージ説明

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

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

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

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

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

miyabi_takatsuk

2019/06/13 12:14

コードはコードブロックにて記載しましょう。 <code>ボタンで出てくる文字列の中に入れればできます。 現在はどのように表示されてるのか、画面キャプチャか、テキストでいいので、記載してください。
khoroshoshow

2019/06/13 12:54

ご指摘ありがとうございます。コードブロック、キャプチャ画像、追加で記載いたしました。お時間ありましたらご確認いただけると幸いです。
guest

回答2

0

include => '2' が 北海道・東北のカテゴリ ID。
pad_counts =>1 (true) が 子カテゴリの合計記事の取得。
これで表示できると思ったのですが。。

get_terms 関数の中で呼ばれるプライベート関数 _pad_term_counts の前提

Recalculates term counts by including items from child terms. Assumes all relevant children are already in the $terms argument.

があるため、pad_counts => 1 で子孫カテゴリーの記事数まで含めて count が計算されるためには、get_categories で得られるカテゴリー一覧の中にその子孫カテゴリーが含まれている必要あります。include => 2 とすると親カテゴリーだけが取得されるため、pad_counts => 1 としても子孫カテゴリーの分がカウントされず、親カテゴリーに属する投稿の数だけが count に入ります。

子孫カテゴリーの記事数まで含めたい場合は、一旦すべてのカテゴリーを取得して、wp_list_filter でフィルターしてください。

<?php $parent_id = 2; $args = array( 'orderby' => 'name', 'pad_counts' => 1, ); // 全カテゴリーを取得する. $categories = get_categories( $args ); // 親カテゴリーだけを取得する. $parent_category = wp_list_filter( $categories, array( 'term_id' => $parent_id ) )[0]; // 親カテゴリーの投稿数. echo $parent_category->count; /** * 以下のように wp_list_filter で 'parent' => $parent_id とすることで * 子カテゴリーを取得することができるため、それでループを回すこともできます. * * $child_categories = wp_list_filter( $categories, array( 'parent' => $parent_id ) ); * * foreach( $child_categories as $child_category ) { * // 子カテゴリーの投稿数. * echo $child_category->count; * } */

投稿2019/06/14 03:25

編集2019/06/14 05:12
YukiYamashina

総合スコア1011

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

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

khoroshoshow

2019/06/14 04:41

お忙しい中、ご回答ありがとうございます。 コード早速反映してみました。 キャプチャ画像追記いたしました。 子ページの記事数を取得していますが、 合計ではなく、記事数を並べる形で表示されています。 211と並んでいます。 ご確認いただけると幸いです。
khoroshoshow

2019/06/14 08:37

YukiYamashinaさん、お忙しい中ご回答ありがとうございました。 miyabi_takatsukさんに修正していただいたコードで実装できました。 ご報告までに。
guest

0

ベストアンサー

質問の修正を受け、回答を修正いたします。
ご承知いただきたいのが、かなり野暮で、他では応用の効かない書き方となることです。
(カテゴリが増えたりすると、構文の修正が必要になる)
ですが、今回の場合に限り、正確な動作にはなるかと思います。
また、不都合ございましたら、コメントください。

※追記:かなり静的な作りではありますが、できる限り動的になるよう、使うカテゴリIDを配列に入れ、
回す感じに変更しました。
配列の中の数値を変えれば、対応するカテゴリで記事数をカウントできるようになっています。

php

1<?php 2// ここで、親カテゴリのカウントアップする変数を用意 3// 他の親に関しては、また別途別名の親カウント変数を用意する 4$parentCountAll = 0; 5 6// 今回に必要な子カテゴリの数だけ、カテゴリ取得して、記事カウント数を足していく(13〜19のカテゴリIDのもの) 7// 入れるカテゴリの番号の配列を用意する 8$catIDs = array( 9 13, 10 14, 11 15, 12 16, 13 17, 14 18, 15 19 16); 17 18foreach($catIDs as $catId) { 19 $args = array( 20 'orderby' => 'name', 21 'include' => $catId, 22 'hide_empty' => 0, 23 'pad_counts' => 1 24 ); 25 $categories = get_categories( $args ); 26 foreach ( $categories as $category ) { 27 $parentCountAll += $category->count; 28 } 29} 30 31?> 32<td width="18%" align="center" valign="middle" bgcolor="#ccffff"> 33 <?php 34 $args = array( 35 'orderby' => 'name', 36 'include' => '2' 37 ); 38 $categories = get_categories( $args ); 39 foreach ( $categories as $category ) { 40 echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name .' </a>'; 41 } 42 ?><br/> 43 44<?php 45 // 親カテゴリでは、$parentCountAllを表示するのみにする 46 echo $parentCountAll; 47 48?> 49 50</td> 51<!-- 以下は質問者さんの書いた通りのままでオーケー -->

-------- 以下元回答 --------
少し野暮ったいですが、表示の前に、先にforeachでデータを用意して、そのデータを元に、
数を表示させましょう。

php

1<td> 2北海道・東北(この箇所のコードは省略) 3<?php 4/* 5$args = array( 6 'orderby' => 'name', 7 'include' => '2', 8 'pad_counts' => 1 9); 10*/ 11// カテゴリを限定しないため、カテゴリ取得のオプションをつけない 12$categories = get_categories(); 13// 子カテゴリの記事数をカウントする変数を用意 14$catParentAllCount = 0; 15// 記事の合計数を計算 16// カテゴリ全てで走査 17foreach ( $categories as $category ) { 18 19 if ($category->parent) { 20 // まず親がいる(親を除外したい) 21 $parent = $category->parent; 22 if ($parent->cat_ID == 2) { 23 // 親のIDが2である 24 // ここでようやっとカウントアップ 25 $catParentAllCount += $category->count; 26 } 27 } 28} 29 30echo $catParentAllCount; 31 32?> 33</td>

投稿2019/06/13 13:48

編集2019/06/14 08:48
miyabi_takatsuk

総合スコア9528

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

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

khoroshoshow

2019/06/13 14:30

ご回答ありがとうございます。 早速反映してみました。 コードを差し替えてアップした所、うまく反映されないようです。 画像キャプチャをアップしました。 記事数は0と表示されています。
miyabi_takatsuk

2019/06/13 14:36

回答、若干修正しました。 こちらのコードでも、意図しない結果になる場合、またコメントください。
miyabi_takatsuk

2019/06/13 14:44

ちなみに、 foreach ( $categories as $category ) { $catParentAllCount += $category->count; } これ入れてますよね・・・? もし入れていないのなら、 回答をよくご覧ください。 foreachを二回実行しています。
khoroshoshow

2019/06/13 14:54

お忙しい中ご回答ありがとうございます。 コードを差し替えてアップした所、 記事数は1と表示されています。 画像キャプチャをアップしました。 ご指摘いただいた、コードの貼り付けは問題ないかと思います。 念のため、phpファイルのキャプチャもアップしました。 お手数ですがご確認いただけると幸いです。
miyabi_takatsuk

2019/06/13 14:56

うん、なんとなく原因わかってきました。 これ、全体のコード載せていただかないと解決しません。 だって、これ、繰り返しの一部の表示ですよね? 私は、これが、全体のカテゴリー全部の繰り返しをこのコードで入れているという想定で、書きました。 カテゴリ単体の部分で解決はできません。
miyabi_takatsuk

2019/06/13 15:03

WordPressなどのCMSの走査の場合、 そのカテゴリ単発などでは、解決しないことがほとんどです。 私も見落としていた部分がありますが、 (よく見ればカテゴリ単発の構文であることに気づける要素はある) その一部で解決しようとせず、全体的にみていくと解決の糸口が見つかりやすくなります。 どうか、子カテゴリも含め、どう表示させているか、 tableの部分だけで構いませんので、全体のコードを質問本文にご記載ください。
miyabi_takatsuk

2019/06/13 15:21

ひとまず、そのカテゴリ単体でも正確な数が表示されるよう、修正しましたが、 質問本文も、先ほどコメントしたように修正しましょう。 (今後、要件が伝わりやすい質問ができるように練習しましょう)
khoroshoshow

2019/06/13 15:58

お忙しい中ご回答ありがとうございます。 該当箇所の<td>〜</td>のコードをアップしました。 繰り返しは別々に分けているという書き方をしたつもりでいたので、 掲載はしませんでした。
khoroshoshow

2019/06/13 16:00

質問が伝わりづらく申し訳ありません。 3回目のコードを反映させていただきました。 今回は0と表示されています。
miyabi_takatsuk

2019/06/14 01:12 編集

質問の修正コードを拝見したのですが、そういう意味ではなくてですね・・・。 > 繰り返しは別々に分けているという書き方をしたつもりでいたので、 掲載はしませんでした。 わからないのであれば、お願いです、言われた通りしていただければと思います・・・。 こちらとしては、解決するために、必要だと判断して、情報提供をお願いしているのです。 なので、 "子カテゴリ"も含めて、table全体のコードを記載ください。 それだと、親のカテゴリの表示のためのコードのみです。 該当箇所ピンポイントではなく、全体のコードを記載して欲しいのです。 必要箇所がわからないのであれば、もう、いっそのこと、ページ全体のコードを記載してください。 (つまり、子カテゴリの記事数を取得しているところから、カウントアップするようにしたい。 そのため、親カテゴリの記載だけでは、不十分) 子カテゴリの数は正しく反映されているんですよね? ならば、正しく動いている部分から、情報を取得していく、というのも必要なんです。 うまくいかない部分(今回は親カテゴリだけでやろうとしているということ)でぐるぐる回ってても、何も進みません。 うまくいっている部分から、発展させていきましょう。 それと、それで0と表記されたのであれば、 このカテゴリを表示しているのが、 記事のページなのか、それともトップなのか、によって、全然変わってきます。 なんのページで表示かも合わせて記載ください。 page.phpですか?single.phpですか?はたまた、top.phpや、home.phpでしょうか? (同じWordPress関数でも、記載するページによって引っ張ってこれる情報が違う。 グローバルの全体のカテゴリを取ってくるのに一発でできるページもあれば、 工夫しなければいけないページもある)
khoroshoshow

2019/06/14 04:38

失礼いたしました。。 該当ページは、front-page.phpです。 コード全体も追記いたしました。 他に足りない情報がありましたらご指摘いただけると幸いです。
miyabi_takatsuk

2019/06/14 04:47 編集

あれ、これで本当に全体なのでしょうか・・・? 北海道とか青森県とかも、全部このコードで出力してるってことですか・・・? 失礼しました、更新のタイミングで、見れてなかったようです! 質問修正、大変にありがとうございます・・・。
khoroshoshow

2019/06/14 04:48

すみません、文字数制限がかかってうまく掲載できていませんでした。 途中省略した状態で、再アップしました。
miyabi_takatsuk

2019/06/14 04:51

了解です! もしかしたら、YukiYamashinaさんのご回答の方から、修正していった方が、 よりスマートな書き方になるかもしれませんが、 (私の回答のやり方はかなり無駄があって野暮いかも) やっていきますので、少々お待ちを。
miyabi_takatsuk

2019/06/14 05:47

修正いたしました。 上の方のものをお使いください。 親のみにフォーカスしておりますので、親の部分に適用させていただければと思います。 また、不都合などありましたら、コメントいただければと思います。
khoroshoshow

2019/06/14 08:18

お忙しい中、ご対応ありがとうございます。 無事実装できました! 情報提供に不備があり、度々申し訳ありませんでした。 今後に生かしていきます。
khoroshoshow

2019/06/14 08:23

度々すみません、 もう1点ご教授いただきたい箇所がありました。 ■カテゴリのカウント方法 for ($i=13; $i < 19; $i++) { こちらで数字が並びになっていない場合は、 1つずつカテゴリIDを書くことになると思いまして。 可能であれば、その場合の書き方をお教えいただけるとありがたいです。 (初歩的な質問かもしれません。。) ご確認よろしくお願いいたします。
miyabi_takatsuk

2019/06/14 08:26 編集

あ、コメントいただいてましたね。 そうです、私の書き方だと、そうなってしまうので、いずれは、動的にしなくてはならなくなるかと思いますが・・・。 わかりました、その場合の方法に修正いたします。 少し手が離せなくなるので少々お時間ください。
khoroshoshow

2019/06/14 08:34

ありがとうございます。 お手隙で対応いただけると大変ありがたいです。 都道府県の件数以上にカテゴリが増えることはないので、親カテゴリに直接1つづカテゴリIDを書く方法でも問題ございません。
miyabi_takatsuk

2019/06/14 08:49

回答修正しました。 かなりハードコーディングになってしまっていますが、 その中で、できる限り動的になるようなコントロールをしています。 ご参考にしていただければと思います。 (親に所属する子カテゴリを取得できれば、ここまで静的にはならない・・・)
khoroshoshow

2019/06/14 08:56

早速のご対応ありがとうございます。 こちらも問題なく表示されました! 並びが連番になっていない箇所があっても、 このコードで対応することができます。
khoroshoshow

2019/06/14 09:00

この度はご教授いただきありがとうございました。 コードにコメントアウト文も丁寧に入れていただき非常に参考になりました! まだまだ理解できていない部分が多いですが、これから学んでいきたいと思っております。 大変助かりました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問