サポート » その他 » カスタムフィールドの集計方法

  • 解決済 heysister721

    (@heysister721)


    マルチサイト版(サブディレクトリ型)のワードプレスにおいて、初期ブログに登録した会員名簿を元に別のブログのカスタムフィールドで割り当てた『会員名』と同一の氏名のデータ(得点)を合計し、合計点の多い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全盛の時からこれまで、ステップ実行型での似非プログラミングだけでやってきたため、コンパイル型でのプログラミンが理解できないまま、本日に至っています。

    多分「アドバイス」という形だけでは、私の方が理解できない可能性も高いのですが、ご協力いただきたく、よろしくお願いいたします。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • スレッド開始 heysister721

    (@heysister721)

    やりたいことが複雑すぎるのか、回答しづらいようなので、一旦取り下げます。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • このトピックに返信するにはログインが必要です。