Smart Custom Fields を利用して、コードでオプションページを追加する

カスタムフィールドを管理するプラグイン Smart Custom Fields は、バージョン 2.1.0 から、独自のオプションページを作成できます。

これまで Smart Custom Fields をあまり本気で使ったことがなかったのですが、超有名な Advanced Custom Fields では有料の「繰り返し」機能を、Smart Custom Fields では標準装備していることから、今回使ってみることにしました。

オプションページの追加方法

上記ページの説明にしたがい、次に例示するようなコードをテーマの functions.php などに書いておくと、SCF::add_options_page() の引数で指定した名前 (下の例では ‘メニュータイトル’ ) のオプションページ項目が管理画面の左側メニューに追加されます。同時に、Smart Custom Fields の設定画面の 表示条件 (オプションページ) メタボックスの中にもチェックボックス付で表示されるので、目的のカスタムフィールドの編集・設定画面でそのチェックボックスをオンにすれば、そのカスタムフィールドがオプションページに表示されるようになります。

/**
 * @param string $page_title ページのtitle属性値
 * @param string $menu_title 管理画面のメニューに表示するタイトル
 * @param string $capability メニューを操作できる権限(manage_options とか)
 * @param string $menu_slug オプションページのスラッグ。ユニークな値にすること。
 * @param string|null $icon_url メニューに表示するアイコンの URL
 * @param int $position メニューの位置
 */
add_action( 'init', function() {
	SCF::add_options_page( 
		'ページタイトル',
		'メニュータイトル',
		'manage_options',
		'my-options',
		'dashicons-admin-settings',
		80
	);
} );

上記の例では、Dashicons の admin-settings アイコンをメニューのアイコンとして指定しています。メニューの表示位置 80 は、[設定] の下です。ちなみにメニュー位置を指定する値は下記のとおり。

メニューの表示位置
5 - 投稿の下
10 - メディアの下
15 - リンクの下
20 - 固定ページの下
25 - コメントの下
60 - 最初の区切りの下(コメントの下に区切りがある)
65 - プラグインの下
70 - ユーザーの下
75 - ツールの下
80 - 設定の下
100 - 二つ目の区切りの下(設定の下に区切りがある)

コードによるカスタムフィールドの定義

作者のキタジマさんによって、コードでカスタムフィールドを登録するサンプルコードが下記ページに例示されています。

ふむふむ、と思ったものの、オプションページに表示したいときはどうすればいいのだろうという疑問が生じました。

管理画面で Smart Custom Fields のカスタムフィールドを定義・設定する場合は、カスタムフィールドを表示したい投稿タイプや投稿ID、権限、タクソノミー、オプションページのチェックボックスをオンにするという設定方法だったので、そういう視点で考えていて、どうやって指定するのか考え込みました。

ところが、サンプルコードを入れてみたところ、投稿や固定ページの編集画面にも、カテゴリーやタブやプロフィールの編集画面にも、追加したオプションページにも、とにかくすべてに、コードで定義したカスタムフィールドが表示されました。つまり、コードベースでの定義では、表示させたいものを指定するのではなく、表示させたくないものを除外するのでした。

キタジマさんのサンプルコードでは、コールバック関数の各引数について次のように説明されています。( MW_WP_Form_Setting オブジェクトではないでしょう、というのはさておき)

/**
 * カスタムフィールドを定義
 * 
 * @param array  $settings  MW_WP_Form_Setting オブジェクトの配列
 * @param string $type      投稿タイプ or ロール
 * @param int    $id        投稿ID or ユーザーID
 * @param string $meta_type post | user
 * @return array
 */

試してみると、オプションページの場合には、$meta_type は option に、$type は $menu_slug の値 (SCF::add_options_page() の第4引数で指定した文字列) になることがわかりました。

特定のオプションページにだけ表示したいときは、コールバック関数の先頭で $type の条件を書いておけばよいわけです。上の「オプションページの追加方法」に書いたオプションページを追加するコード例でいえば、$menu_slug は my-options にしているので、

	if ( 'my-options' !== $type ) {
		return $settings;
	}

と書いておけばOKですね。

カスタムフィールドをコードベースで定義できるのはイイですね。管理者権限をお渡ししたクライアントさんが不用意に編集してしまう心配がなくなりますし、管理画面での設定ではできないことができたりもします (カスタムフィールドのデフォルト値や注記を動的に変える、など)。すばらしい。これからは Smart Custom Fields を積極的に使うことにします。