WordPressのカスタマイズやテーマファイル、プラグインの作り方などデータベース構造から詳しく解説します。

WordPressとデータベース《wp_usersとuser_meta》

wp_usersテーブルとwp_usermeta

wp_usersテーブルはユーザーのコア情報が含まれているテーブルです。メディアサイトなどでライターが複数いる場合には、ライターの権限によって表示内容を変えたり、各ライターごとの進捗を可視化するために管理画面をカスタマイズしたりということが必要になる場合があります。
wp_usersテーブルとwp_usermetaの内容と活用方法について今回はご紹介します。

ID

ユーザーごとに一意に割り当てられたIDです。

user_login,user_pass

認証用のユーザー名とパスワード(暗号化)を格納しています。

user_nicename,display_name

ユーザーのニックネームと表示名

user_email,user_uri

それぞれユーザーのemailアドレスとサイトURL

user_registered

ユーザーの登録日。
その他、user_activation_keyやuser_statusといった項目もwp_usersテーブルには含まれます。

wp_usermetaテーブル

user_metaにはmeta_key、meta_value形式でユーザーにヒモづく様々な設定項目が格納されています。
wp_users.ID = wp_usermeta.user_idとして連結されて使用されますが、今回は代表的なmeta_keyをご紹介します。

wp_capabilities

寄稿者、編集者、管理者などユーザーごとの権限を格納しています。実はこれらのデフォルトで用意されているロールは更に細かい50弱の権限の組み合わせで実装されていて、新しいロールを用意したり、既存のロールの権限をカスタマイズすることが可能です。

description

ユーザーごとの紹介文です。

user-settings

投稿画面での画像サイズの設定など、ユーザーが独自に設定した項目がこちらのカラムに保存されます。

usermetaの活用例〈ライター管理者の導入〉

ライター数が100人以上などの規模になると、各ライターがいまどれくらいの記事を執筆していてその進捗状況を把握するのが困難になります。
そんな場合に、ライターには寄稿者権限を付与し、各ライターはその管理者として編集部の管理者ユーザー(1名)を持つ、といったカスタマイズをすることで、各編集者が管理しているライターの進捗を可視化するケースを考えてみます。

ユーザー管理者設定フォームを設置

get_all_administrator_name() {
	global $wpdb;
	$sql = $wpdb->prepare("SELECT m.user_id FROM $wpdb->usermeta  m WHERE m.meta_key LIKE %s AND m.meta_value LIKE %d", "wp_user_level",10 );
	$admin_ids = $wpdb->get_results($sql);
	$admin_names = array();
	foreach ($admin_ids as $key => $value) {
		$sql = $wpdb->prepare("SELECT u.display_name FROM $wpdb->users  u WHERE u.ID LIKE %d", "$value->user_id" );
		$admin_name = $wpdb->get_results($sql);
		$admin_name = $admin_name[0]->display_name;
		array_push($admin_names, "$admin_name");
	}
	return $admin_names;
	//array(admin_name)
}

// ユーザー管理者入力用フォームのHTML出力
add_user_administrator_form( $bool ) {
	global $profileuser;
	$admin_names = get_all_administrator_name();
	if ( preg_match( '/^(profile\.php|user-edit\.php|user-new\.php)/', basename( $_SERVER['REQUEST_URI'] ) ) ) {
		echo '<tr><th scope="row">ユーザーの管理者</th><td> ';
		echo '<select name="user_administrator" id="user_administrator" />';
		foreach ($admin_names as $key => $value) {
			echo '<option value="'.$value.'">'.$value.'</option>';
		}
		echo '</select>';
		echo '</td></tr>';
	}
	return $bool;
}
add_action('show_password_fields','add_user_administrator_form');

ユーザー編集画面でユーザー管理者を追加するフォームを設置する設計とします。
まず、管理者ユーザーをプルダウンメニューで表示するために全ての管理者ユーザーを取得する関数get_all_administrator_name()を定義しました。
ここではusermetaテーブルの”wp_user_level”というmeta_keyで条件分岐をしています。
その後、フォームをユーザー編集画面へ追加するためshow_password_fieldsというフィルターをフックし、HTMLを出力するコールバック関数を登録しています。

フォーム内容を受け取りDB:usermetaへ挿入

// user_administratorをDB:usermetaヘ挿入 
function update_user_administrator( $user_id, $old_user_data ) {
	if ( isset( $_POST['user_administrator'] ) && $old_user_data->user_administrator != $_POST['user_administrator'] ) {
		$user_administrator = sanitize_text_field( $_POST['user_administrator'] );
		$user_administrator = wp_filter_kses( $user_administrator );
		$user_administrator = _wp_specialchars( $user_administrator );
		update_user_meta( $user_id, 'user_administrator', $user_administrator );
	}
}
add_action( 'profile_update', array($this,'update_user_administrator'), 10, 2 );

フォームで出力された内容を、$_POST関数を通じて受け取り、update_user_meta()を使って対象テーブルをアップデートしています。

おわりに

users、usermetaテーブルは特にライター数が膨大になるメディアサイトの運営に置いて、カスタマイズする事で便利な機能を実装する事が出来ます。
またWordPressで会員制サイトを構築する際にもこのテーブルを活用する事で様々な機能を実装出来るでしょう。

関連記事

ページ上部へ戻る