WordPressのプラグイン用テーブルの追加

自作プラグインでテーブルを作成する必要があったのでメモ。
以下の二点がわかれば如何様にも作れる。

  • プラグインを有効化したときに処理を実行する方法
  • テーブルを作成する方法

プラグイン有効化時のフック処理

有効化時に実行する処理を関数として定義してregister_activation_hookで登録する。

function hoge_plugin_activate() {
  hoge_setup_table('hoges');
}
register_activation_hook(__FILE__, 'hoge_plugin_activate');

register_activation_hookの第一引数は関数が定義されているファイル。
同じファイルなので「__FILE__」でよい。別のファイルに切り出すならそのファイル名を指定する。

第二引数がフック処理を定義した関数名。
WordPress本体や他のプラグインが提供する関数とかぶらないような名前を付ける。

テーブル作成処理

テーブルの有無を確認してなければ作成するというのが一般的な処理。
別のテーブルを作るときでも使えるようにhoge_setup_table関数として切り出した。

function hoge_setup_table($table_name) {
  global $wpdb;
  if ($wpdb->get_var("show tables like'" . table_name_with_prefix($table_name) . "'") != table_name_with_prefix($table_name)) {
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    $sql_create_func = "sql_create_$table_name";
    $sql = $sql_create_func();
	add_option("hoges_version", '1.0');
    dbDelta($sql);
  }
}

$sql_create_funcはSQLを得るためのテーブル名に応じた関数。テーブル名から機械的に関数名を作る。
add_optionはプラグインを更新した際にテーブル構造が変わる可能性があるのでプラグインのバージョン番号を記録しておくのだそうだ。

プレフィックス付きのテーブル名を使う機会は作成時以外にもいろいろあるので、関数として定義。

function table_name_with_prefix($table_name) {
  global $wpdb;
  return $wpdb->prefix . $table_name;
}

SQLを返す関数は以下のように定義する。テーブル名がhogesなのでsql_create_hoges。

function sql_create_hoges() {
  return "CREATE TABLE " . table_name_with_prefix('hoges') . "(
    id int not null auto_increment,
    name varchar(255) not null,
    primary key(id)
  );";
}

dbDeltaの仕様的に「CREATE TABLE」は大文字でなくてはならない。なんかイマイチだけど仕方ない。

その他メモ

テーブル作成のデバッグ

SQLが間違っていてテーブルが作成されないことがあるが、エラーがあっても出力されないので、add_option又はupdate_optionによってSQLを記録してデバッグした。
なんかもっと他に良い方法があるかもしれないが・・・

削除時にテーブルを削除するか?

再び有効にすることも考えられるので、普通は削除しなくてもよいだろう。
削除したければregister_deactivation_hookを利用すればよい。

$wpdbやdbDeltaを使わなくてもいいのでは

まあ郷に入れば郷に従えということで。

参考