【この記事はWordPressプラグイン開発時の備忘録として書いています。マニアックな内容でスミマセン。】

今回、Throws SPAM Awayのバージョンアップ開発中にすでに作っていたテーブル構成を変更する必要が出てきました。

で、下記のような感じになるのかなぁ・・・と思ってました(この辺、いつも調べながらやってる感があります・・・)

※下記コードは動きません。悪い例です(笑)
[php]
// テーブル作成要フラグ
$flg = FALSE;
if($wpdb->get_var(“SHOW TABLES LIKE ‘$this->table_name'”) != $this->table_name) {
// テーブルが存在しないため作成する
$flg = TRUE;
}

//DBのバージョン
//$tsa_db_version
//現在のDBバージョン取得
$installed_ver = get_option( ‘tsa_meta_version’, 0 );
// DBバージョンが低い または テーブルが存在しない場合は作成
require_once( ABSPATH . ‘wp-admin/includes/upgrade.php’ );
if( $flg == TRUE || $installed_ver < $tsa_db_version ) { // CREATE TABLE は大文字で! $sql = "CREATE TABLE " . $this->table_name . ” (
meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
post_id bigint(20) UNSIGNED DEFAULT ‘0’ NOT NULL,
ip_address text,
post_date timestamp,
error_type text,
UNIQUE KEY meta_id (meta_id)
)
CHARACTER SET ‘utf8’;”;
dbDelta( $sql );
} elseif ( $installed_ver < $tsa_db_version ) { // 2.6でテーブル変更 // バージョン2.6よりスパムデータベースにエラータイプ追加 $sql = "ALTER TABLE ". $this->table_name . ” ADD error_type text AFTER post_date”;
dbDelta( $sql ); // TODO : ALTER TABLE でもdbDelta使えるの??
}
//オプションにDBバージョン保存
update_option( ‘tsa_meta_version’, $tsa_db_version );
[/php]

動きとしては・・・・
1.テーブルが無ければ作る!(CREATE TABLE)
2.ある場合はバージョンを見る!
3.バージョンが違っていたら現バージョンのテーブル構成に変更する(ALTER TABLE)

ということかなぁ・・・と思っていたのですが

ビックリ!

最終的に言いますと、テーブルの構成は CREATE文だけで良いのでした。

こんな感じ
[php]
// テーブル作成要フラグ
$flg = FALSE;
if($wpdb->get_var(“SHOW TABLES LIKE ‘$this->table_name'”) != $this->table_name) {
// テーブルが存在しないため作成する
$flg = TRUE;
}

//DBのバージョン
//$tsa_db_version
//現在のDBバージョン取得
$installed_ver = get_option( ‘tsa_meta_version’, 0 );
// DBバージョンが低い または テーブルが存在しない場合は作成
if( $flg == TRUE || $installed_ver < $tsa_db_version ) { // CREATE TABLE はくれぐれも大文字で! $sql = "CREATE TABLE " . $this->table_name . ” (
meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
post_id bigint(20) UNSIGNED DEFAULT ‘0’ NOT NULL,
ip_address text,
post_date timestamp,
error_type text,
UNIQUE KEY meta_id (meta_id)
)
CHARACTER SET ‘utf8’;”;
require_once( ABSPATH . ‘wp-admin/includes/upgrade.php’ );
dbDelta( $sql );
//オプションにDBバージョン保存
update_option( ‘tsa_meta_version’, $tsa_db_version );
}
[/php]
※Throws SPAM Awayの開発中のコードより引用

dbDeltaメソッドすげぇ!

ちなみにこのメソッドの説明にちゃんと書いてました・・・「初めから読めよ」というツッコミは非常に痛いのでご遠慮ください(笑)
—- 以下、引用 —-
出典:Creating Tables with Plugins - WordPress CODEX 日本語版

テーブルの作成または更新
次のステップでは、実際にテーブルを作成します。直接SQLクエリを実行するより、wp-admin/upgrade-functions.php(このファイルはデフォルトだと読み込まれないので、インクルードする必要があります)にあるdbDelta関数を使いましょう〔訳注:バージョン2.5以降ではwp-admin/include/upgrade.phpで定義されています〕。dbDelta関数は現在のテーブル構造を走査し、作成予定のテーブルと比較、必要に応じてテーブルを追加・修正します。更新にはとても便利な関数です(dbDeltaの使用例についてはwp-admin/upgrade-schema.phpを確認のこと〔訳注:このファイルはバージョン2.7に含まれません〕)。しかしながら、dbDelta関数はやや融通がききません。こんな風にです:
1行につき1つのフィールドを定義してください。 〔訳注:一つの行に複数のフィールド定義を書くことは出来ません。さもなくば ALTER TABLEが正しく実行されず、プラグインのバージョンアップに失敗します。 〕
PRIMARY KEYと主キーの定義の間には二つのスペースが必要です。〔訳注:原文 “You have to have two spaces between the words PRIMARY KEY and the definition of your primary key.”〕
INDEXという言葉ではなく、KEYという言葉を使う必要があります。
この忠告に従えって、関数に以下のような行を追加すれば、テーブルを自動生成・更新します。$sql変数にテーブル構造を代入してください。

加えてここ

アップグレード用関数を追加する

プラグインの寿命が尽きて、アップグレード版ではデータベース構造を変更する必要が出てくるかもしれません。そのためには、アップグレード用のコードをプラグインファイルに含め、それに新しいバージョンがインストールされたことを関知させ、データベース構造を更新させてなくてはいけません。一番簡単な方法は先ほど作ったjal_install関数にコードを追加することです。
この関数が呼び出しを受けることをしっかり把握しておく必要があります。したがってアップグレード時はプラグインのユーザに対して、プラグインの無効化、新しいプラグインファイルのアップロード、そしてプラグインの再有効化という手順を踏むよう教える必要があります。
さて、上記の関数はあなたのプラグイン・バージョン1.0用のテーブルを作成するために使われたといましょう。いまやバージョン1.1にアップグレードし、URLフィールドは大きくなっています(55文字から100文字へ)。jal_install関数の最後に以下の行を加えて、バージョンチェックをし、必要ならばアップグレードしましょう:

テーブル構成のCREATE文を用意すればアップグレード時に自動更新なんてすごすぎるぅう!

参考になれば幸いです。

この記事が気に入ったら
いいね ! しよう

Twitter で