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

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

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

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

Q&A

0回答

538閲覧

Wordpress:全レコードの合計(集計)方法について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2020/11/04 07:30

前提

[ O S ] Windows 10
[Server] XAMPP 7.3.22
[ PHP ] 7.4.10
[ D B ] MariaDB 10.3.15
[ W P ] 5.5.1-ja

※[Advanced Custom Fields]使用

  • 下記該当のソースコードにおいて、Wordpressの全投稿内のカスタムフィールド値を取得し、登録日($reg_date) が指定期間内のものをピックアップ。月間と年間のデータ(ベース)を生成しています。(※下記該当コードは動作確認済み)

実現したいこと

  • 該当コードを用いて取得した配列に対して、会員番号($p01num)にてグルーピングし、下記の通り、合計値を集計したいです。
  1. 『月間$Mstart から $Mend まで獲得ポイント』の合計 (全投稿中の$p01ptの合計)
  2. 『年間$Ystart から $Yend まで獲得ポイント』の合計 (全投稿中の$p01ptの合計)
  3. 『月間$Mstart から $Mend まで獲得賞金』の合計  (全投稿中の$p01pzの合計)
  4. 『年間$Ystart から $Yend まで獲得賞金』の合計  (全投稿中の$p01pzの合計)

MySQLをもし使えるのなら、多分、こんなコードになるのかも?しれません。

SQL

1【月間獲得ポイントの合計を取得する場合】 2SELECT 3 sum('p01pt') 4 5 from 'データベース名' 6 7 where 8 'reg_date' >= $Mstart 9 AND 10 'reg_date' <= $Mend 11 12 group by 'p01num'

該当のソースコード

PHP

1<?php 2 3 // 期間設定の読込 4 $Mstart = do_shortcode( '[vMstart]' ); // 月間開始日 5 $Mend = do_shortcode( '[vMend]' ); // 月間終了日 6 $Ystart = do_shortcode( '[vYstart]' ); // 年間開始日 7 $Yend = do_shortcode( '[vYend]' ); // 年間終了日 8 9 // 配列の初期化 10 $resMrows = []; 11 $resYrows = []; 12 13 // 投稿より全提案データ取得 14 $args = array( 15 'posts_per_page' => -1, 16 'order' => 'DESC', 17 'post_type' => 'post', 18 'post_status' => 'publish', 19 'suppress_filters' => true, 20 'no_found_rows' => true 21 ); 22 $the_query = new WP_Query($args); 23 24 // 全提案データを配列に割当 25 while ( $the_query->have_posts() ) : 26 $the_query->the_post(); 27 28 // ページIDの取得 29 $pid = get_the_ID(); 30 31 // 基本情報の取得 32 if ( have_rows( 'kzn_info' , $pid ) ) : 33 while ( have_rows( 'kzn_info' , $pid ) ) : the_row(); 34 $entNum = get_sub_field( 'kzn_entnum' , $pid ); // 登録番号 35 $reg_date = get_sub_field( 'kzn_reg_date' , $pid ); // 登録日 36 endwhile; 37 endif; 38 39 // 受賞者情報の取得 40 if ( have_rows( 'kzn_post_person01' , $pid ) ) : 41 while ( have_rows( 'kzn_post_person01' , $pid ) ) : the_row(); 42 $p01num = get_sub_field( 'kzn_p01_cnum' , $pid ); // 会員番号 43 $p01name = get_sub_field( 'kzn_p01_name' , $pid ); // 氏名 44 $p01pt = get_sub_field( 'kzn_p01_num' , $pid ); // 獲得ポイント 45 $p01pz = get_sub_field( 'kzn_p01_money' , $pid ); // 獲得賞金 46 endwhile; 47 endif; 48 49 // 月間集計 50 if( ( $reg_date >= $Mstart ) && ( $reg_date <= $Mend ) ) : 51 $resMrows[] = array( 52 'cnum' => $p01num, // 会員番号 53 'cname' => $p01name, // 氏名 54 'p01pt' => $p01pt, // 獲得ポイント 55 'p01pz' => $p01pz, // 獲得賞金 56 'regDate' => $reg_date // 登録日 57 ); 58 59 // 年間集計 60 elseif( ( $reg_date >= $Ystart ) && ( $reg_date <= $Yend ) ) : 61 $resYrows[] = array( 62 'cnum' => $p01num, // 会員番号 63 'cname' => $p01name, // 氏名 64 'p01pt' => $p01pt, // 獲得ポイント 65 'p01pz' => $p01pz, // 獲得賞金 66 'regDate' => $reg_date // 登録日 67 ); 68 endif; 69 70 endwhile; 71?>

試したこと

  • 今回初めて「配列操作」にチャレンジしてみました。というのも、最終的には年間の獲得ポイント($p01pt)の多い順に並び替えする必要があるため、今までのような『インライン処理での計算』では対応ができないと考えました。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問