welcartのデータベース更新の流れ・仕組み

welcartは、2.6, 2.7へのバージョンアップでデータ構造が変わりました。
特に2.7へのバージョンアップは、これまでのデータ構造を刷新する大変革です。
2.7へアップデートすると、データベースの更新が必要になります。

実際に更新してみると、エラーで上手くいかないことが何度もありました。
2.6へのアップデート時にエラーになったことはありません。
2.7へのアップデートはそれだけ処理する仕事量が多いのでしょう。

そこで、データベース更新の流れ・仕組みを理解するため、welcartのシステムファイルを読み解いて、メモしておきます。

データベース更新に関わる動きは、主に下記2ファイルに記されています。

  1. plugins/usc-e-shop/includes/database/db-update.php
  2. plugins/usc-e-shop/includes/database/db-progress-screen.php

2番目のdb-progress-screen.phpは、更新の進捗状況を示すプログレスバーの画面表示に関するHTMLとJavaScript(jQuery)です。
したがって以下では、db-update.phpに記された関数を読み解いていきます。

wel_db_check

この関数は、welcartが読み込まれた後、plugins_loadedアクションフックのコールバックで実行されます。
各バージョンごとのデータベースの更新状況を確認し、その状況に応じて、下記の役割を果たします。

  1. バージョン2.7へのアップデートの場合、welcart規定のテーブルの有無を確認し、無ければ作成する。つまり、2.7から新登場の3テーブル usces_item, usces_skus, usces_opts のみが作成される(その他の規定のテーブル usces_order等は、既に存在するものが使われる)。
  2. 管理画面にデータベースの更新通知を表示するか否かを判断する。
  3. データベース更新の必要があれば、管理画面に更新通知を表示する関数を実行する。
  4. アップデートするバージョンごとに更新の際に実行する関数(データベース更新を行う関数)を設定する。
/**
 * Database check.
 *
 * Database update check for each version.
 *
 * @since 2.6
 */
function wel_db_check() {


	// 管理画面でないなら何もせず終了
	if ( ! is_admin() ) {
		return;
	}


	// usc_e_shopクラスのインスタンスをグローバル変数宣言
	global $usces;


	// optionテーブルからデータベースの更新状況(usces_db_version)を取得
	$update_history = get_option( 'usces_db_version' ); // version number => 更新状況(1 or 0) を要素とする配列

	// $update_history配列に指定するkey(version number)を初期化
	$action_status  = '';

	// 最初のインストール(true)か、既にitemがある更新(false)か の真偽値を取得
	$first_install  = wel_is_first_install();


	// welcartの現在versionが2.7以降の場合の処理
	if ( version_compare( WEL_CURRENT_VERSION, '2.7-beta', '>=' ) ) {

		// 検証のために更新状況の配列データのkeyを2.7に指定
		$action_status = '2.7';

		// welcart規定のテーブルの有無を確認して無ければ作成する
		//(通常はusces_item,usces_skus,usces_optsの2.7から登場の3テーブルのみ作成される)
		$usces->create_table();

		// 2.7versionの更新状況の値が設定されていない場合の処理
		// (つまり2.7にアップデート後、最初のplugins_loadedフックが実行される時)
		if ( ! isset( $update_history[ $action_status ] ) ) {

			// welcartの最初のインストールなら
			if ( $first_install ) {
				$update_history[ $action_status ] = 1;

			// 既にitemがある更新なら
			} else {
				$update_history[ $action_status ] = 0;
			}

			// optionテーブルのデータベース更新状況(usces_db_version)を、上記で設定された値に更新
			update_option( 'usces_db_version', $update_history );

		}

	};


	// welcartの現在versionが2.6以降の場合の処理
	if ( version_compare( WEL_CURRENT_VERSION, '2.6-beta', '>=' ) ) {
		$action_status = '2.6';
		if ( ! isset( $update_history[ $action_status ] ) ) {
			if ( $first_install ) {
				$update_history[ $action_status ] = 1;
			} else {
				$update_history[ $action_status ] = 0;
			}
			update_option( 'usces_db_version', $update_history );
		}
	};
	/*
	if ( version_compare( WEL_CURRENT_VERSION, '2.0-beta', '>=' ) ) {
		$action_status = '2.0';
		if ( ! isset( $update_history[ $action_status ] ) ) {
			$update_history[ $action_status ] = 0;
			update_option( 'usces_db_version', $update_history );
		}
	};
	*/


	// 更新状況の配列データから、「管理画面に更新通知を表示するか否か」、「更新の際に実行する関数名」を設定する
	$notice_flag = false; //管理画面に更新通知を表示するか否かのフラグ変数

	//更新状況の配列データをループして、実行する関数名とフラグ変数を設定する
	foreach ( $update_history as $v => $f ) { 

		// 実行する可変関数名を設定
		$function_name  = 'wel_update_db_';
		$function_name .= str_replace( '.', '_', $v ); // $v(version number)の小数点を_に置換した文字列を末尾に足す

		// 設定した関数が存在して、かつ、既にitemがある(データベース更新が必要)場合の処理
		if ( function_exists( $function_name ) && 0 === (int) $f ) {
			$notice_flag = true; // フラグ変数にtrueを設定
			break; //1つでも関数名とフラグ変数にtrueを設定したらループを終了
		}

	}


	// フラグ変数がtrueなら、admin_noticesフックで管理画面に更新通知を表示するコールバックwel_db_notice()関数を実行
	if ( $notice_flag ) {
		add_action( 'admin_notices', 'wel_db_notice' );
	}


}

wel_db_notice

wel_db_check関数の中で、admin_noticesフックのコールバックとして呼び出されて実行されます。
下記画像の更新通知を管理画面に表示する関数です。

wel_need_to_update_db

データベースを更新する必要があるかどうかを確認する関数です。
optionテーブルのデータベース更新状況(usces_db_version)を取得し(配列)、

その要素の値に0が含まれていればtrue(更新必要)を、0が無ければfalse(更新不要)を返します。

usc_e_shopクラスのadmin_top_pageメソッド内で使われている。

/**
 * Check if the database needs to be updated.
 *
 * @since 2.6
 * @return boolean Returns true if necessary.
 */
function wel_need_to_update_db() {
	$update_history = get_option( 'usces_db_version' );
	if ( in_array( 0, $update_history, true ) ) {
		return true;
	} else {
		return false;
	}
}

wel_db_update_ajax

ajax通信の際にwp_ajax_wel_db_update_ajaxアクションフックのコールバックで実行される関数です。
各バージョンごとのデータベース更新履歴を照会して、未更新の場合はデータベース更新用の関数を実行します。
更新の具体的な処理内容は、この関数内で実行されるデータベース更新用関数(wel_update_db_*)に定められています。

/**
 * Database update process.
 *
 * @since 2.6
 */
function wel_db_update_ajax() {

	// 定数USCES_DB_UP_INTERBALに10を設定
	define( 'USCES_DB_UP_INTERBAL', 10 ); // 定数名からはajax通信時のインターバル時間が想起されるが、使われている形跡は無い。

	// 各バージョンごとのデータベース更新履歴データを取得し、バージョンの若い順に並べ替える
	$update_history = get_option( 'usces_db_version' ); //optionテーブルのデータベース更新履歴データ(配列)を取得
	ksort( $update_history ); // 配列のkey(version number)で昇順に並べ替える

	// 更新履歴の配列をループして未更新のバージョンのデータベースを更新する
	foreach ( $update_history as $version => $flag ) {

		// 実行する関数名の接頭辞を設定
		$function_name = 'wel_update_db_';

		// flag変数が0(更新履歴なし)の場合の処理
		if ( 0 === $flag ) {

			// 関数名の末尾に、$version(version number)の小数点を_に置換した文字列を足す
			$function_name .= str_replace( '.', '_', $version );

			// 関数を実行する(データベースを更新)
			$function_name( $version );
			break; // どれか1つのバージョンでもデータベースを更新したらループを終了

		}

	}

}

wel_update_db_2_7

バージョン2.7へのアップデートの際にデータベースを更新する関数です。

現在読解中。読み解き次第メモします。


コメント

コメントを残す

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