WordPressのプラグインでテーブルを追加するお作法。

本日アップデートしたTInyMCE Templatesプラグインでは、テンプレートを保存するためのテーブルを作成しています。

WordPressプラグインでこのテーブルを作るにはWordPress流のやり方があります。

Creating Tables with Plugins – WordPress Codex 日本語版

プラグインを有効化するときと停止するときのアクションフック

他のフックとは違い専用の関数が用意されています。

有効化するときのフック用関数

register_activation_hook(__FILE__, 'function');

停止するときのフック用関数

register_deactivation_hook(__FILE__, 'function');

__FILE__の部分はプラグインのファイル名が入りますので、プラグインからrequireされているファイルにこの記述を入れるときは書き換える必要があります。

functionの部分は有効化及び停止するときに実行するべき関数名を指定します。

多くの場合、この関数内ではSQLが実行されたりディレクトリやファイルを作成したり、停止するときには削除することもあると思います。

テーブルを作成するSQLは dbDelta() 関数で実行する!

通常WordPressでは、SQL文の実行には$wpdbオブジェクトのquery()メソッドなどを利用しますが、プラグイン用のテーブルを作成する際には dbDelta() 関数を利用することが推奨されています。

マニュアルによると、この dbDelta() 関数は、CREATE TABLE 文を解析し単にテーブルを作成するだけでなく、構造が変わっている場合に更新する機能もあるそうです。

なんと便利な!

使い方は以下のような感じです。

register_activation_hook(__FILE__, 'my_activation');

function my_activation(){
    global $wpdb;
    $table = $wpdb->prefix.'mytable';
    if ($wpdb->get_var("show tables like '$table'") != $table) {
        $sql = "CREATE TABLE  {$table} (....)";
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
}

上記の例では、if の条件分岐でテーブルの有無を判別し、upgrade.phpをrequireした後で dbDelta() 関数でSQLを実行しています。

実はめんどくさがりな私はここで勝手な独自解釈を行い「構造を確認して更新してくれるならifはいらないんじゃないの?」と考えていました。

しかし、WordPressをデバッグモードにすると、プラグインを有効化する際に、テーブルの構造が変わらない場合はnoticeを出力してしまいますので、別途バージョンを確認して SQL を発行する条件分岐が必要なようです。

このバージョンに関する処理については、先に紹介したリンク先の下の方に解説されていますので、マニュアルは最後まで良く読みましょう。^^;