カスタムフィールドの集計方法
-
マルチサイト版(サブディレクトリ型)のワードプレスにおいて、初期ブログに登録した会員名簿を元に別のブログのカスタムフィールドで割り当てた『会員名』と同一の氏名のデータ(得点)を合計し、合計点の多い5名をリストにして表示したいと考えています。
以前フォーラムに投稿した『マルチサイト内のほかのブログに設定したカスタムフィールド値を、ほかのブログで読みだして表示したい』で、初期ブログ内に設けた「会員名簿」ページから、下記のコードをもとにして、会員名簿までは表示できるようになりました。
// -------------------- // 変数初期値設定 // -------------------- <?php $bid = '1'; // 初期ブログID $pid = '6085'; // 設定ページID $cid = '1'; // カウントID ?> <?php if (get_current_blog_id() != $bid) { switch_to_blog($bid); } ?> // -------------------- // 名簿リスト形成 // -------------------- <?php if ( have_rows( 'list' , $pid ) ) : ?> <table> <thead> <?php // ----- 表ヘッダー(省略) ----- ?> </thead> <tbody> <?php while ( have_rows( 'list' , $pid ) ) : the_row(); ?> <tr> <td> <?php echo $cid; ?> </td> <td> <?php the_sub_field( 'num' , $pid ); ?> </td> <td> <?php the_sub_field( 'class' , $pid ); ?> <?php $pos = get_sub_field( 'pos' , $pid ); if($pos !== '一般'){ echo '<span>(' . $pos . ')</span>'; } else { echo ''; } ?> </td> <td> <?php $name = get_sub_field( 'name' , $pid ); echo $name; ?> </td> </tr> <?php $cid++; ?> <?php endwhile; ?> </tbody> </table>
この表で吸い上げた名簿を元に、ブログID(1)の名簿に登録してある「氏名」と表示するサイトのブログID(18)の全投稿に割り当てられたカスタムフィールド($name)の「氏名」が一致し、登録日が入力指定した日付の範囲内にあるデータをもとにリスト化したいと思っています。
ブログID(18)の全投稿のカスタムフィールドに割り当ててある『氏名・得点・賞金』を抽出し、『(所属・氏名)・月間得点合計・月間賞金合計・年間得点合計・年間賞金合計』を表示するテーブルを、固定ページの独自テンプレートの中に埋め込んで利用したいと考えています。
※()内の値はブログID(1)の値から取得。現在使用している『氏名・所属・得点・金額』コードは次の通りです。
<table> <thead> <tr> <th>氏名(1)</th> <th>氏名(2)</th> <th>所属</th> <th>得点</th> <th>金額</th> </tr> </thead> <?php $cid = 1 ; ?> <?php $args = array( 'posts_per_page' => -1, 'order' => 'DESC', 'post_type' => 'post', 'post_status' => 'publish', 'suppress_filters' => true, 'no_found_rows' => true ); $the_query = new WP_Query( $args ); ?> <?php while ( $the_query->have_posts() ) { ?> <?php $the_query->the_post(); ?> <?php // ページIDの取得 $pid = get_the_ID(); // 基本情報の取得 if ( have_rows( 'kzn_info' , $pid ) ) : while ( have_rows( 'kzn_info' , $pid ) ) : the_row(); $kzn_entnum = get_sub_field( 'kzn_entnum' , $pid ); $kzn_ent_date = get_sub_field( 'kzn_ent_date' , $pid ); $kzn_reg_date = get_sub_field( 'kzn_reg_date' , $pid ); $kzn_reg_month = get_sub_field( 'kzn_reg_month' , $pid ); endwhile; endif; // 一人目の提案者情報の取得 if ( have_rows( 'kzn_post_person01' , $pid ) ) : while ( have_rows( 'kzn_post_person01' , $pid ) ) : the_row(); $kzn_p01_cnum = get_sub_field( 'kzn_p01_cnum' , $pid ); $kzn_p01_post = get_sub_field( 'kzn_p01_post' , $pid ); $kzn_p01_group = get_sub_field( 'kzn_p01_group' , $pid ); $kzn_p01_class = get_sub_field( 'kzn_p01_class' , $pid ); $kzn_p01_name = get_sub_field( 'kzn_p01_name' , $pid ); $kzn_p01_num = get_sub_field( 'kzn_p01_num' , $pid ); $kzn_p01_money = get_sub_field( 'kzn_p01_money' , $pid ); endwhile; endif; // 二人目の提案者情報の取得 if ( have_rows( 'kzn_post_person02' , $pid ) ) : while ( have_rows( 'kzn_post_person02' , $pid ) ) : the_row(); $kzn_p02_name = get_sub_field( 'kzn_p02_name' , $pid ); $kzn_p02_num = get_sub_field( 'kzn_p02_num' , $pid ); $kzn_p02_money = get_sub_field( 'kzn_p02_money' , $pid ); endwhile; endif; ?> <tbody> <?php if( ( $kzn_reg_date >= $date_start ) && ( $kzn_reg_date <= $date_end ) ){ ?> <?php if ($cid % 2) : ?> <tr class="cwrp"> <?php else : ?> <tr class="cwrp" style="background-color: #e6e6e6;"> <?php endif; ?> <td><?php echo $cid ; ?></td><!-- No --> <td><?php echo $kzn_p01_name; ?></td><!-- 氏名(1) --> <td><?php echo $kzn_p02_name; ?></td><!-- 氏名(2) --> <td> <?php if( !$kzn_p02_name ) : ?> <?php echo $kzn_p01_post; ?> <?php endif; ?> </td><!-- 所属 --> <td><?php echo $kzn_entnum; ?></td><!-- 提案No. --> <td class="lwrp"><?php the_title(); ?></td><!-- 件名 --> <td><?php echo $kzn_p01_num + $kzn_p02_num; ?></td><!-- 得点 --> <td><?php echo $kzn_p01_money + $kzn_p02_money; ?></td><!-- 金額 --> </tr> <?php } ?> <?php wp_reset_postdata(); ?> <?php } ?> </tbody> </table> <?php endwhile; ?>
ここから
<table> <thead> <tr> <th>氏名</th><th>所属</th><th>月間得点</th><th>月間賞金額</th><th>月間得点</th><th>年間賞金額</th> </tr> </thead> <tbody> <tr> <td>blog0.name</td> <td>blog0.post</td> <td>(月間の) if((blog0.name == blog18.kzn_p01_name) or (blog0.name == blog18.kzn_p02_name)){ blog18.(sum($kzn_p01_num))+(sum($kzn_p02_num)) }</td> <td>(月間の) if((blog0.name == blog18.kzn_p01_name) or (blog0.name == blog18.kzn_p02_name)){ blog18.(sum($kzn_p01_money))+(sum($kzn_p02_money)) }</td> <td>(年間の) if((blog0.name == blog18.kzn_p01_name) or (blog0.name == blog18.kzn_p02_name)){ blog18.(sum($kzn_p01_num))+(sum($kzn_p02_num)) }</td> <td>(年間の) if((blog0.name == blog18.kzn_p01_name) or (blog0.name == blog18.kzn_p02_name)){ blog18.(sum($kzn_p01_money))+(sum($kzn_p02_money)) }</td> </tr> </tbody> </table>
のようなリストを作りたいのです。
+αとして、年間得点を降順表示にして『上位5人だけ』を抽出できれば最高です。
もし、データベースのようにデータを降順で並び替えができれば、LOOP回数を5回にすればよいので、そこは自己解決できそうです。本来、抽出したデータをもとに、配列を駆使してリストアップできれば簡単なのでしょう。
私自身の頭脳が、BASIC時代の古い脳みそなため、上記のコードを見てわかる通り『ステップ実行型』でしか考えられなくて、本来なら一行づつ実行していくのではなく、データを抽出して配列に変換(クエリ―)し、そのデータベースをもとにリストが作れれば簡単なのかもしれません。Perl全盛の時からこれまで、ステップ実行型での似非プログラミングだけでやってきたため、コンパイル型でのプログラミンが理解できないまま、本日に至っています。
多分「アドバイス」という形だけでは、私の方が理解できない可能性も高いのですが、ご協力いただきたく、よろしくお願いいたします。
- トピック「カスタムフィールドの集計方法」には新たに返信することはできません。