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


10

独自のデータベーステーブルがいくつかあるWordPressプラグインを開発しています。プラグインは、アクティブ化されるとこれらのテーブルを作成し、削除/アンインストールされると削除します。

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

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

回答:


4

最近これを行う正しい方法は、スキーマをプラグインソースのファイルとして含め、組み込みの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はプラグインの更新時にアクティブ化フックを常に実行するとは限らないことにも注意してください(特に、ダッシュボードの更新ページから一括更新が行われる場合)。


最近、schema.sqlファイルのmod時間からDBのバージョンを取得し始めました。つまり、scheme.sqlファイルを更新するだけでデータベースをアップグレードできます。データベースのバージョンを編集することを覚えておく必要はありません。$ db_version = filemtime(“ schema.sql”);
ブライアンC

1
それで、ファイルの時間がサーバーの移動などの外部から変更された場合、mtimeとdbのバージョンが変更されますか?
Walf、

ファイルの時刻は常にGMTであり、サーバーが数秒異なることはめったにないので、それによって2回トリガーされることはほとんど不可能です。ただし、再度トリガーされた場合でも、一度実行されてライブDBと比較されるため、何も変更せずに害はありません。これはdbDelta()の美しいところです-問題なく複数回実行できます。良い質問、ありがとう。
ブライアンC

3

要するに、はい- $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するには、それらを明確に指定する必要があります(行う前にそれらが存在することを確認してください)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.