【WordPress プラグイン自作】独自テーブルを作る

  • 投稿 : 2017-02-25
プラグインでデータベーステーブルを作る - WordPress Codex 日本語版
Creating Tables with Plugins « WordPress Codex

Wordpressの標準のテーブル(DB)でなくて、独自のテーブルを使いたい時があるかと思います。その場合は、上記の2つを参考にすれば、結構簡単に使えます。今回は、独自テーブルを作成するところまでです。

※Wordpress 4.7.2–jaで確認しました

テーブル名を決める

例:wp_sample_table

こんな感じのテーブルを今回使いたいということにします。「wp_」の部分は、Wordpressの場合は変更が可能なので決めうちで作成するわけにはいきません。

 global $wpdb;
 $table_name = $wpdb->prefix . "sample_table"; 

テーブル名は、「$wpdb->prefix」というプレフィックスが入っている変数を使って作成すればOKです。

テーブルを作成する

wp_optionsと似た構造のテーブルを作成する例です。

global $wpdb;
$table_name = $wpdb->prefix . "sample_table"; 

$charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE $table_name (
  id bigint(20) unsigned NOT NULL auto_increment,
  name varchar(191) NOT NULL default '',
  value longtext NOT NULL,
  PRIMARY KEY  (id),
  UNIQUE KEY name (name)
) $charset_collate;";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

テーブルを作成するPHPコードは上記のようになります。dbDeltaがやってくれます。

DDL の違いを自動的に見て対応してくれるために、その SQL はルールに従って書く必要がある。 http://codex.wordpress.org/Creating_Tables_with_Plugins によれば、以下の決まりがある。

・それぞれのフィールドはSQLの別々の行に書くこと
・PRIMARY KEY という文字列と、主キーの定義の間はスペース2つ分空けること
・キーワードKEYを使うこと。同義語のINDEXは使えない。少なくとも1つのキーを含めること
・アポストロフィーやバックティック('や`)でフィールド名を囲まないこと
・それだけではない。上記に加えて、SQL のキーワードは大文字で書かなくてはいけない。

ダメだった例 create table wp_xxx ( id bigint not null auto_increment, token
WordPress の dbDelta() でテーブルが作成されない

今のWordpressもルールが残ったままなのかちょっと不明ですが、CREATE TABLEは気を付けて作成した方がよさそうです。

標準のテーブルは「wp-admin\includes\schema.php」の中で定義されているので、似たようなテーブルの場合は、参考にすればよいと思います。テータ型が一緒とかそういう場合は、そのままコピペして使うのがいろいろ考えなくてよい方法だと思います。

サンプルプラグイン

<?php
/*
Plugin Name: sample
Plugin URI: http://example.com/
Description: sample
Version: 1.0
Author: Test
Author URI: http://example.com/
*/
//----------------------------------
// プラグイン本体
//----------------------------------
class My_Samplex{
    function __construct() {
        register_activation_hook( __FILE__, array($this, 'activation') );
        register_deactivation_hook( __FILE__, array($this, 'deactivation') );
        register_uninstall_hook( __FILE__, array('My_Samplex::uninstall') );
    }
 
    public function activation(){
        //有効時の処理
        global $wpdb;
        $table_name = $wpdb->prefix . "sample_table"; 

        $charset_collate = $wpdb->get_charset_collate();

        $sql = "CREATE TABLE $table_name (
          id bigint(20) unsigned NOT NULL auto_increment,
          name varchar(191) NOT NULL default '',
          value longtext NOT NULL,
          PRIMARY KEY  (id),
          UNIQUE KEY name (name)
        ) $charset_collate;";

        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );

    }
 
    public function deactivation(){
        //停止時の処理
    }
 
    public static function uninstall(){
        //アンインストール
    }
}
$my_samplex = new My_Samplex();

独自テーブルはプラグインとかで使う場合が多いと思うので、そのときの実装方法です。
プラグイン有効時に、呼び出してあげれば、テーブルがなければ作成されるかと思います。

■ dbDelta()関数の動作
・テーブルがなければ、新規に作成する
・テーブルが既にあり、定義に変化なければ、なにもしない?
・テーブル構造に変化があれば、データを保持したまま?アップグレードする?

ちょっとどういう動作をするか私にはわからないので、実際に使うときはもっと厳密なコードを書いたほうが良いかも。

その他

プラグインデータベースを更新するのにdbDelta()を使用: コツコツ学ぶWordPress、技術メモ

wp_optionテーブルに、独自テーブルのバージョンを書いておくとかいうのは、プラグインのソースをみてると使われてることが多い手法です。

スポンサーリンク