web-dev-qa-db-ja.com

データベースを変更するWordPressプラグインのアップデートを実装する方法

私はWordPressプラグインを開発しました。それはそれ自身のいくつかのデータベーステーブルを持っています。プラグインはこれらのテーブルをアクティブにすると作成し、削除またはアンインストールすると削除します。

プラグインのコードとテーブル構造を更新するプラグインの更新プロセスを実装する必要があります。最も簡単なケースは、テーブルの1つに新しい列を追加することです。もっと複雑な場合は、新しいテーブル構造を作成し、それに応じて内容を更新することです。

この問題をどのように解決することをお勧めしますか?役立つWordPressの組み込み関数はありますか?

9
Misha Moroshko

つまり、 - $wpdb クラスです。 詳細についてはCodexを参照してください

あなたがカスタムテーブル(あるいは実際には任意のテーブル)を操作するときはいつでも$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する必要があります(そうする前にそれらが存在することを確認してください)。

3
Stephen Harris

これを正しく行うには、スキーマをプラグインソース内のファイルとして含め、そのスキームを使用して必要に応じて組み込みの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はプラグインの更新時に常にアクティベーションフックを実行するわけではありません(特に、Dashboard Updatesページから一括更新が行われた場合)。

3
Brian C