Custom Field GUI Utility で生成されるカスタムフィールドをユーザーごとに使い分けるカスタマイズ

当ブログで公開している WordPress のプラグイン、Custom Field GUI Utility について以下のようなご質問をいただきました。

Custom Field GUI Utility 1.1.1 にバージョンアップ

プラグイン使わせていただいています。ありがとうございます。 私はWordPress MUで使用しているため、conf-*.iniがpluginフォルダの中に入っていると、すべてのユーザのブログで設定が共通になってしまうため、conf-*.iniがThemeにあれば、Themeの方を優先にするようにして使っていますが、各ユーザごとに設定を変えるうまい方法はありますでしょうか?

function get_custom_fields() {
$file = TEMPLATEPATH.'/conf-post.ini';
if (!file_exists($file)) {
$file = dirname(__FILE__).'/conf-post.ini';
if (!file_exists($file)) {
return null;
}
}

このコメント自体、「なるほどー」という感じだったのですが、今回はログインしているユーザーによってカスタムフィールドのフォームを変更する方法を考えてみたのでご紹介します。

なお、何度も言って恐縮ですが、僕はPHPは素人なので、ご利用の際は自己責任でお願いします。

ユーザーごとに conf-xxx.ini を作成

当プラグインでは、生成したいカスタムフィールドの内容を conf-xxx.ini ファイルで設定します。この conf-xxx.ini ファイルは3種類あり、それぞれが次のような条件のカスタムフィールドを設定するファイルとなっています。

  • conf-common.ini
    ページと投稿に共通して表示するカスタムフィールド
  • conf-page.ini
    ページのみに表示するカスタムフィールド
  • conf-post.ini
    投稿のみに表示するカスタムフィールド

ユーザーごとに振り分けるためには、ユーザーごとに conf-xxx.ini を作成しておく必要があります。

今回は例として、投稿のみに表示するカスタムフィールドを、次のような条件で変えるカスタマイズを行ってみます。

ユーザー名 : admin
conf-post.ini ファイルを参照する。
ユーザー名 : tinybeans
conf-post-tinybeans.ini ファイルを参照する。

conf-post.ini ファイルは次のような内容にしました。

[textfield_post]
fieldname = 1行テキスト(投稿表示)
type = textfield
size = 35
sample = input the example or the caption
[imagefield_post]
fieldname = 画像(投稿表示)
idname = imagefield_idname_post
type = imagefield
size = 35
sample = input the example or the caption
[checkbox_post]
fieldname = チェックボックス(投稿表示)
type = checkbox
default = checked
sample = input the caption
[radio_post]
fieldname = ラジオボタン(投稿表示)
type = radio
value = 0-9 # 10-19 # 20+
default = 10-19
sample = input the caption
[select_post]
fieldname = セレクトメニュー(投稿表示)
type = select
value = High # Medium # Low
default = Low
sample = input the caption
[textarea_post]
fieldname = 複数行テキスト(投稿表示)
type = textarea
rows = 4
cols = 40
sample = input the example or the caption

conf-post-tinybeans.ini ファイルは次のような内容にしました。

[textfield_post]
fieldname = tinybeansさんの1行テキスト(投稿表示)
type = textfield
size = 35
sample = input the example or the caption
[radio_post]
fieldname = tinybeansさんのラジオボタン(投稿表示)
type = radio
value = 0-9 # 10-19 # 20+
default = 10-19
sample = input the caption

rc-custom-field-gui-xxx.class をカスタマイズ

次に、実際にカスタムフィールドを生成するファイルをカスタマイズします。

カスタマイズを加えるのは、3種類ある rc-custom-field-gui-xxx.class のいずれかのファイルになります。

  • rc-custom-field-gui-common.class(共通)
  • rc-custom-field-gui-page.class(ページのみ)
  • rc-custom-field-gui-post.class(投稿のみ)

今回は例として、「投稿のみに表示するカスタムフィールド」をユーザーごとに変えるので、カスタマイズするファイルは次のファイルになります。

  • カスタマイズするファイル : rc-custom-field-gui-post.class

これらの rc-custom-field-gui-xxx.class ファイルでは、設定ファイルを読み込み、その内容によってカスタムフィールドを生成するというロジックになっています。

つまり、ユーザーごとにカスタムフィールドを変えるには、ログインしているユーザーごとに読み込む設定ファイルを変えれば良い訳です。

カスタマイズするのは rc-custom-field-gui-post.class の17〜23行目の次の部分です。

	function get_custom_fields() {
		$file = dirname( __FILE__ ) . '/conf-post.ini';
		if ( !file_exists( $file ) )
			return null;
		$custom_fields = parse_ini_file( $file, true );
		return $custom_fields;
	}

ここを次のように変えます。

	function get_custom_fields() {
		global $current_user;
		if ( $current_user->user_login == 'admin' ) {
			$file = dirname( __FILE__ ) . '/conf-post.ini';		
		} elseif ( $current_user->user_login == 'tinybeans' ) {
			$file = dirname( __FILE__ ) . '/conf-post-tinybeans.ini';
		}
		if ( !file_exists( $file ) )
			return null;
		$custom_fields = parse_ini_file( $file, true );
		return $custom_fields;
	}

正直、ここらへんはよく分かっていません。以下、たぶんこんな感じ、です。

まず、WordPress においてユーザー情報を取得する関数は、次のファイルにある get_currentuserinfo()関数のようです。

  • wp-includes
    • pluggable.php
      • get_currentuserinfo()関数

この関数は、管理画面を表示するときにすでに実行されていて、この関数によって、ユーザー情報がグローバル変数 $current_user に格納されるようになっているようです。

したがって、先ほどの get_custom_fields()関数内でもう一度グローバル変数 $current_user を定義すると、この get_custom_fields()関数内でも $current_user が使えるようになります。

そのユーザー情報が格納されたグローバル変数 $current_user から、 $current_user->user_login としてログインしているユーザー名を取得して、そのユーザー名によって読み込む設定ファイル(.ini)を変えている訳です。

if ( $current_user->user_login == 'admin' ) {
や
} elseif ( $current_user->user_login == 'tinybeans' ) {
の部分

もし上記の記述でうまくいかなければ次のようにしてみてください。

	function get_custom_fields() {
		require_once(ABSPATH . 'wp-includes/pluggable.php');
		global $current_user;
		get_currentuserinfo();
		if ( $current_user->user_login == 'admin' ) {
			$file = dirname( __FILE__ ) . '/conf-post.ini';		
		} elseif ( $current_user->user_login == 'tinybeans' ) {
			$file = dirname( __FILE__ ) . '/conf-post-tinybeans.ini';
		}
		if ( !file_exists( $file ) )
			return null;
		$custom_fields = parse_ini_file( $file, true );
		return $custom_fields;
	}

なお、この get_currentuserinfo() については次のページが参考になります(英語)。

実際の動作確認

まず「admin」でログインしてみます。

cfgu_user01.png

カスタムフィールドには、次のように6個の項目があります。

cfgu_user02.png

次に、一旦ログアウトして、今度は「tinybeans」でログインします。

cfgu_user03.png

カスタムフィールドは、次のように2個の項目になりました。

cfgu_user04.png

成功です。

設定における注意点

このカスタマイズには一つ注意点があります。それは、設定ファイル内の [ ] で囲まれたフィールド名の設定方法です。

ユーザーごとに設定ファイルを分けたとしても、[ ] の値に同じ物があると、それはその記事において1つの項目として扱われてしまいます。

このブログの前半で、conf-post.ini と conf-post-tinybeans.ini の例を挙げましたが、両方のファイルの1行目には、[textfield_post] というフィールド名があります。このようにしてしまうと、同じ記事の同じフィールドを違うユーザーが編集してしまうと、カスタムフィールドのキー「textfield_post」に対する値が変更されてしまいます。

具体的に見てみます。

まず「admin」でログインし、[textfield_post] に該当するテキストフィールドに『僕は「かたつむりくん」さ。』と入力します。

phpMyAdmin でデータベースを見てみると、この「投稿」に対するカスタムフィールドのキー「textfield_post」の値は、『僕は「かたつむりくん」さ。』になっています。

cfgu_user05.png

次に、「tinybeans」でログインし直して、[textfield_post] に該当するテキストフィールドに『僕は「tinybeans」ってハンドルネームさ。』と入力します。

すると、先ほどこの「投稿」に対するカスタムフィールドのキー「textfield_post」の値は、『僕は「かたつむりくん」さ。』になっていたのが、『僕は「tinybeans」ってハンドルネームさ。』に上書きされてしまいました。

cfgu_user06.png

このような事態をさけるためには、設定ファイルの [ ] 内を一意のものになるようにしてください。上書きされても良い、つまり複数のユーザーにとって同じフィールドとして扱う場合には、 [ ] 内を同一にすれば良いです。

以上です。

このカスタマイズをうまく使えれば、WordPres をより一層 CMS として活用しやすくなるかも知れませんね。

  • このエントリーをはてなブックマークに追加
Just a second...