WordPressのDBを利用したログインユーザーごとに違う内容を表示するテンプレート
現在のWordPressには、固定ページ用のテンプレートを適用することができるというのはご存じでしょうか?
具体的には、ある固定ページを作成する際に右の「ページ属性」にて選択することで適用することで、固定ページの内容に関わらず用意したテンプレートを固定ページとして表示させることができます。
この機能の便利な点として、PHPのコードをふんだんに利用できるということが挙げられます。
投稿記事にてPHPを実行するプラグインというものも存在しますが、私はあまり好きではないのでテンプレートを利用することにしました。
本記事では「DBで管理しているシリアルキーを、複数ユーザーが自分の利用するキーのみを表示する」ようなテンプレートを作成するための手順を紹介します。
テンプレートの宣言
PHPファイルをテンプレートとして利用するには、テンプレートであることを先頭で宣言する必要があります。以下の例のように< ? ?>で囲むことで、ソース上に表示されなくなります。<?php /* Template Name: TechNet */ ?>
WordPressのDBにテーブルを作る
例として以下のようなテーブル「wp_keymanager」をWordPressのDB上に作ります。phpMyAdmin等を利用すると便利でしょう。
| 列 | 型 |
|---|---|
| ID | bigint(20) 連番 |
| user_id | bigint(20) NULL |
| class | varchar(100) |
| name | varchar(100) |
| key | varchar(100) |
| PRIMARY | ID |
|---|---|
| INDEX | user_id |
| INDEX | class |
| INDEX | name |
| FULLTEXT | key |
| ID | user_id | class | name | key |
|---|---|---|---|---|
| 1 | 1 | OS | Windows 7 Ultimate | XXXXX-XXXXX-XXXXX-XXXXX |
| 2 | 2 | OS | Windows 7 Ultimate | XXXXX-XXXXX-XXXXX-XXXXX |
| 3 | NULL | OS | Windows 7 Professional | XXXXX-XXXXX-XXXXX-XXXXX |
| 4 | 1 | Office | Office 2010 Professional | XXXXX-XXXXX-XXXXX-XXXXX |
| 5 | NULL | Office | Office 2010 Professional | XXXXX-XXXXX-XXXXX-XXXXX |
ユーザーのログイン判別
ユーザーがログインしているかどうかを判別するにはis_user_logged_in() 関数を使います。下記のようなコードで簡単にログインユーザーにだけ見せるページを作ることができます。<?php if ( is_user_logged_in() ) : ?> <?php //ログインユーザーに表示する内容 ?> <?php else: ?> <h3>許可されていないページ</h3> <p>このコンテンツを参照するにはログインが必要です。</p> <?php wp_loginout(); ?> <?php endif; ?>
wp_loginout() 関数はWordpressのにデフォルトで存在している「メタ情報」というウィジェットにあるログイン/ログアウトのリンクです。
WordPressのDBを利用する
WordPressではwpdb クラスを用いることで、簡単にデータベース操作ができます。このクラスを直接は使わず、wpdbクラスのグローバルインスタンスである$wpdbを利用します。また、WordPress内のテーブルは全て特定の接頭辞(デフォルトでは「wp_」)が付いていますが、セキュリティ上の理由で変更している可能性があると思います。このWordPress固有の接頭辞は「$wpdb->prefix」に格納されています。
<?php $results = $wpdb->get_results($wpdb->"SELECT * FROM ".$wpdb->prefix."keymanager WHERE `user_id` =".$user_ID); ?> <h3>あなたに割り当てられたkey</h3> <table border="0"> <tbody> <?php foreach ($results as $value) : ?> <tr> <th><?php echo $value->name; ?></th> <td><?php echo $value->key; ?></td> </tr> <?php endforeach; ?> </tbody> </table>上記のコードはユーザー別に割り当てたkeyのみをテーブルに表示する例です。
今回はテキストボックス等から文字列を受け取ることはないのでSELECT文を直接書いてますが、任意の文字列をクエリとして送信する場合は、SQLインジェクションからクエリを保護するためにprepare() 関数を利用して文字列をエスケープして下さい。
キーを所有するユーザーだけ表示する
keyを所有しない無関係なユーザーが登録されている可能性を考えて、keyを所有しないユーザーにも別のものを表示させたいと思うかもしれません。その際に「SELECT COUNT() FROM~」のようなクエリを送信することで、数値を得ることができ、その数値を返す関数もwpdbクラスには用意されています。<?php $key_count = $wpdb->get_var($wpdb->"SELECT COUNT(user_id) FROM ".$wpdb->prefix."keymanager WHERE `user_id` =".$user_ID); ?> <?php if ( $key_count >= 1 ) : ?> <?php //key所持ユーザーに表示する内容 ?> <?php else: ?> <h3>許可されていないページ</h3> <p>このユーザーにはこちらのコンテンツを閲覧する権限がありません。</p> <?php endif; ?>このように「get_var() 関数」を利用します。返戻値は1つですが、結果はキャッシュされます。
管理者用のコンテンツを表示する
権限レベルの違いで表示させるコンテンツを変えたいと思うこともあるかもしれません。現在ログイン中ユーザーの権限レベルはグローバル変数$user_levelに格納されています。各ユーザーの権限レベルはwp_usermetaテーブル内にて確認することができます。
また、同テーブル内にはユーザーの姓名も確認することができます。ここでの例として管理者にのみ、テーブルのデータとuser_idから姓名を判別して表示するようにします。
<?php if ( $user_level >= 8 ) : ?> <?php //管理者レベルのユーザーにのみ表示する内容 ?> <?php //user_idに対応する姓と名を抽出 ?> <?php $id_and_lastname = $wpdb->get_results($wpdb->"SELECT user_id, meta_value FROM `".$wpdb->prefix."usermeta` WHERE `meta_key` LIKE 'last_name'"); ?> <?php $id_and_firstname = $wpdb->get_results($wpdb->"SELECT user_id, meta_value FROM `".$wpdb->prefix."usermeta` WHERE `meta_key` LIKE 'first_name'"); ?> <?php //連想配列の宣言とNULL対応 ?> <?php $user_id2name["NULL"] = 未設定; ?> <?php //連想配列に姓名を入力 ?> <?php foreach ($id_and_lastname as $value) : ?> <?php $user_id2name[$value->user_id] = $value->meta_value; ?> <?php endforeach; ?> <?php foreach ($id_and_firstname as $value) : ?> <?php $user_id2name[$value->user_id] .= " ".$value->meta_value; ?> <?php endforeach; ?> <?php $admin_results = $wpdb->get_results($wpdb->"SELECT user_id, class, name, key FROM ".$wpdb->prefix."keymanager"); ?> <h3>管理者向けコンテンツ</h3> <table border="0"> <tbody> <tr> <th>user_id</th> <td>class</td> <td>name</td> <td>key</td> <th>user</th> </tr> <?php foreach ($admin_results as $value) : ?> <?php if($value->user_id == NULL) $value->user_id = "NULL"; ?> <tr> <th><?php echo $value->user_id; ?></th> <td><?php echo $value->class; ?></td> <td><?php echo $value->name; ?></td> <td><?php echo $value->key; ?></td> <th><?php echo $user_id2name[$value->user_id]; ?></th> </tr> <?php endforeach; ?> </tbody> </table> <?php endif; ?>
サンプルコード
上記のコード例を合わせて作ってみたサンプルファイルを以下に置いておきます。classやレイアウトは当ブログに合わせて作ってあるため、必要に応じて置き換えて下さい。


