独自ログイン・ユーザー管理プラグイン~(1)データベースにユーザーテーブルを追加
これから、独自ログイン・ユーザー管理用のプラグインを作成していきたいと思います。独自ログイン・ユーザー管理というのは考えてみるとかなり幅が広い機能ですが、コツコツとやっていきましょう。
WordPressにおけるテーブルの新規追加・更新の方法
WordPressプラグインでこのテーブルを作るにはWordPress流のやり方があります。
WordPress では、直接SQLを操作するのではなく、wp-admin/includes/upgrade.php にある dbDelta 関数を使うようにします。(使う直前に、wp-admin/includes/upgrade.phpファイルをincludeすること!)
dbDelta関数は指定のフォーマットでテーブルに関する情報を書くことで、現在のテーブル構造を走査し、作成予定のテーブル構造と比較します。そして、必要に応じてテーブルを追加・変更してくれるので、更新にはとても便利な関数です。
つまり、テーブルの構造をちょっとだけ変えようとするときに、ALTER TABLEなどのSQL文をいちいち書かなくて良いという事です。
ただしそのためには、以下のようなフォーマットでdbDelta関数に引数を渡す必要があります。
- 1 行につき、ひとつのフィールドを定義してください。〔訳注:ひとつの行に複数のフィールド定義を書くことはできません。さもなくば ALTER TABLE が正しく実行されず、プラグインのバージョンアップに失敗します。〕
- PRIMARY KEY というキーワードと、主キーの定義の間には、二つのスペースが必要です。
- INDEX という同義語ではなく、KEY というキーワードを使う必要があります。さらに最低ひとつの KEY を含めなければなりません。
- フィールド名のまわりにアポストロフィ(')やバッククォート(`)を使ってはいけません。
- フィールドタイプはすべて小文字であること。
- SQL キーワード、例えば CREATE TABLE や UPDATE は、大文字であること。
- 長さパラメータを受け付けるすべてのフィールドに長さを指定すること。例えば int(11) のように。
それではこれを使って、独自ユーザーテーブルwpmop_usersテーブルを作成する関数をかいてみます。
function table_create(){
global $wpdb;
$table_name = $wpdb->prefix . 'wpmop_users';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_login varchar(60) NOT NULL,
user_pass varchar(255) NOT NULL,
user_nicename varchar(50) NOT NULL,
user_email varchar(100) NOT NULL,
user_registrated datetime DERAULT '0000-00-00 00:00:00' NOT NULL,
user_activation_key varchar(255) NOT NULL,
user_status int(11) DEFAULT '0' NOT NULL,
display_name varchar(250) NOT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
プラグインをアップデートする際に、このテーブルを変更する場合には、この関数の$sqlを書き換えて実行させれば、WordPressが自動的に既存のテーブルとの比較の上、テーブルを更新してくれます。もちろんデータもそのままです。
例:user_urlという項目を追加する。
function table_create(){
global $wpdb;
$table_name = $wpdb->prefix . 'wpmop_users';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_login varchar(60) NOT NULL,
user_pass varchar(255) NOT NULL,
user_nicename varchar(50) NOT NULL,
user_email varchar(100) NOT NULL,
user_url varchar(100) NOT NULL, //新しく追加する項目を加える。
user_registrated datetime DERAULT '0000-00-00 00:00:00' NOT NULL,
user_activation_key varchar(255) NOT NULL,
user_status int(11) DEFAULT '0' NOT NULL,
display_name varchar(250) NOT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
プラグインインストール・アップデート時におけるテーブルの追加・更新の方法
次に、上記table_create関数をプラグインインストール・アップデート時に実行させる方法について見て見ます。
考え方としては、
プラグイン本体が書き込まれているWPMOPクラスをインスタンス化させるとき(WPMOPクラスのコンストラクタ)に、定義しておいたデータベースのバージョン、プラグインのバージョンを調べて、更新されていたらtable_create関数を実行させる
事も出来ますが、WordPressでは、
・プラグイン有効化するときのフック用関数:register_activation_hook(“プラグインファイル名", “コールバック関数名");
・停止するときのフック用関数:register_deactivation_hook(“プラグインファイル名", “コールバック関数名");
という専用フックがあるのでそれを利用し、コールバック関数内でプラグインやデータベースのバージョンの比較などを行いたいと思います。
第一引数の「プラグインファイル名」とは、今作成中のプラグインでは「my-original-plugin.php」のことです。my-original-plugin.php以外のファイルで使用する場合には、プラグインファイル名を入れてください。
以上の内容を基に、実際にmy-original-plugin.phpファイルに追記していきましょう。
ファイル構造
my-original-plugin.phpファイル
ここでは、テーブルのバージョンやテーブル名の定義、プラグインのアクティベーションやアップデートの際に行う関数の定義などを追記します。
ここで、先ほど、プラグイン有効化するときのフック用関数:register_activation_hookの話をしましたがこの関数は、プラグインの「アップデート」時には実行されません。よって、別途’plugins_loadedアクションを利用して、アップデート時にも対応するように設定します。
<?php
/*
Plugin Name: My Original Plugin Plugin
URI: Description: This Plugin id developed for My Original Plugin
Version: 0.0.1
Author: webmaster@GRITT.JP
Text Domain: mop
*/
//↓↓↓↓↓新規追加ここから
//$wpdb->prefixを使用するので。
global $wpdb;
//timezoneの設定を Asia/Tokyoに強制的に変更
date_default_timezone_set('Asia/Tokyo');
//↑↑↑↑↑新規追加ここまで
//以下、プラグイン内でよく使うと思われる定数の定義
define( 'WPMOP_VER', '0.0.1' );
//↓↓↓↓↓新規追加ここから
//データベースバージョンの定義
define('WPMOP_DB_VER', '0.0.1');
//独自テーブル名を定義
define('WPMOP_USERTABLE', $wpdb->prefix . 'wpmop_usertable');
//↑↑↑↑↑新規追加ここまで
define( 'WPMOP_URL', plugins_url( '', __FILE__ ) );
define( 'WPMOP_DIR', plugin_dir_path( __FILE__ ) );
define( 'WPMOP_CLASS_PATH', rtrim( plugin_dir_path( __FILE__ ), '/' ) . '/class/' );
define( 'WPMOP_NONCE_NAME', 'wpmop_nonce_name' );
define( 'WPMOP_NONCE_ACTION', 'wpmop_nonce_action' . WPMOP_VER );
//以下、使用するファイルの読み込み。
include_once( WPMOP_CLASS_PATH . 'class.wpmop.php' );
//↓↓↓↓↓新規追加ここから
//プラグインをアクティベーションした際に行われるhook
register_activation_hook(__FILE__, 'plugin_activation');
//プラグインのアップデートの際にもデータベースチェック
add_action('plugins_loaded', 'plugin_activation');
//プラグインを有効化した際にこの関数を実行
function plugin_activation(){
global $wpdb;
$plugin_version = get_option('plugin_version');
//プラグインバージョンを比較
if (version_compare($plugin_version, WPMOP_VER) < 0) {
//プラグインバージョンが上がった際の対応
update_option('plugin_version', WPMOP_VER);
}
$plugin_db_version = get_option('plugin_db_version');
//データベースバージョンを比較
if (version_compare($plugin_db_version, WPMOP_DB_VER) < 0) {
//データベースバージョンが上がった際の対応
$table_name = WPMOP_USERTABLE;
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_login varchar(60) NOT NULL,
user_pass varchar(255) NOT NULL,
user_nicename varchar(50) NOT NULL,
user_email varchar(100) NOT NULL,
user_registrated datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
user_activation_key varchar(255) NOT NULL,
user_status int(11) DEFAULT '0' NOT NULL,
display_name varchar(250) NOT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
update_option('plugin_db_version', WPMOP_DB_VER);
}
}
//↑↑↑↑↑新規追加ここまで
//以下、クラスのインスタンス化
global $wpmop;
$wpmop = new WPMOP();
それでは実際に、WordPress管理画面>プラグインの画面から、My Original Pluginを無効化>有効化してみてください。
データベース内に新規テーブルhogehoge_wpmop_usertableが作られているのが分かるかと思います。
ディスカッション
コメント一覧
まだ、コメントがありません