回答:
最近これを行う正しい方法は、スキーマをプラグインソースのファイルとして含め、組み込みのWordPress関数dbDelta()を使用して、そのスキームを使用して必要に応じてデータベースを更新することです。実際に必要なコードは非常に簡単です。
$sql = file_get_contents( plugin_dir_path(__FILE__) . "/schema.sql" );
dbDelta( $sql );
これにより、必要に応じてデータベースが作成および更新されます。私が最後にチェックしたとき、それは古い未使用の列を削除しなかったので、バージョンチェックを介してそのためにコーディングする必要があります。これはWordPressの美しい機能であり、時間の節約にもなります。schema.sqlファイルを作成するときは、dbDelta()コードが間隔について非常に煩雑であると言われているように、mysqlスキーマエクスポートで間隔をコピーすることに注意してください。データベースのバージョンもテストする必要があります。最新でない場合は、上記を呼び出してデータベースを更新してください。dbDelta()が正しくない変更(列の削除など)に対応するために、特定の更新を行う必要がある場合もあります。バージョンが更新されたかどうかを確認する単純な論理ifテストを記述し、$ wpdbを介してこれらの手動更新を行うのは簡単です。たとえば、現在使用されていない列を削除するとします。
$installed_ver = get_option(MY_DB_VERSION);
$wpp = $wpdb->prefix . "mypluginname";
if ($installed_ver < 102)
$wpdb->query("ALTER TABLE ${wpp}_movies DROP nft_date");
if ($installed_ver < 107)
$wpdb->query("ALTER TABLE ${wpp}_movies CHANGE lastupdated "
. "lastupdated TIMESTAMP on update CURRENT_TIMESTAMP "
. "NOT NULL DEFAULT CURRENT_TIMESTAMP");
update_option(MY_DB_VERSION, $db_version);
これはコードの実行から簡略化されています。公開のために簡略化する過程でそれを壊してしまった場合はお詫びします。
また、WordPress 3.9.2以降、WordPressはプラグインの更新時にアクティブ化フックを常に実行するとは限らないことにも注意してください(特に、ダッシュボードの更新ページから一括更新が行われる場合)。
要するに、はい- $wpdb
クラス。詳細については、コーデックスを参照してください。
カスタムテーブル(または実際には任意のテーブル)とやり取りするときは常に、調査$wpdb
する必要があります。特に、prepare
クエリのエスケープとインジェクションの防止に役立つメソッドに精通していることを確認してください。
これを使用してテーブルを作成する必要があるので、すでに精通している必要があります。あなたのインストールフックには次のようなものが必要です:
$charset_collate = '';
if ( ! empty($wpdb->charset) )
$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty($wpdb->collate) )
$charset_collate .= " COLLATE $wpdb->collate";
//Create custom table
$sql_custom_table ="CREATE TABLE {$wpdb->prefix}my_table (
id bigint(20) unsigned NOT NULL auto_increment,
column_a varchar(255) default NULL,
column_b varchar(255) default NULL,
PRIMARY KEY (id)
) $charset_collate; ";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_custom_table);
このコードは、プラグインがアクティブ化されたとき(つまり、インストールされていないとき)に実際に実行されます。そのため、誰かがプラグインを自動的に更新したときに実行されます。注:プラグインを手動で交換してアップグレードした場合-アップグレードされません- admin_init
プラグインがアップグレードされたときに上記のコードをトリガーする必要があります(オプションテーブルにバージョン番号を保存し、現在のバージョンを確認してください) 。
これで、通常CREATE TABLE
はプラグインを更新するたびにSQLコマンドを実行したくありませんdBDelta()
。
上記のコマンドを実行する前に、テーブルが存在するかどうかを確認します。さらに、列タイプをチェックします。したがって、テーブルが存在しない場合は作成されますが、一部の列タイプが変更された場合はテーブルが更新され、列が存在しない場合は追加されます。
残念ながら、上記から列を削除しても、列は自動的には削除されません。列/テーブルを削除DROP
するには、それらを明確に指定する必要があります(行う前にそれらが存在することを確認してください)。