welcartは、2.6, 2.7へのバージョンアップでデータ構造が変わりました。
特に2.7へのバージョンアップは、これまでのデータ構造を刷新する大変革です。
2.7へアップデートすると、データベースの更新が必要になります。
実際に更新してみると、エラーで上手くいかないことが何度もありました。
2.6へのアップデート時にエラーになったことはありません。
2.7へのアップデートはそれだけ処理する仕事量が多いのでしょう。
そこで、データベース更新の流れ・仕組みを理解するため、welcartのシステムファイルを読み解いて、メモしておきます。
データベース更新に関わる動きは、主に下記2ファイルに記されています。
- plugins/usc-e-shop/includes/database/db-update.php
- 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アクションフックのコールバックで実行されます。
各バージョンごとのデータベースの更新状況を確認し、その状況に応じて、下記の役割を果たします。
- バージョン2.7へのアップデートの場合、welcart規定のテーブルの有無を確認し、無ければ作成する。つまり、2.7から新登場の3テーブル usces_item, usces_skus, usces_opts のみが作成される(その他の規定のテーブル usces_order等は、既に存在するものが使われる)。
- 管理画面にデータベースの更新通知を表示するか否かを判断する。
- データベース更新の必要があれば、管理画面に更新通知を表示する関数を実行する。
- アップデートするバージョンごとに更新の際に実行する関数(データベース更新を行う関数)を設定する。
/**
* 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へのアップデートの際にデータベースを更新する関数です。
現在読解中。読み解き次第メモします。
コメントを残す