データのマイグレーションなどで WordPress を使う場合、元データのユーザーデータごと移行するケースがあると思います。そんなユーザー情報を WordPress の機能で追加するのではなく、外部アプリケーションから直接データベースを操作して追加する方法を紹介します。
なお、今回紹介するケースでは WordPress 4.8.2 を使いました。また WordPress のテーブルプリフィクス値はデフォルトの 'wp_' であると仮定して以下を紹介します。異なる設定で利用している場合は適宜読み替えてください。加えて、今回紹介する PHP ファイルを MySQL サーバーとは異なるホストから実行する場合は、このファイル内で指定したユーザーが MySQL にリモートログインできるような設定があらかじめされている必要がある点をご注意ください。
まず WordPress を普通にセットアップすると、いくつかのテーブルが自動的に生成されます。その中でユーザー情報を管理するのは wp_users と wp_usermeta の2つです:
wp_users はその名の通り WordPress のユーザーテーブルとなっていて、1レコードが1ユーザーの情報を意味します。詳しくは後述しますが、単に「ユーザーを登録する」だけであればこのテーブルに1レコード追加するだけで事は足ります。
一方、wp_usermeta はユーザーの属性に関わる値を管理するテーブルです。例えばユーザーのニックネームや権限といった wp_users だけでは管理できない一部の情報や、システムが内部的に利用するセッション情報、最終アクション日時といった情報を wp_usermeta テーブルで管理します。以下では「管理画面にアクセスできる権限を持ったユーザーを追加する」例を紹介しますが、この場合は wp_usermeta も操作する必要があります。
まず wp_users テーブルの属性を desc コマンドで調べた結果がこちらです:
プライマリキーは ID(auto_increment)で、他のフィールドは全て Not Null 属性です。ただ user_registered と user_status にはデフォルト値が設定されています。ということはこれらを除いた user_login, user_pass, user_nicename, user_email, user_url, user_activation_key, display_name を指定すればレコードは作れそうです。
というわけで、とりあえずは以下のような関数(createWpUser)およびファイル(wp-user-import.php(改良前))を PHP で作ってみました:
createWpUser 関数のパラメータはメールアドレスとパスワードの2つだけです。メールアドレスは user_login, user_nicename, user_email, display_name に設定します。パスワードは MySQL の MD5 関数を使ってハッシュ化したものを指定します。また user_url および user_activation_key には '' を指定して insert を実行しています。
このファイルを使って、1ユーザーを作成するサンプルがこちらです(test1.php):
試しにこの test1.php を実行すると、WordPress に user1@xxx.com という ID のユーザーが登録されます:
管理者権限でログインして管理ページを開くと、たしかに指定したユーザーが追加されていることが確認できます(この画面で「権限グループ」が「なし」になっていることがわかります):

この時点で作成したユーザーは有効なので、指定した ID とパスワードでログインすることはできます:

ただ管理機能については権限を一切持っていないユーザーなので、無理やり URL を指定して管理ページにアクセスしてもエラー画面となります:

とりあえずはここまで。wp_users に1レコード追加するだけで(管理や投稿の権限を持たない)ユーザーを作ることができることがわかりました。とりあえずこの状態になれば、後から管理者がこれらのユーザーの権限を(手動で)変える、ということも可能ではあります。
次に管理者や投稿者の権限を持ったユーザーを同様に外部から作成する方法を紹介します。先程と同様に wp_usermeta テーブルの属性を同様に調べた結果がこちらです:
umeta_id がプライマリキー(auto_increment)で、user_id は wp_users.ID を示す外部キーです。そしてこの user_id で指定したユーザーに対して、meta_key と meta_value で属性を加えることができるようになっています。
ユーザーの権限に関わる設定をするには、meta_key の値が 'wp_user_level' 及び 'wp_capabilities' となる2つのレコードを追加して指定することになります。具体的には対象のユーザーの権限に応じて、以下のような値を設定します:
というわけで wp-user-import.php を少し改良します。createWpUser 関数のパラメータを2つから3つに変更し、3つ目のパラメータで上記の wp_user_level を指定するものとします:
createWpUser の3つ目のパラメータ(無指定時は 0)の値を上記の wp_user_level と見なして、wp_usermeta テーブルにユーザー権限に合わせた値を作成するように変更しました。また wp_usermeta テーブルにレコードを作成する際に wp_users.ID の値が必要になるので、MySQL の last_insert_id() 関数を使って作成したユーザーの ID を取得しています。
そして、例えば管理者権限を持ったユーザーを作成したい場合は以下(test2.php)のようなコードを用意します:
試しにこの test2.php を実行すると、WordPress に user2@xxx.com という ID の管理者ユーザーが登録されます:

このユーザーの ID とパスワードでログインすると、管理者ダッシュボードにアクセスして、管理者権限でのオペレーションが可能です:

というわけで、PHP から WordPress の MySQL データベースを直接操作してユーザーを登録することができました!
(参考) WordPress Codex 日本語版:ユーザーの種類と権限
なお、今回紹介するケースでは WordPress 4.8.2 を使いました。また WordPress のテーブルプリフィクス値はデフォルトの 'wp_' であると仮定して以下を紹介します。異なる設定で利用している場合は適宜読み替えてください。加えて、今回紹介する PHP ファイルを MySQL サーバーとは異なるホストから実行する場合は、このファイル内で指定したユーザーが MySQL にリモートログインできるような設定があらかじめされている必要がある点をご注意ください。
まず WordPress を普通にセットアップすると、いくつかのテーブルが自動的に生成されます。その中でユーザー情報を管理するのは wp_users と wp_usermeta の2つです:
wp_users はその名の通り WordPress のユーザーテーブルとなっていて、1レコードが1ユーザーの情報を意味します。詳しくは後述しますが、単に「ユーザーを登録する」だけであればこのテーブルに1レコード追加するだけで事は足ります。
一方、wp_usermeta はユーザーの属性に関わる値を管理するテーブルです。例えばユーザーのニックネームや権限といった wp_users だけでは管理できない一部の情報や、システムが内部的に利用するセッション情報、最終アクション日時といった情報を wp_usermeta テーブルで管理します。以下では「管理画面にアクセスできる権限を持ったユーザーを追加する」例を紹介しますが、この場合は wp_usermeta も操作する必要があります。
まず wp_users テーブルの属性を desc コマンドで調べた結果がこちらです:
mysql> desc wp_users; +---------------------+---------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+---------------------+------+-----+---------------------+----------------+ | ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | user_login | varchar(60) | NO | MUL | | | | user_pass | varchar(255) | NO | | | | | user_nicename | varchar(50) | NO | MUL | | | | user_email | varchar(100) | NO | MUL | | | | user_url | varchar(100) | NO | | | | | user_registered | datetime | NO | | 0000-00-00 00:00:00 | | | user_activation_key | varchar(255) | NO | | | | | user_status | int(11) | NO | | 0 | | | display_name | varchar(250) | NO | | | | +---------------------+---------------------+------+-----+---------------------+----------------+ 10 rows in set (0.01 sec)
プライマリキーは ID(auto_increment)で、他のフィールドは全て Not Null 属性です。ただ user_registered と user_status にはデフォルト値が設定されています。ということはこれらを除いた user_login, user_pass, user_nicename, user_email, user_url, user_activation_key, display_name を指定すればレコードは作れそうです。
というわけで、とりあえずは以下のような関数(createWpUser)およびファイル(wp-user-import.php(改良前))を PHP で作ってみました:
<?php
$wp_db_name = 'wpdb'; //. WordPress DB
$wp_db_host = 'localhost'; //. WordPress ホスト名
$wp_db_username = 'adminuser'; //. WordPress DB の管理者ユーザー名
$wp_db_password = 'adminpass'; //. WordPress DB の管理者パスワード
$wp_table_prefix = 'wp_'; //. WordPress DB のテーブルプリフィクス
function createWpUser( $u_email, $u_password ){
global $wp_db_name, $wp_db_host, $wp_db_username, $wp_db_password, $wp_table_prefix;
$pdo = new PDO( 'mysql:dbname='.$wp_db_name.';host='.$wp_db_host.';charset=utf8', $wp_db_username, $wp_db_password );
if( $pdo != null ){
$pdo->query( 'SET NAMES utf8' );
$sql1 = 'insert into ' . $wp_table_prefix . 'users(user_login,user_pass,user_nicename,user_email,user_url,user_activation_key,display_name) values( :user_login, MD5(:user_pass), :user_nicename, :user_email, "", "", :display_name )';
$stmt1 = $pdo->prepare( $sql1 );
$stmt1->bindParam( ':user_login', $u_email );
$stmt1->bindParam( ':user_pass', $u_password );
$stmt1->bindParam( ':user_nicename', $u_email );
$stmt1->bindParam( ':user_email', $u_email );
$stmt1->bindParam( ':display_name', $u_email );
$r1 = $stmt1->execute();
}
}
?>
createWpUser 関数のパラメータはメールアドレスとパスワードの2つだけです。メールアドレスは user_login, user_nicename, user_email, display_name に設定します。パスワードは MySQL の MD5 関数を使ってハッシュ化したものを指定します。また user_url および user_activation_key には '' を指定して insert を実行しています。
このファイルを使って、1ユーザーを作成するサンプルがこちらです(test1.php):
<?php require_once './wp-user-import.php'; $r1 = createWpUser( 'user1@xxx.com', 'P@ssw0rd' ); //. ID: user1@xxx.com , パスワード: P@ssword のユーザーを新規作成する ?>
試しにこの test1.php を実行すると、WordPress に user1@xxx.com という ID のユーザーが登録されます:
$ php -f test1.php
管理者権限でログインして管理ページを開くと、たしかに指定したユーザーが追加されていることが確認できます(この画面で「権限グループ」が「なし」になっていることがわかります):

この時点で作成したユーザーは有効なので、指定した ID とパスワードでログインすることはできます:

ただ管理機能については権限を一切持っていないユーザーなので、無理やり URL を指定して管理ページにアクセスしてもエラー画面となります:

とりあえずはここまで。wp_users に1レコード追加するだけで(管理や投稿の権限を持たない)ユーザーを作ることができることがわかりました。とりあえずこの状態になれば、後から管理者がこれらのユーザーの権限を(手動で)変える、ということも可能ではあります。
次に管理者や投稿者の権限を持ったユーザーを同様に外部から作成する方法を紹介します。先程と同様に wp_usermeta テーブルの属性を同様に調べた結果がこちらです:
mysql> desc wp_usermeta; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | umeta_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | user_id | bigint(20) unsigned | NO | MUL | 0 | | | meta_key | varchar(255) | YES | MUL | NULL | | | meta_value | longtext | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
umeta_id がプライマリキー(auto_increment)で、user_id は wp_users.ID を示す外部キーです。そしてこの user_id で指定したユーザーに対して、meta_key と meta_value で属性を加えることができるようになっています。
ユーザーの権限に関わる設定をするには、meta_key の値が 'wp_user_level' 及び 'wp_capabilities' となる2つのレコードを追加して指定することになります。具体的には対象のユーザーの権限に応じて、以下のような値を設定します:
| ユーザー権限 | wp_user_level の設定値 | wp_capabilities の設定値 |
|---|---|---|
| 購読者 | 0 | a:1:{s:10:"subscriber";b:1;} |
| 寄稿者 | 1 | a:1:{s:11:"contributor";s:1:"1";} |
| 投稿者 | 2~4 | a:1:{s:6:"author";b:1;} |
| 編集者 | 5~7 | a:1:{s:6:"editor";b:1;} |
| 管理者 | 8~10 | a:1:{s:13:"administrator";b:1;} |
というわけで wp-user-import.php を少し改良します。createWpUser 関数のパラメータを2つから3つに変更し、3つ目のパラメータで上記の wp_user_level を指定するものとします:
<?php
$wp_db_name = 'wpdb'; //. WordPress DB
$wp_db_host = 'localhost'; //. WordPress ホスト名
$wp_db_username = 'adminuser'; //. WordPress DB の管理者ユーザー名
$wp_db_password = 'adminpass'; //. WordPress DB の管理者パスワード
$wp_table_prefix = 'wp_'; //. WordPress DB のテーブルプリフィクス
function createWpUser( $u_email, $u_password, $wp_user_level = 0 ){
global $wp_db_name, $wp_db_host, $wp_db_username, $wp_db_password, $wp_table_prefix;
$pdo = new PDO( 'mysql:dbname='.$wp_db_name.';host='.$wp_db_host.';charset=utf8', $wp_db_username, $wp_db_password );
if( $pdo != null ){
$pdo->query( 'SET NAMES utf8' );
$sql1 = 'insert into ' . $wp_table_prefix . 'users(user_login,user_pass,user_nicename,user_email,user_url,user_activation_key,display_name) values( :user_login, MD5(:user_pass), :user_nicename, :user_email, "", "", :display_name )';
$stmt1 = $pdo->prepare( $sql1 );
$stmt1->bindParam( ':user_login', $u_email );
$stmt1->bindParam( ':user_pass', $u_password );
$stmt1->bindParam( ':user_nicename', $u_email );
$stmt1->bindParam( ':user_email', $u_email );
$stmt1->bindParam( ':display_name', $u_email );
$r1 = $stmt1->execute();
$user_id = null;
$sql2 = 'select last_insert_id() as user_id from ' . $wp_table_prefix . 'users';
$stmt2 = $pdo->query( $sql2 );
if( $row = $stmt2->fetch( PDO::FETCH_ASSOC ) ){
$user_id = $row['user_id'];
}
if( $user_id ){
//. wp_user_level
$sql3 = 'insert into ' . $wp_table_prefix . 'usermeta(user_id,meta_key,meta_value) values( :user_id, "wp_user_level", :wp_user_level )';
$stmt3 = $pdo->prepare( $sql3 );
$stmt3->bindParam( ':user_id', $user_id );
$stmt3->bindParam( ':wp_user_level', $wp_user_level );
$r3 = $stmt3->execute();
//. wp_capabilities
$wp_capabilities = null;
if( $wp_user_level == 0 ){
$wp_capabilities = 'a:1:{s:10:"subscriber";b:1;}';
}else if( $wp_user_level == 1 ){
$wp_capabilities = 'a:1:{s:11:"contributor";s:1:"1";}';
}else if( 2 <= $wp_user_level && $wp_user_level <= 4 ){
$wp_capabilities = 'a:1:{s:6:"author";b:1;}';
}else if( 5 <= $wp_user_level && $wp_user_level <= 7 ){
$wp_capabilities = 'a:1:{s:6:"editor";b:1;}';
}else if( 8 <= $wp_user_level && $wp_user_level <= 10 ){
$wp_capabilities = 'a:1:{s:13:"administrator";b:1;}';
}
if( $wp_capabilities != null ){
$sql4 = 'insert into ' . $wp_table_prefix . 'usermeta(user_id,meta_key,meta_value) values( :user_id, "wp_capabilities", :wp_capabilities )';
$stmt4 = $pdo->prepare( $sql4 );
$stmt4->bindParam( ':user_id', $user_id );
$stmt4->bindParam( ':wp_capabilities', $wp_capabilities );
$r4 = $stmt4->execute();
}
}
}
}
?>
createWpUser の3つ目のパラメータ(無指定時は 0)の値を上記の wp_user_level と見なして、wp_usermeta テーブルにユーザー権限に合わせた値を作成するように変更しました。また wp_usermeta テーブルにレコードを作成する際に wp_users.ID の値が必要になるので、MySQL の last_insert_id() 関数を使って作成したユーザーの ID を取得しています。
そして、例えば管理者権限を持ったユーザーを作成したい場合は以下(test2.php)のようなコードを用意します:
<?php require_once './wp-user-import.php'; $r2 = createWpUser( 'user2@xxx.com', 'P@ssw0rd', 10 ); //. ID: user2@xxx.com , パスワード: P@ssword のユーザーを管理者権限で新規作成する ?>
試しにこの test2.php を実行すると、WordPress に user2@xxx.com という ID の管理者ユーザーが登録されます:
$ php -f test2.php

このユーザーの ID とパスワードでログインすると、管理者ダッシュボードにアクセスして、管理者権限でのオペレーションが可能です:

というわけで、PHP から WordPress の MySQL データベースを直接操作してユーザーを登録することができました!
(参考) WordPress Codex 日本語版:ユーザーの種類と権限
