サポート » プラグイン » 1つのカスタムフィールドに入力した数値の合算と期間指定

  • 初めて投稿します。宜しくお願い致します。
    html、cssは理解がありますがPHPはノータッチ、WordPressは色々調べて切り貼りして構築しているレベルです。

    WordPressのカスタムフィールドテンプレートを活用して、営業マンの売上管理システムを構築しようと考えています。

    〈おおまかなイメージ〉
    1.営業担当者毎にアカウントを発行します。
    2.契約を取ったら各々が「投稿」から記事として売上を投稿(お客様名、売上金額などを、カスタムフィールドテンプレートに入力)します。
    3.営業担当者毎の売上累計の表示と、全員の売上累計の表示、可能であれば期間を指定して今月、先月、先々月の売上合計なども表示させたいです。

    〈カスタムフィールド名の設定例〉
    お客様名:name
    売上金額:uriage

    〈一覧表示ページ 一部〉

    <ul class="uriage_li">
    <li><p><span>担当者</span></p></li>
    <li><p><span>お客様名</span></p></li>
    <li><p><span>売上金額</span></p></li>
    <li><p><span>詳細</span></p></li>
    <?php query_posts('posts_per_page=10&cat=13&paged='.$paged); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <li><p><?php the_author(); ?></p></li>
    <li><p><?php echo post_custom("name")?></p></li>
    <li><p><?php echo post_custom("uriage")?></p></li>
    <li><p><a href="<?php the_permalink(); ?>">詳細を見る</a></p></li>
    <?php endwhile; endif; ?>
    </ul>

    上記のループで投稿一覧は表示出来ています。
    フィールド名「uriage」の合計を出すことは可能でしょうか。
    散々調べましたが、「A+B=C」の例しか見つけることが出来ませんでした。
    「A+A=C」を出したいです。

    これらの情報で伝わっているか不安ですが、ご教授いただけますと大変助かります。
    宜しくお願い致します。

    • このトピックは sakamotosndが3 ヶ月、 2 週間前に変更しました。
    • このトピックは sakamotosndが3 ヶ月、 2 週間前に変更しました。
    • このトピックは3 ヶ月、 2 週間前に  sakamotosnd さんが編集しました。理由: 一部記述ミスがあったので修正いたしました。
15件の返信を表示中 - 1 - 15件目 (全16件中)
  • @ioxrxogi さん

    返信ありがとうございます。
    実はそちらの記事は私も辿り着いておりました。
    ですが、@mura0403 さんが記述しているコードのどこを変更したら想像した処理をしてくれるのか、試行錯誤しましたが自分では解決できませんでした。お手上げ状態になり、こちらに投稿した次第です。
    フィールド名「uriage」の合計を出す記述を教えていただけますと大変助かりますが、難しいでしょうか。。

    こんにちは

    wpdb クラスを使用して SQL クエリーで取得する方法はどうでしょうか。
    下記ページの「変数の SELECT」セクションの例が参考になると思います。
    また、同ページの「SQL インジェクション攻撃からクエリを保護する」セクションは重要ですので合わせて参照してください。
    https://wpdocs.osdn.jp/関数リファレンス/wpdb_Class

    データベースの構造は下記ページを参照してください。
    http://wpdocs.osdn.jp/データベース構造

    例)

    $sql = "SELECT SUM(meta_value) FROM {$wpdb->posts} LEFT JOIN {$wpdb->postmeta} ON {$wpdb->postmeta}.post_id={$wpdb->posts}.ID WHERE meta_key='uriage' AND post_type='post'";
    
    // 総合計
    $sum = $wpdb->get_var( $sql );
    echo "<p>総合計: {$sum}</p>\n";
    
    // ユーザー合計
    $sum = $wpdb->get_var( $sql . " AND post_author=1" );
    echo "<p>ユーザー合計: {$sum}</p>\n";
    
    // 期間合計
    $sum = $wpdb->get_var( $sql . " AND post_date>='2017-1-1 00:00:00' AND post_date<'2017-2-1 00:00:00'" );
    echo "<p>期間合計: {$sum}</p>\n";

    営業マンごとの売上合計
    カスタムフィールド:
    営業マン name
    売り上げ uriage
    ポストタイプ:post

    <?php /*営業マンの売り上げを取得&計算*/
    	$args = array(
    		'numberposts' => '-1',
    		'post_type' => 'post', //投稿タイプの指定
    		'post_status' => 'all', //すべての投稿タイプ(なくてもいい)
    		'meta_key' => 'name', //営業マンのカスタムフィールド名
    		'meta_value' => 'a' //例えば、営業マン'a'
    	);
    	$customPosts = get_posts($args);
    
    	$star = ''; //reset
    	$sum_star = '';
    	$people = '';
    
    if($customPosts) :
    	foreach($customPosts as $post) :
    
    	$star[] = get_field('uriage'); //カスタムフィールドを取得 ※数値型
    
    	$people++; //対象記事の数だけ加算する
    
    	endforeach;
    
    if($star): $sum_star = array_sum($star); endif;
    
    	echo '売上金額:';
    	echo $sum_star; //計算した値を表示
    	echo '<br>売上件数:'; //対象記事の数
    	echo $people;
    //	echo '<br>平均売り上げ:';
    //	echo round($sum_star/$people,1); //小数点第1位で四捨五入
    
    endif;
    wp_reset_postdata(); /*クエリのリセット*/ 
    ?>

    とりあえず、営業マンaの売上合計を出すコードです。
    その他の営業マン(たとえば、b、cとか)を出したい時は、

    		'meta_key' => 'name', //営業マンのカスタムフィールド名
    		'meta_value' => 'a' //例えば、営業マン'a'

    この部分を選択式とかプルダウンとかで選んで、
    GETとかでデータを受け取って変更できるようにすればいいと思います。

    営業マン一覧で営業マンごとにだせるとおもいますが、
    わたしも切り貼りレベルの知識しか無いのですぐには思いつきません。

    @ishitaka さん

    返信ありがとうございます。
    理想的な処理をしてくれそうなコードですが、『データベース』という単語だけでも引いてしまうほど無知なので少しビビっています。
    今後、もっとそちら寄りの勉強を進めた時に活用させていただきます。
    ありがとうございます。

    @ioxrxogi さん

    参考コードありがとうございます。
    切り貼りレベルとは思えないほど迅速なお返事です。

    営業マンをラジオボタンでabcから選択できるようにしてみました。
    下記にGETを入れたりaのままにしてやってみましたが、ここでエラーがでてしまいます。
    多分書き方がちゃんとなっていないのもあるのだと思いますが・・。
    'meta_value' => 'a' //例えば、営業マン'a'
    上記の行をコメントアウトすると、下記でエラーになります。
    $star[] = get_field('uriage'); //カスタムフィールドを取得 ※数値型

    もう少し試してみます。
    取り急ぎお礼だけm(_ _)m
    ありがとうございます。

    sakamotosndさん、すいません。
    説明が足りませんでした。

    >GETとかでデータを
    と言ったのは、どういう構成になるのかわからないので、一案ですがページのどこかに
    ドロップダウン式に営業マンを選択できる項目を入れて、読み込ませたらどうかと書いたものです。
    たとえば、

    <form action="<?php echo esc_url( home_url( '/mxuriage/' ) ); //固定ページのアドレス(たとえば、スラッグがmxuriage) ?>" method="get" class="uriage">
    <select name="uri" onChange="this.form.submit()">
    	<option value="" class="***" selected>営業マン一覧</option>
    	<option value="a">田中</option>
    	<option value="b">佐藤</option>
    	<option value="c">鈴木</option>
    </select>
    </form>

    これで、営業マンのデータを受け取り、
    以下のコードを先ほどのコードの&argsの前に入れて、

    if ( isset( $_GET['uri'] ) ) {
    	$uri = $_GET['uri']; }

    meta_value' => 'a' //例えば、営業マン'a'
    こちらを
    'meta_value' => $uri //例えば、営業マン'a'
    に差し替えれば、選択した営業マンの売上合計が出ると思います。

    すいません。
    その前に、最初に書いた素のコードで動くか試してみてください。

    • この返信は3 ヶ月、 2 週間前に  ioxrxogi さんが編集しました。理由: 修正
    • この返信は3 ヶ月、 2 週間前に  ioxrxogi さんが編集しました。理由: 追記
    • この返信は3 ヶ月、 2 週間前に  ioxrxogi さんが編集しました。理由: 追記の修正

    @ioxrxogi さん

    とんでもございません!こちらこそトンチンカンで申し訳ありません。。

    〈望んでいるサイトの構成〉
    営業マン毎にWPアカウントを発行します。権限は編集者の予定です。
    各営業マンはWPの管理画面から記事(1件毎の売上実績)を投稿します。
    記事を投稿する時に、カスタムフィールドテンプレートにお客様名(フィールド名:name)や売上金額(フィールド名:uriage)を入力して投稿し、HPに反映されるといったイメージです。

    可能であれば the_author(); で投稿者(営業マン)名をそのまま反映させたかったのですが、仰るように『営業マン一覧』から選択させる方法でも構いません。

    HPは内部の人間しか閲覧せず、売上のリアルタイムチェック用サイトとなります。

    〈動作確認について〉
    初めにいただいたコードですと、下記の行でエラーが出ます。
    'meta_value' => 'a' //例えば、営業マン'a'
    aという名前でWPアカウントを発行&記事投稿をしてみましたが、エラーのままでした。

    仕様として、nameは契約を取ったお客様名をフィールドに充てているので、営業マンのフィールド名はtantouとしています。
    ioxrxogiさんにいただいたコードはそこだけ変更しました。

    <?php /*営業マンの売り上げを取得&計算*/
    	$args = array(
    		'numberposts' => '-1',
    		'post_type' => 'post', //投稿タイプの指定
    		'post_status' => 'all', //すべての投稿タイプ(なくてもいい)
    		'meta_key' => 'tantou', //営業マンのカスタムフィールド名
    		'meta_value' => 'a' //例えば、営業マン'a'
    	);
    	$customPosts = get_posts($args);
    
    	$star = ''; //reset
    	$sum_star = '';
    	$people = '';
    
    if($customPosts) :
    	foreach($customPosts as $post) :
    
    	$star[] = get_field('uriage'); //カスタムフィールドを取得 ※数値型
    
    	$people++; //対象記事の数だけ加算する
    
    	endforeach;
    
    if($star): $sum_star = array_sum($star); endif;
    
    	echo '売上金額:';
    	echo $sum_star; //計算した値を表示
    	echo '<br>売上件数:'; //対象記事の数
    	echo $people;
    //	echo '<br>平均売り上げ:';
    //	echo round($sum_star/$people,1); //小数点第1位で四捨五入
    
    endif;
    wp_reset_postdata(); /*クエリのリセット*/ 
    ?>

    何度も申し訳ございません。宜しくお願い致します。

    sakamotosndさん

    もう解決ってされましたでしょうか。
    基本的には、元のソースの部分の「echo post_custom(“uriage”);」を以下のソースで配列化させます。

    
    $uriage = post_custom("uriage");
    if($uriage): $uriage_a[] = $uriage; endif; 
    echo $uriage;
    

    ループが終わった後に、

    
    if($uriage_a):
    $goukei = array_sum ( $uriage_a);
    
    echo $goukei;
    
    endif;
    

    と、array関数で計算してあげると良いと思います。
    array_sum

    あとは皆様に頂いたソースにあらせて頂ければ、計算が簡素化できる気がします。
    私自身、ほとんど配列関数で組んでしまうので、皆様のソースの方がよろしいかもしれません。

    って感じの考え方とかはいかがでしょうか?

    クエリー関連は「関数リファレンス/WP Query」を参考にされるといろいろできるかもしれないです。

    • この返信は3 ヶ月、 2 週間前に  photographer hiro. さんが編集しました。理由: 誤記入の為

    sakamotosndさん、すいません。

    最初のコードで、
    'meta_value' => 'a' //例えば、営業マン'a'

    'a' //例
    この部分の空白を全角で入れてしまっていました。
    半角にするかとれば、エラーは出ないと思います。

    取り急ぎ……。

    @ioxrxogi さん
    全角の空白を半角にしたらそこのエラーが無くなりました。ありがとうございます。
    $star[] = get_field('uriage'); //カスタムフィールドを取得 ※数値型
    その後、ここでエラーが出ていたのですが、なんとか回避できました。

    そして、 @mura0403 さん、@ioxrxogi さん、
    お二人からのコードを基に、記述を足したり削ったりで合計金額が出せました!!!
    感激です;;

    <?php /*営業マンの売り上げを取得&計算*/
    	$args = array(
    		'numberposts' => '-1',
    		'post_type' => 'post', //投稿タイプの指定
    		'post_status' => 'all', //すべての投稿タイプ(なくてもいい)
    		'meta_key' => 'tantou', //営業マンのカスタムフィールド名
    		'meta_value' => 'a' //例えば、営業マン'a'
    	);
    	$customPosts = get_posts($args);
    
    	$goukei = '';
    	$kensuu = '';
    
    if($customPosts) :
    	foreach($customPosts as $post) :
    
    $uriage = post_custom("uriage");
    if($uriage): $uriage_a[] = $uriage; endif; 
    
    	$kensuu++; //対象記事の数だけ加算する
    	endforeach;
    
    if($uriage_a):
    $goukei = array_sum ( $uriage_a);
    endif;
    
    	echo '売上金額:';
    	echo $goukei; //計算した値を表示
    	echo '<br>売上件数:'; //対象記事の数
    	echo $kensuu;
    	echo '<br>平均売り上げ:';
    	echo round($goukei/$kensuu,1); //小数点第1位で四捨五入
    
    endif;
    wp_reset_postdata(); /*クエリのリセット*/ 
    ?>

    記述の順番とか滅茶苦茶かもしれません。恥ずかしいですがそのままコードを載せます。
    'meta_value' => 'a'をコメントアウトで全員の累計も出せました。
    なによりエラーが無く数値が出たことがとても嬉しいです。

    次は今月、先月、先々月などの期間を指定した表示方法を試してみます。

    • この返信は3 ヶ月、 2 週間前に  sakamotosnd さんが編集しました。
    • この返信は3 ヶ月、 2 週間前に  sakamotosnd さんが編集しました。

    sakamotosndさん
    今月でしたらこんな感じでしょうか。

    
    $today = getdate();
    $args = array(
    	'numberposts' => '-1',
    	'post_type'  => 'post',
    	'meta_key' => 'tantou', //営業マンのカスタムフィールド名
    	'meta_value' => 'a', //例えば、営業マン'a'
    	//'orderby'    => 'meta_value_num',
    	//'order'      => 'ASC',
    	'date_query' => array(
    		array(
    			'year'  => $today['year'],
    			'month' => $today['mon'],
    		),
    	),
    );
    
    

    @mura0403 さん

    ご返信遅くなりまして申し訳ございません。
    他業務が押してしまい、まだ自力ではなにも試せていない状況でした。。

    いただいたコードにて、今月分の売上合計が表示されました!
    今月分を$uriage_monとして、同一ページに「全体」と「今月」の売上合計を表示することが出来ました。

    未だ使用したことのないパラメータでしたので、WP版ウィキペディア的なものを見ながら勘でいろいろ記述してみましたが、先月分の表示までは行き着きませんでした。
    'month' => $today['mon'],'month' => $today['1 month ago'],としてみたり、-1をつけたり、beforeの行を追記してみたりしましたが、的外れだったようです。

    どのようにしたら先月分を出すことができますでしょうか。
    質問ばかりで申し訳ございません。
    宜しくお願い致します。

    sakamotosndさん

    「$today = getdate();」の部分を以下のように変更してみていだたけますでしょうか

    
    $timestamp = date('U', mktime(0, 0, 0, date('m') + 0, -1, date('Y')));//先月
    $last_month = getdate($timestamp );//ミリ秒で渡す
    
    
    
    $args = array(
    	'numberposts' => '-1',
    	'post_type'  => 'post',
    	'meta_key' => 'tantou', //営業マンのカスタムフィールド名
    	'meta_value' => 'a', //例えば、営業マン'a'
    	//'orderby'    => 'meta_value_num',
    	//'order'      => 'ASC',
    	'date_query' => array(
    		array(
    			'year'  => $last_month['year'],
    			'month' => $last_month['mon'],
    		),
    	),
    );
    

    配列しか確認していません、すみません。

    getdate

    sakamotosndさん

    「$timestamp」の部分で下の方がわかりやすいかもしれないです(未検証)

    
    $timestamp = date('U', strtotime('last Month', strtotime( date('U') )));
    
15件の返信を表示中 - 1 - 15件目 (全16件中)
  • このトピックに返信するにはログインが必要です。