前提・実現したいこと
Wordpressのカスタムフィールドを利用して、データの抽出・配列操作を行いたいと思っています。
基本となるテーブルの構成は、該当のソースコードの通りです。
やりたいことは次の通りです。
0. **『会員番号だけのリスト($pLrows
)』**の会員番号の分だけ『集計結果』のループ処理($resMrows
)をできるようにしたい。
【希望とする配列要素】
初期ブログから抽出した会員番号リスト|$gtMMpt|$gtMMpz|$gtYYpt|$gtYYpz
サーバー仕様
[ 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
該当のソースコード
現状のソースコードを、次の通り、ご報告します。
wordpress
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 11<?php 12 13 // ------------------------------ 14 // 会員名簿データからデータ抽出 15 // ------------------------------ 16 17 // 会員名簿データのページID 18 $pid = '6085'; 19 20 // 配列の初期化 21 $cLrows = []; 22 $pLrows = []; 23 24 // メインBLOG(blogID:1)データへ切替 25 if (get_current_blog_id() != 1) { 26 switch_to_blog(1); 27 } 28 29 // 会員名簿の読込&配列 30 if ( have_rows( 'list' , $pid ) ) : 31 while ( have_rows( 'list' , $pid ) ) : the_row(); 32 $gtNum = get_sub_field( 'num' , $pid ); 33 $gtClass = get_sub_field( 'class' , $pid ); 34 $gtName = get_sub_field( 'name' , $pid ); 35 $gtPos = get_sub_field( 'pos' , $pid ); 36 37 // PHASE01:会員名簿リスト 38 $cLrows[$gtNum] = array( 39 'class' => $gtClass, 40 'name' => $gtName, 41 'pos' => $gtPost 42 ); 43 44 // PHASE02会員番号リスト 45 $pLrows[] = array( 46 'num' => $gtNum 47 ); 48 endwhile; 49 endif; 50 51 //カスタムクエリをリセット 52 wp_reset_postdata(); 53?> 54<?php 55 56 // 集計用BLOG(blogID:18)データへ切替 57 if (get_current_blog_id() != 18) { 58 switch_to_blog(18); 59 } 60?> 61<?php 62 63 // 会員番号リストのループ処理 64 foreach( $pLrows as $rows ){ 65 66 foreach( $rows as $data ){ 67 68 $ss = $data; 69 70 71 // ------------------------------ 72 // 会員番号による集計処理 73 // ------------------------------ 74 75 $resMrows = []; 76 77 // 初期化 78 $gtMMpt = 0; 79 $gtMMpz = 0; 80 81 $args = array( 82 'numberposts' => -1, 83 'post_type' => 'post', 84 'post_status' => 'publish', 85 'wildcard_meta_key' => true, 86 'meta_query' => array( 87 'relation' => 'OR', 88 array( 89 'key' => 'kzn_post_person01_kzn_p01_cnum', 90 'compare' => '=', 91 'value' => $ss, 92 ), 93 array( 94 'key' => 'kzn_post_person02_kzn_p02_cnum', 95 'compare' => '=', 96 'value' => $ss, 97 ), 98 ), 99 100 ); 101 102 $mm_query = new WP_Query($args); 103 104 while ( $mm_query->have_posts() ) : 105 $mm_query->the_post(); 106 107 108 // ページIDの取得 109 $pid = get_the_ID(); 110 111 // 基本情報の取得 112 if ( have_rows( 'kzn_info' , $pid ) ) : 113 while ( have_rows( 'kzn_info' , $pid ) ) : the_row(); 114 $reg_date = get_sub_field( 'kzn_reg_date' , $pid ); // 登録日 115 endwhile; 116 endif; 117 118 // 一人目の受賞者情報の取得 119 if ( have_rows( 'kzn_post_person01' , $pid ) ) : 120 while ( have_rows( 'kzn_post_person01' , $pid ) ) : the_row(); 121 $p01num = get_sub_field( 'kzn_p01_cnum' , $pid ); // 会員番号 122 $p01pt = get_sub_field( 'kzn_p01_num' , $pid ); // 獲得ポイント 123 $p01pz = get_sub_field( 'kzn_p01_money' , $pid ); // 獲得賞金 124 endwhile; 125 endif; 126 127 // 二人目の受賞者情報の取得 128 if ( have_rows( 'kzn_post_person02' , $pid ) ) : 129 while ( have_rows( 'kzn_post_person02' , $pid ) ) : the_row(); 130 $p02num = get_sub_field( 'kzn_p02_cnum' , $pid ); // 会員番号 131 $p02pt = get_sub_field( 'kzn_p02_num' , $pid ); // 獲得ポイント 132 $p02pz = get_sub_field( 'kzn_p02_money' , $pid ); // 獲得賞金 133 endwhile; 134 endif; 135 136 137 138 // 月間合計 139 if( ( $reg_date > $Mstart ) && ( $reg_date <= $Mend ) ) : 140 if( $ss == $p01num ) : 141 $gtMMpt = $gtMMpt + $p01pt; 142 $gtMMpz = $gtMMpz + $p01pz; 143 elseif( ( $p02num ) && ( $ss == $p02num ) ) : 144 $gtMMpt = $gtMMpt + $p02pt; 145 $gtMMpz = $gtMMpz + $p02pz; 146 endif; 147 endif; 148 149 // 年間合計 150 if( ( $reg_date > $Ystart ) && ( $reg_date <= $Yend ) ) : 151 if( $ss == $p01num ) : 152 $gtYYpt = $gtYYpt + $p01pt; 153 $gtYYpz = $gtYYpz + $p01pz; 154 elseif( ( $p02num ) && ( $ss == $p02num ) ) : 155 $gtYYpt = $gtYYpt + $p02pt; 156 $gtYYpz = $gtYYpz + $p02pz; 157 endif; 158 endif; 159 160 161 $resMrows[$ss] = array ( 162 'MMpt' => $gtMMpt, 163 'MMpz' => $gtMMpz, 164 'YYpt' => $gtYYpt, 165 'YYpz' => $gtYYpz 166 ); 167 168 endwhile; 169 170 //カスタムクエリをリセット 171 wp_reset_postdata(); 172 173 } 174 175} 176?> 177<h2>抽出データ</h2> 178<div style="border:3px dashed #c00; padding:2rem;"> 179<pre> 180<?php print_r($resMrows); ?> 181</pre> 182</div>
試したこと
- (1)の部分を
foreach文
を使って、$resMrows
の抽出処理をループさせてみましたが、うまく動作しませんでした。
php
1foreach($cLrows as $rows){ 2foreach($rows as $data){ 3$ss = $data; 4: 5中略 6: 7$resMrows[$ss] = array ( 8 'MMpt' => $gtMMpt, 9 'MMpz' => $gtMMpz, 10 'YYpt' => $gtYYpt, 11 'YYpz' => $gtYYpz 12); 13} 14}
-
$ss
の値を、foreach文
を使用せず、”1206(基準値)”を設定すると、会員番号1206の集計結果がきちんと表示されます。ただし、ループ処理を行っていないため、単一の会員番号の集計結果のみしか集計できません。 -
phpなどのリファレンスを読んだり、「PHP 2次元配列」で検索してヒットした記事などを読みあさりましたが、解決できませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。