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

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

ただいまの
回答率

89.12%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,068

khoroshoshow

score 11

お世話になります。

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

■北海道・東北(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様のコードで実装できました。

イメージ説明

・使用コード

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • miyabi_takatsuk

    2019/06/13 21:14

    コードはコードブロックにて記載しましょう。
    <code>ボタンで出てくる文字列の中に入れればできます。

    現在はどのように表示されてるのか、画面キャプチャか、テキストでいいので、記載してください。

    キャンセル

  • khoroshoshow

    2019/06/13 21:54

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

<?php
// ここで、親カテゴリのカウントアップする変数を用意
// 他の親に関しては、また別途別名の親カウント変数を用意する
$parentCountAll = 0;

// 今回に必要な子カテゴリの数だけ、カテゴリ取得して、記事カウント数を足していく(13〜19のカテゴリIDのもの)
// 入れるカテゴリの番号の配列を用意する
$catIDs = array(
  13,
  14,
  15,
  16,
  17,
  18,
  19
);

foreach($catIDs as $catId) {
  $args = array(
    'orderby' => 'name',
    'include' => $catId,
    'hide_empty' => 0,
    'pad_counts' => 1
  );
  $categories = get_categories( $args );
  foreach ( $categories as $category ) {
    $parentCountAll += $category->count;
  }
}

?>
<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
  // 親カテゴリでは、$parentCountAllを表示するのみにする
  echo $parentCountAll;

?>

</td>
<!-- 以下は質問者さんの書いた通りのままでオーケー -->

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

<td>
北海道・東北(この箇所のコードは省略)
<?php
/*
$args = array(
  'orderby' => 'name',
  'include' => '2',
  'pad_counts' => 1
);
*/
// カテゴリを限定しないため、カテゴリ取得のオプションをつけない
$categories = get_categories();
// 子カテゴリの記事数をカウントする変数を用意
$catParentAllCount = 0;
// 記事の合計数を計算
// カテゴリ全てで走査
foreach ( $categories as $category ) {

  if ($category->parent) {
    // まず親がいる(親を除外したい)
    $parent = $category->parent;
    if ($parent->cat_ID == 2) {
      // 親のIDが2である
      // ここでようやっとカウントアップ
      $catParentAllCount += $category->count;
    }
  }
}

echo $catParentAllCount;

?>
</td>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/14 17:49

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

    キャンセル

  • 2019/06/14 17:56

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

    キャンセル

  • 2019/06/14 18:00

    この度はご教授いただきありがとうございました。
    コードにコメントアウト文も丁寧に入れていただき非常に参考になりました!

    まだまだ理解できていない部分が多いですが、これから学んでいきたいと思っております。
    大変助かりました!ありがとうございました。

    キャンセル

+1

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 13:41

    お忙しい中、ご回答ありがとうございます。

    コード早速反映してみました。
    キャプチャ画像追記いたしました。

    子ページの記事数を取得していますが、
    合計ではなく、記事数を並べる形で表示されています。
    211と並んでいます。

    ご確認いただけると幸いです。

    キャンセル

  • 2019/06/14 17:37

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

    キャンセル

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる