前提
[ 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)
にてグルーピングし、下記の通り、合計値を集計したいです。
- 『月間
$Mstart から $Mend まで
獲得ポイント』の合計(全投稿中の$p01ptの合計)
- 『年間
$Ystart から $Yend まで
獲得ポイント』の合計(全投稿中の$p01ptの合計)
- 『月間
$Mstart から $Mend まで
獲得賞金』の合計(全投稿中の$p01pzの合計)
- 『年間
$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)の多い順に並び替え
する必要があるため、今までのような『インライン処理での計算』では対応ができないと考えました。
あなたの回答
tips
プレビュー