welcart受注リスト 一括操作で状態を変更する関数を読解

welcartの受注リストでは、一括操作によるstatus(管理状態)の変更・更新ができる。
それを担う関数 usces_all_change_order_status の処理内容等のメモ。

file : plugins/usc-e-shop/functions/function.php
@param WlcOrderListオブジェクト plugins/usc-e-shop/classes/orderList2.class.php

利用できるフック

default:
		$query = apply_filters( 'usces_filter_collective_order_status_query', $query, $statusstr, $id );

welcartが用意したstatus(管理状態)に該当しない場合の更新用query文を作成する。
独自のstatus(管理状態)を作っている場合、「ここで更新用query文作れ」ということか。

if ( $status ) {
		do_action('usces_action_collective_order_status_each', $id, $statusstr, $old_status);
}

かなり使えそうなフック。status(管理状態)の更新が成功した後に付け足して何かをする。

  • 「発送済み」に変更した後、ついでに発送完了メールも送信する
  • 「入金済み」に変更した後、ついでに入金確認メールを送信&領収書印刷する

他にもネットショップの仕事を効率化するためのイロんなことができそう。

do_action('usces_action_collective_order_status', array(&$obj));

完了メッセージをカスタマイズすることを想定? まだよく分からない。

完了後のメッセージ

一括操作完了後、メッセージが表示される。
最後の注文番号のstatusが正常に変更・更新できた場合、「一括操作が完了しました。」
最後の注文番号のstatusが変更・更新できなかった場合、「エラー:処理を正常に完了できませんでした。」

最後のデータの更新結果がtrueかfalseかのみを判断して表示メッセージを変えている。

function usces_all_change_order_status( &$obj ) {
	global $wpdb, $usces;

	$tableName = $wpdb->prefix . "usces_order"; //変更した値を保存するテーブル名
	$ids = $_POST['listcheck']; //(受注リスト上で)チェックされた注文番号の配列

	//チェックされた注文番号をループして1件ずつ処理していく
	foreach ( (array)$ids as $id ):

		$status = true; //データベースの更新結果を表す変数(デフォルトでtrueにしておく)

		//ループ中の注文番号のusces_orderテーブルに保存されているデータを連想配列で取得
		$query = $wpdb->prepare("SELECT order_status, mem_id, order_getpoint, order_usedpoint, order_payment_name FROM $tableName WHERE ID = %d", $id);
		$order_res = $wpdb->get_row( $query, ARRAY_A );

		//取得した連想配列から変数を定義
		$statusstr = $order_res['order_status']; //現在の管理状態(対応状況)
		$restore_point = false; //
		$getpoint = $order_res['order_getpoint']; //獲得ポイント
		$usedpoint = $order_res['order_usedpoint']; //使用ポイント
		$old_status = $statusstr; //現在の管理状態を保存しておく

		//更新後の管理状態を変数に定義(何に変更するのか)
		if ( isset($_REQUEST['change']['word']) && !is_array($_REQUEST['change']['word']) ) {
			$change_word = $_REQUEST['change']['word'];
		} elseif ( isset($_REQUEST['change']['word']['order_reciept']) ) {
			$change_word = $_REQUEST['change']['word']['order_reciept'];
		} elseif ( isset($_REQUEST['change']['word']['order_status']) ) {
			$change_word = $_REQUEST['change']['word']['order_status'];
		} else {
			$change_word = '';
		}

		//更新後の管理状態ごとにデータベースを更新するためのquery文を作成
		$query = '';
		switch ( $change_word ) {

			//更新後に「見積り」にする場合
			case 'estimate':
				if(strpos($statusstr, 'adminorder') !== false) {
					$statusstr = str_replace('adminorder', 'estimate', $statusstr);
				}else if(strpos($statusstr, 'estimate') === false) {
					if( ',' !== substr( $statusstr, -1 ) ) $statusstr .= ',';
					$statusstr .= 'estimate,';
				}
				if( strpos($statusstr, 'cancel') === false ){
					if( usces_is_complete_settlement( $order_res['order_payment_name'], $order_res['order_status'] ) ) {
						$restore_point = true;
						$usedpoint = $usedpoint * -1;//add point
					} elseif( $usces->is_status('receipted', $order_res['order_status']) ) {
						$restore_point = true;
						$usedpoint = $usedpoint * -1;//add point
					}
				}
				$query = $wpdb->prepare("UPDATE $tableName SET order_status = %s WHERE ID = %d", $statusstr, $id);
				break;

			//更新後に「管理受注」にする場合
			case 'adminorder':
				if( strpos($statusstr, 'estimate') !== false ) {
					$statusstr = str_replace('estimate', 'adminorder', $statusstr);
					if( strpos($statusstr, 'cancel') === false ){
						if( usces_is_complete_settlement( $order_res['order_payment_name'], $order_res['order_status'] ) ) {
							$restore_point = true;
							$usedpoint = $usedpoint * -1;//add point
						} elseif( $usces->is_status('receipted', $order_res['order_status']) ) {
							$restore_point = true;
							$usedpoint = $usedpoint * -1;//add point
						}
					}
				}else if(strpos($statusstr, 'adminorder') === false) {
					if( ',' !== substr( $statusstr, -1 ) ) $statusstr .= ',';
					$statusstr .= 'adminorder,';
				}
				$query = $wpdb->prepare("UPDATE $tableName SET order_status = %s WHERE ID = %d", $statusstr, $id);
				break;

			//更新後に「受注」にする場合
			case 'frontorder':
				if(strpos($statusstr, 'estimate') !== false) {
					$statusstr = str_replace('estimate,', '', $statusstr);
					$statusstr = trim($statusstr, ',');
					if( strpos($statusstr, 'cancel') === false ){
						if( usces_is_complete_settlement( $order_res['order_payment_name'], $order_res['order_status'] ) ) {
							$restore_point = true;
							$usedpoint = $usedpoint * -1;//add point
						} elseif( $usces->is_status('receipted', $order_res['order_status']) ) {
							$restore_point = true;
							$usedpoint = $usedpoint * -1;//add point
						}
					}
				}else if(strpos($statusstr, 'adminorder') !== false) {
					$statusstr = str_replace('adminorder,', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				$query = $wpdb->prepare("UPDATE $tableName SET order_status = %s WHERE ID = %d", $statusstr, $id);
				break;

			//更新後に「取り寄せ中」にする場合
			case 'duringorder':
				if( strpos($statusstr, 'cancel') !== false ) {
					$statusstr = str_replace('cancel', '', $statusstr);
					$statusstr = trim($statusstr, ',');
					if( strpos($statusstr, 'estimate') === false ){
						if( usces_is_complete_settlement( $order_res['order_payment_name'], $order_res['order_status'] ) ) {
							$restore_point = true;
							$getpoint = $getpoint * -1;//add point
						} elseif( $usces->is_status('receipted', $order_res['order_status']) ) {
							$restore_point = true;
							$getpoint = $getpoint * -1;//add point
						}
					}
				}
				if(strpos($statusstr, 'completion') !== false) {
					$statusstr = str_replace('completion', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'new') !== false) {
					$statusstr = str_replace('new', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'duringorder') === false) {
					if( ',' !== substr( $statusstr, -1 ) ) $statusstr .= ',';
					$statusstr .= 'duringorder,';
				}
				$query = $wpdb->prepare("UPDATE $tableName SET order_status = %s WHERE ID = %d", $statusstr, $id);
				break;

			//更新後に「キャンセル」にする場合
			case 'cancel':
				if(strpos($statusstr, 'completion') !== false) {
					$statusstr = str_replace('completion', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'new') !== false) {
					$statusstr = str_replace('new', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'duringorder') !== false) {
					$statusstr = str_replace('duringorder', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'cancel') === false) {
					if( ',' !== substr( $statusstr, -1 ) ) $statusstr .= ',';
					$statusstr .= 'cancel,';
				}
				if( strpos($statusstr, 'estimate') === false ){
					if( usces_is_complete_settlement( $order_res['order_payment_name'], $order_res['order_status'] ) ) {
						$restore_point = true;
						$usedpoint = $usedpoint * -1;//add point
					} elseif( $usces->is_status('receipted', $order_res['order_status']) ) {
						$restore_point = true;
						$usedpoint = $usedpoint * -1;//add point
					}
				}
				$query = $wpdb->prepare("UPDATE $tableName SET order_status = %s WHERE ID = %d", $statusstr, $id);
				break;

			//更新後に「発送済み」にする場合
			case 'completion':
				if(strpos($statusstr, 'new') !== false) {
					$statusstr = str_replace('new', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'duringorder') !== false) {
					$statusstr = str_replace('duringorder', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'cancel') !== false) {
					$statusstr = str_replace('cancel', '', $statusstr);
					$statusstr = trim($statusstr, ',');
					if( strpos($statusstr, 'estimate') === false ){
						if( usces_is_complete_settlement( $order_res['order_payment_name'], $order_res['order_status'] ) ) {
							$restore_point = true;
							$getpoint = $getpoint * -1;//add point
						} elseif( $usces->is_status('receipted', $order_res['order_status']) ) {
							$restore_point = true;
							$getpoint = $getpoint * -1;//add point
						}
					}
				}else if(strpos($statusstr, 'completion') === false) {
					if( ',' !== substr( $statusstr, -1 ) ) $statusstr .= ',';
					$statusstr .= 'completion,';
				}
				$query = $wpdb->prepare("UPDATE $tableName SET order_status = %s, order_modified = %s WHERE ID = %d", $statusstr, substr(current_time('mysql'), 0, 10), $id);
				break;

			//更新後に「新規受付」にする場合
			case 'new':
			case 'neworder':
				if(strpos($statusstr, 'duringorder') !== false) {
					$statusstr = str_replace('duringorder,', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'completion') !== false) {
					$statusstr = str_replace('completion,', '', $statusstr);
					$statusstr = trim($statusstr, ',');
				}
				if(strpos($statusstr, 'cancel') !== false) {
					$statusstr = str_replace('cancel,', '', $statusstr);
					$statusstr = trim($statusstr, ',');
					if( strpos($statusstr, 'estimate') === false ){
						if( usces_is_complete_settlement( $order_res['order_payment_name'], $order_res['order_status'] ) ) {
							$restore_point = true;
							$getpoint = $getpoint * -1;//add point
						} elseif( $usces->is_status('receipted', $order_res['order_status']) ) {
							$restore_point = true;
							$getpoint = $getpoint * -1;//add point
						}
					}
				}
				$query = $wpdb->prepare("UPDATE $tableName SET order_status = %s WHERE ID = %d", $statusstr, $id);
				break;

			default:
				$query = apply_filters( 'usces_filter_collective_order_status_query', $query, $statusstr, $id );

		} //end switch ( $change_word )

		//更新用のquery文を実行してデータを更新
		if ( !empty ( $query ) ) { //更新用のquery文があれば

			$res = $wpdb->query( $query ); //実行してデータを更新する
			if ( $res === false ) { //更新できなかったら
				$status = false; //更新結果をfalseにする
			}

			//会員制でポイント制を使っている場合の処理
			if ( 'activate' == $usces->options['membersystem_state'] && 'activate' == $usces->options['membersystem_point'] ) {
				if ( !empty($order_res['mem_id']) && ( 0 < $order_res['order_getpoint'] || 0 < $order_res['order_usedpoint'] ) ) {
					if( $res && $restore_point ) usces_restore_point( $order_res['mem_id'], $getpoint + $usedpoint );
				}
			}

			if ( $status ) {
				do_action('usces_action_collective_order_status_each', $id, $statusstr, $old_status);
			}

		} //end if ( !empty ( $query ) )

	endforeach;

	//すべての注文番号の処理を終えた後に画面に表示するメッセージを設定
	if ( true === $status ) { //ループの一番最後の注文番号の更新結果がtrueなら
		$obj->set_action_status('success', __('I completed collective operation.','usces')); //一括操作が完了しました。
	} elseif ( false === $status ) { //ループの一番最後の注文番号の更新結果がfalseなら
		$obj->set_action_status('error', __('ERROR: I was not able to complete collective operation','usces')); //エラー:処理を正常に完了できませんでした。
	} else {
		$obj->set_action_status('none', '');
	}
	do_action('usces_action_collective_order_status', array(&$obj));

}


コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です