データベーステーブルの作成

プラグインがデータベーステーブルを自動的に作成するための最初のステップは、プラグイン内にテーブルをWordPress MySQL/MariaDBデータベースに追加するPHP関数を作成することです。本記事の目的のために、この関数をjal_installと呼ぶことにします。

データベーステーブルプレフィックス

wp-config.phpファイル内で、WordPressサイトの所有者はデータベーステーブルのプレフィックスを定義できます。デフォルトでは、プレフィックスは「wp_」ですが、実際の値を確認し、それを使用してデータベーステーブル名を定義する必要があります。この値は、$wpdb-
>prefix変数にあります。(WordPress 2.0より古いバージョンの開発を行っている場合は、$table_prefixグローバル変数を使用する必要がありますが、これはバージョン2.1で非推奨です)。

したがって、(prefix)liveshoutboxというテーブルを作成したい場合、テーブル作成関数の最初の数行は次のようになります:

  1. function jal_install () {
  2. global $wpdb;
  3. $table_name = $wpdb->prefix . "liveshoutbox";
  4. }

テーブルの作成または更新

次のステップは、実際にデータベーステーブルを作成することです。SQLクエリを直接実行するのではなく、wp-admin/includes/upgrade.phpのdbDelta関数を使用します(このファイルはデフォルトで読み込まれないため、読み込む必要があります)。dbDelta関数は、現在のテーブル構造を調べ、希望するテーブル構造と比較し、必要に応じてテーブルを追加または変更しますので、更新に非常に便利です(dbDeltaの使用方法の詳細については、wp-admin/upgrade-schema.phpを参照してください)。ただし、dbDelta関数はかなり厳密です。例えば:

  • SQL文の各フィールドは独自の行に置く必要があります。
  • PRIMARY KEYとプライマリキーの定義の間には2つのスペースが必要です。
  • 同義語INDEXではなく、KEYというキーワードを使用し、少なくとも1つのKEYを含める必要があります。
  • KEYの後には1つのスペース、その後にキー名、スペース、フィールド名を含む開き括弧、閉じ括弧が続く必要があります。
  • フィールド名の周りにアポストロフィやバックティックを使用してはいけません。
  • フィールドタイプはすべて小文字でなければなりません。
  • CREATE TABLEやUPDATEなどのSQLキーワードは大文字でなければなりません。
  • 長さパラメータを受け入れるすべてのフィールドの長さを指定する必要があります。例えば、int(11)です。

これらの注意点を考慮して、次の行は実際にテーブルを作成または更新する関数の一部です。$sql変数に自分のテーブル構造を代入する必要があります:

  1. global $wpdb;
  2. $charset_collate = $wpdb->get_charset_collate();
  3. $sql = "CREATE TABLE $table_name (
  4. id mediumint(9) NOT NULL AUTO_INCREMENT,
  5. time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  6. name tinytext NOT NULL,
  7. text text NOT NULL,
  8. url varchar(55) DEFAULT '' NOT NULL,
  9. PRIMARY KEY (id)
  10. ) $charset_collate;";
  11. require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
  12. dbDelta( $sql );

注意: 上記では、テーブルのデフォルトの文字セットと照合順序を設定しました。これを行わないと、一部の文字がテーブルに保存される際に?に変換される可能性があります。この例では、$wpdb-
>get_charset_collate()を使用して文字セットと照合順序を取得します。この関数はWordPress 3.5で導入され、以前のバージョンをサポートする必要がある場合は、charset/collate文字列を自分で作成する必要があります(その関数のソースをコピーすることができます)。

初期データの追加

最後に、作成したテーブルにデータを追加したい場合があります。以下はその方法の例です:

  1. $welcome_name = 'Mr. WordPress';
  2. $welcome_text = 'Congratulations, you just completed the installation!';
  3. $table_name = $wpdb->prefix . 'liveshoutbox';
  4. $wpdb->insert(
  5. $table_name,
  6. array(
  7. 'time' => current_time( 'mysql' ),
  8. 'name' => $welcome_name,
  9. 'text' => $welcome_text,
  10. )
  11. );

注意: WPDBの使用については、wpdbクラスを参照してください。 この場合、$wpdb-
>insertを使用しているため、データは自動的にエスケープされます。$wpdb-
>queryのような別のメソッドを使用する必要がある場合は、セキュリティ上の問題を防ぐために、クエリをデータベースに渡す前に$wpdb-
>prepare関数を通して変数を実行することをお勧めします。たとえこの関数内で$welcome_nameと$welcome_textを定義し、それらにSQLの特殊文字が含まれていないことを知っていても。

バージョンオプション

別の優れたアイデアは、データベーステーブル構造のバージョン番号を記録するオプションを追加することです。これにより、テーブルを更新する必要がある場合にその情報を後で使用できます:

  1. add_option( "jal_db_version", "1.0" );

全体の関数

この関数は完成しました。一つの部分としてすべてを見てみましょう。バージョン番号は現在、グローバル変数に保存されています。

  1. <?php
  2. global $jal_db_version;
  3. $jal_db_version = '1.0';
  4. function jal_install() {
  5. global $wpdb;
  6. global $jal_db_version;
  7. $table_name = $wpdb->prefix . 'liveshoutbox';
  8. $charset_collate = $wpdb->get_charset_collate();
  9. $sql = "CREATE TABLE $table_name (
  10. id mediumint(9) NOT NULL AUTO_INCREMENT,
  11. time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  12. name tinytext NOT NULL,
  13. text text NOT NULL,
  14. url varchar(55) DEFAULT '' NOT NULL,
  15. PRIMARY KEY (id)
  16. ) $charset_collate;";
  17. require_once ABSPATH . 'wp-admin/includes/upgrade.php';
  18. dbDelta( $sql );
  19. add_option( 'jal_db_version', $jal_db_version );
  20. }
  21. function jal_install_data() {
  22. global $wpdb;
  23. $welcome_name = 'Mr. WordPress';
  24. $welcome_text = 'Congratulations, you just completed the installation!';
  25. $table_name = $wpdb->prefix . 'liveshoutbox';
  26. $wpdb->insert(
  27. $table_name,
  28. array(
  29. 'time' => current_time( 'mysql' ),
  30. 'name' => $welcome_name,
  31. 'text' => $welcome_text,
  32. )
  33. );
  34. }

関数の呼び出し

初期化関数が定義されたので、WordPressがプラグインがWordPress管理者によってアクティブ化されたときにこの関数を呼び出すことを確認したいと思います。そのために、activate_アクションフックを使用します。プラグインファイルがwp-content/plugins/plugindir/pluginfile.phpの場合、プラグインの本体に次の行を追加します:

  1. register_activation_hook( __FILE__, 'jal_install' );
  2. register_activation_hook( __FILE__, 'jal_install_data' );

詳細については、Function_Reference/register_activation_hookを参照してください。

アップグレード関数の追加

プラグインのライフサイクルの中で、プラグインのデータベース構造をアップグレード版で変更する必要があることがわかるかもしれません。そのためには、新しいバージョンがインストールされたことを検出し、データベース構造をアップグレードするコードをプラグイン内に作成する必要があります。最も簡単な方法は、先ほど作成したjal_install関数にコードを追加することです。

したがって、上記の関数がプラグインのデータベースバージョン1.0を作成するために使用されたと仮定し、URLフィールドを広くするために(55文字ではなく100文字)バージョン1.1にアップグレードしているとします。必要な場合は、jal_install関数の最後に次の行を追加して、バージョンを確認し、必要に応じてアップグレードします:

  1. <?php
  2. global $wpdb;
  3. $installed_ver = get_option( "jal_db_version" );
  4. if ( $installed_ver != $jal_db_version ) {
  5. $table_name = $wpdb->prefix . 'liveshoutbox';
  6. $sql = "CREATE TABLE $table_name (
  7. id mediumint(9) NOT NULL AUTO_INCREMENT,
  8. time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  9. name tinytext NOT NULL,
  10. text text NOT NULL,
  11. url varchar(100) DEFAULT '' NOT NULL,
  12. PRIMARY KEY (id)
  13. );";
  14. require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
  15. dbDelta( $sql );
  16. update_option( "jal_db_version", $jal_db_version );
  17. }

また、ファイルの先頭でグローバル$jal_db_version変数を変更する必要があり、もちろん、上記で作成した初期化セクションを新しいテーブル構造を使用するように変更したいと思います。

3.1以降、register_activation_hook()で登録されたアクティベーション関数は、プラグインが更新されたときに呼び出されません。したがって、プラグインがアップグレードされた後に上記のコードを実行するには、別のフックでプラグインのデータベースバージョンを確認し、データベースバージョンが古い場合は関数を手動で呼び出す必要があります。次のように:

  1. function myplugin_update_db_check() {
  2. global $jal_db_version;
  3. if ( get_site_option( 'jal_db_version' ) != $jal_db_version ) {
  4. jal_install();
  5. }
  6. }
  7. add_action( 'plugins_loaded', 'myplugin_update_db_check' );

リソース

プラグイン開発に関するさらなる情報は、Plugin Handbookをチェックしてください。これはプラグインリソースの包括的なリストです。また、wp-hackers mailing listからのこの投稿も役立つかもしれません:WordPress Hackers Mailing List: Answer to Plugin Requires Additional Tables。また、Post meta vs separate database tablesも参照してください。