WordPressでデータベースにテーブルを作成する機会があり、沼にハマってなかなか抜け出せなかったので、残しておきます。
結論 $wpdbを使ってテーブルを作る
まずは、結論のコードから
global $wpdb;
// dbDeltaの利用の為、読み込み
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
// データベーステーブル名を指定
$table_name = $wpdb->prefix . 'table-name';
// 文字コード取得
$charset_collate = $wpdb->get_charset_collate();
// CREATE文
$create_table = "CREATE TABLE $table_name(
ID bigint(20) unsigned NOT NULL auto_increment,
created_at datetime NOT NULL default '0000-00-00 00:00:00',
updated_at datetime NOT NULL default '0000-00-00 00:00:00',
name text,
email text,
subject text,
content longtext,
PRIMARY KEY (ID)
) $charset_collate;\n";
// テーブル作成
$create_retrun = dbDelta( $create_table );
テーブルの存在確認をするなら(こっちの方がおすすめ)
global $wpdb;
// dbDeltaの利用の為、読み込み
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
// データベーステーブル名を指定
$table_name = $wpdb->prefix . 'table-name';
// 文字コード取得
$charset_collate = $wpdb->get_charset_collate();
// CREATE文
$create_table = "CREATE TABLE $table_name(
ID bigint(20) unsigned NOT NULL auto_increment,
created_at datetime NOT NULL default '0000-00-00 00:00:00',
updated_at datetime NOT NULL default '0000-00-00 00:00:00',
name text,
email text,
subject text,
content longtext,
PRIMARY KEY (ID)
) $charset_collate;\n";
if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) !== $table_name ) {
echo 'データベースのテーブルが存在しない';
$create_retrun = dbDelta( $create_table );
} else {
echo 'データベースのテーブルが存在';
}
これで上手くいきました。
ポイント
global $wpdb;
で、$wpdb
を使えるようにします。
データベースのテーブルを作成するときに使うdbDelta
は、ファイルを呼び出す必要があります。
CREATE文を作成するときは、wp-admin/includes/schema.php を参考にしましょう。
テーブルがあるのにdbDeltaを使ったらどうなる?
下記のようなエラーが出力されて、新たなテーブルは作成されません。
WordPress データベースエラー: [Table 'wp_*********' already exists]