🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ループ

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

2回答

1117閲覧

絞り込んだ記事の件数を表示したいのですが...

iambeginnerr

総合スコア12

WordPress

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ループ

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/02/03 05:48

前提・実現したいこと

wordpressでサイト制作をしています。
カスタム投稿...shop
タクソノミー1...area_cat(エリアの分類)
タクソノミー2...genre_cat(ジャンルの分類)

・以下のように、日本を地方ごとに分け、都道府県一覧を表示している箇所があります。この箇所で、都道府県を選択すると市区町村一覧が表示されるようになっています。

<北海道・東北>
北海道
∟札幌市、函館市...
青森
秋田
岩手
山形
宮城
福島
<関東>
茨城
栃木...

・この表示は、taxonomy-genre_cat.phpというテンプレート内に表示しており、「https://ドメイン/genre_cat/japanese/」というページでは、japanese(日本食)というターム以下に属するshop(記事)の件数を取得したいです。つまり、先に述べた例ですと、「札幌市の日本食屋の件数」「函館市の日本食屋の件数」を取得したいという意味です。

■実現したい表示例

<北海道・東北(1000)>
北海道(100)
∟札幌市(10)、函館市(20)...
青森(100)
秋田(100)
岩手(100)
山形(100)
宮城(100)
福島(100)
<関東(5000)>
茨城(100)
栃木(100)...

該当のソースコード

もともと、地方と都道府県部分はプルダウン形式で以下のコードで表示しておりました。

<div id="category"> <ul id="menu"> <li><div class="main_menu">北海道・東北</div> <?php $my_tax = 'area_cat'; //取得したいタクソノミー名 $parent_terms = get_terms( $my_tax, array('hide_empty' => false, 'slug'=>array('hokkaido','aomori','akita','yamagata','iwate','miyagi','fukushima'),'parent' => 0) ); //第一階層のタームだけ取得 if ( !empty( $parent_terms ) ) : echo '<ul class="sub_menu">'; //第1ループ foreach ( $parent_terms as $pt ) : $pt_id = $pt->term_id; $pt_name = $pt->name; $pt_url = get_term_link($pt); ?> <li class="pt"><span class="pt-span"><?php echo $pt_name; ?></span> <?php $child_terms = get_terms( $my_tax, array('hide_empty' => false, 'parent' => $pt_id) ); if ( !empty( $child_terms ) ) : echo '<ul class="third_menu">'; //第2ループ foreach ( $child_terms as $ct ) : $ct_id = $ct->term_id; $ct_name = $ct->name; $ct_slug =$ct->slug; $ct_url = get_term_link($ct); ?> <li><label class="label--checkbox"><input type="checkbox" class="checkbox" id="<?php echo $ct_slug?>" name="area_cat" value="<?php echo $ct_slug?>"><span><?php echo $ct_name; ?> /*ここから絞り込み件数表示*/ <?php $args = array( 'post_type' => 'shop', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'genre_cat', 'field' => 'term_id', 'terms' => $genre_term_id, ), array( 'taxonomy' => 'area_cat', 'field' => 'slug', 'terms' => $ct_slug, ), ), ); $my_query = new WP_Query($args); $count_posts = $my_query->found_posts; $allarea = get_term_by( 'slug', 'allarea-c', 'area_cat' ); $all_areacount = $allarea->count; $allposts = $all_areacount + $count_posts; echo '('.$allposts.')'; ?> /*ここまで絞り込み件数表示*/ </span></label></li> <?php endforeach; //End : 第2ループ echo '</ul><!--.third_menu-->'; endif; ?> </li> <?php endforeach; //End : 第1ループ echo '</ul><!--.sub_menu-->'; endif; ?> </li> <li><div class="main_menu">関東</div> /*以下、上記「北海道・東北」の親スラッグ名だけ変更して、同じコードをコピペしました。*/ ・ ・ ・ </li> </ul><!--#menu--> </div><!--#category-->

結果

ソースコードの絞り込み件数表示部分を、「北海道・東北」「関東」「中部」あたりまでコピペしたところで、ページ自体が表示されなくなりました。(「中部」以下が表示されないという現象)
同じ処理を繰り返しすぎて、DBからの返答がなくなったのかなと思い、もっと簡潔にまとめられないか調べたのですが、PHPは初心者でどのようなコードで解決するのかわかりませんでした。
ちなみに、絞り込み件数表示部分を、「北海道・東北」「関東」のみ適用すると思った通りの表示になりました。
こういった場合はどのように記述するのが望ましいのでしょうか。
参考になるページでも構いませんので、どうかお力をお貸しください!

※上記コードの「$allarea」は、「全国」に該当するshopで全ての件数に加算される仕様になっています。

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

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

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

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

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

guest

回答2

0

同じ処理を繰り返しすぎて、DBからの返答がなくなったのかなと思い、もっと簡潔にまとめられないか調べたのですが、PHPは初心者でどのようなコードで解決するのかわかりませんでした。

そう思ったのであれば、その仮説が正しいか検証するのが先です。
エラーログや、実機を使用したパフォーマンス検証作業を実施して問題点を絞ってください。

投稿2021/02/03 12:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

データの構造がデータの取得方法がこの説明だけではどうなってるか分からないのでなんとも言えませんが、すべての市町村の件数を都度都度件すべて計算しているのだとしたら、そのような状況になっても致し方ないのかな?とは思います。

色々な実装方法があるとは思いますが、あらかじめ別に算出しておいたすべての市町村の件数データをPHPのメモリ上やRedisなどにキャッシュさせておくとか、ユーザがプルダウンを開いた瞬間にJavaScriptをつかって非同期で必要な市町村のみデータのみを取得しに行くとか、ちょっと一工夫が必要だと思います。

投稿2021/02/03 13:16

AbeTakashi

総合スコア4853

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問