| English | GitHub リポジトリ | 更新履歴 |
Nunifuchisaka Custom Fields
投稿編集画面にカスタムフィールド(メタボックス)を追加する軽量プラグイン。 フィールド定義はプラグイン側に持たず、テーマ側からフィルターフックで登録する設計です。
テーマ開発者向けに作ったプラグインです。制作者自身もテーマ開発をしており、「フィールド定義をコードで管理できる、こういうプラグインが欲しい」と感じて自作しました。
特徴・他のプラグインとの違い
フィールド定義はコードで管理する
管理画面で設定するタイプのプラグインとは違い、フィールド定義はテーマのfunctions.php(PHPコード)に書きます。設定をデータベースに保存しないので、
- 変更履歴をGitで追える
- 本番・ステージング・ローカルで設定がズレない(環境ごとに手動で再設定する必要がない)
- コードレビューの対象にできる
というメリットがあります。
リピーター(繰り返し入力欄)が無料で使える
「メンバー一覧」「関連リンク集」のように、行を追加・削除・ドラッグで並べ替えできる入力欄(リピーター)は、他の有名プラグインでは有料版でしか使えないことが多い機能です。このプラグインでは無料で標準搭載しています。
テンプレート出力コードを自動生成
編集画面で「▶ まとめて出力コードを取得」を開くと、登録したフィールドを表示するためのPHPコード(get_post_metaやesc_htmlなどを使った安全な書き方)がそのまま生成されます。コピペしてテンプレートに貼るだけなので、毎回同じような出力コードを手で書く手間がありません。
保存データの安全性
select / radio / checkboxは定義した選択肢以外の値を保存せず、画像・投稿選択も実在するデータのみを保存します。改ざんされたリクエストや不正な値がそのままデータベースに入り込むのを、保存時の検証で防ぎます。
軽量・依存ライブラリなし
WordPressに標準搭載されている機能(メディアアップローダー、カラーピッカー、jQuery UI)だけを使っており、追加のライブラリは読み込みません。管理画面の動作も軽快です。
フックで拡張できる
保存完了時に発火するアクション(ncf_after_save)など、開発者向けのフックを用意しています。キャッシュの破棄や外部サービス連携を自分のコードから差し込めます。
入手方法
基本的な使い方
テーマのfunctions.phpで、ncf_register_fieldsフィルターにフィールド定義の配列を返します。
add_filter( 'ncf_register_fields', function( $configs ) {
$configs['my_meta_box'] = [
'title' => '記事の追加情報',
'screen' => 'post', // 対象のpost_type(配列で複数指定も可)
'fields' => [
[
'key' => 'subtitle',
'label' => 'サブタイトル',
'type' => 'text',
'desc' => '記事タイトルの下に表示されます',
],
[
'key' => 'main_visual',
'label' => 'メインビジュアル',
'type' => 'image',
],
],
];
return $configs;
} );
これだけで対象の投稿編集画面にメタボックスが表示され、保存・サニタイズまで自動で行われます。
メタボックスの設定
$configsのキーがメタボックスのID、値が設定配列です。
| キー | 既定値 | 説明 |
|---|---|---|
title |
Custom Fields |
メタボックスのタイトル |
screen |
post |
対象のpost_type。[ 'post', 'page' ]のように配列も可 |
context |
advanced |
表示位置(normal / side / advanced) |
priority |
default |
表示優先度 |
fields |
[] |
フィールド定義の配列(下記) |
フィールド定義
fieldsの各要素は以下のキーを持つ配列です。
| キー | 必須 | 説明 |
|---|---|---|
key |
○ | メタキーの元になる識別子。実際のメタキーはncf_プレフィックス付き(例: keyがsubtitleならncf_subtitle) |
label |
○ | 編集画面に表示するラベル |
type |
- | フィールド型(既定: text)。下記一覧参照 |
desc |
- | フィールド下に表示する説明文 |
options |
- | select / radio / checkbox用の選択肢(値 => ラベルの連想配列) |
post_type |
- | post型用。選択対象のpost_type(既定: post) |
posts_per_page |
- | post型用。選択肢に出す最大件数(既定: 50) |
sub_fields |
- | repeater型用。行内のフィールド定義の配列 |
editor_settings |
- | wysiwyg型用。wp_editor()の設定を上書きする配列(textarea_nameは上書き不可) |
sanitize_callback |
- | 保存時のサニタイズを差し替えるコールバック。function( $value, $field )で呼ばれる |
フィールド型一覧
| type | 入力UI | 保存される値 |
|---|---|---|
text |
テキスト入力 | 文字列 |
textarea |
複数行テキスト | 文字列(改行保持) |
select |
セレクトボックス | 選択した値 |
radio |
ラジオボタン | 選択した値 |
checkbox |
チェックボックス(複数可) | 選択した値の配列 |
image |
メディアライブラリから選択 | 添付ファイルID(int) |
post |
投稿を選択するセレクト | 投稿ID(int) |
number |
数値入力 | 数値 |
url |
URL入力 | esc_url_raw済みの文字列 |
email |
メール入力 | sanitize_email済みの文字列 |
date |
日付ピッカー(ブラウザ標準) | YYYY-MM-DD形式の文字列(形式外の値は空で保存) |
color |
WordPressカラーピッカー | #rrggbb形式の文字列 |
repeater |
行の追加・削除・ドラッグ並べ替え | 行(連想配列)の配列 |
wysiwyg |
リッチエディタ(ビジュアル/テキスト切替、メディア追加可) | HTML文字列(wp_kses_post済み) |
リピーター
sub_fieldsに定義したフィールドのセットを、行として何件でも追加できます。行はハンドル(≡)のドラッグで並べ替え可能。全サブフィールドが空の行は保存時に自動でスキップされます。
[
'key' => 'members',
'label' => 'メンバー',
'type' => 'repeater',
'sub_fields' => [
[ 'key' => 'name', 'label' => '名前', 'type' => 'text' ],
[ 'key' => 'photo', 'label' => '写真', 'type' => 'image' ],
[ 'key' => 'sns', 'label' => 'SNS', 'type' => 'url' ],
],
],
※ リピーターの入れ子(repeaterの中にrepeater)には対応していません。
※ sub_fieldsにwysiwygは使えません(指定した場合はtextareaとして扱われます)。
テンプレートでの値の取得
メタキーはncf_ + keyです。get_post_metaで取得します。
// text系
$subtitle = get_post_meta( get_the_ID(), 'ncf_subtitle', true );
echo esc_html( $subtitle );
// image(添付ファイルIDが入っている)
$img_id = get_post_meta( get_the_ID(), 'ncf_main_visual', true );
if ( $img_id ) {
echo wp_get_attachment_image( $img_id, 'full' );
}
// repeater(行の配列)
$members = get_post_meta( get_the_ID(), 'ncf_members', true );
if ( ! empty( $members ) && is_array( $members ) ) {
foreach ( $members as $row ) {
echo esc_html( $row['name'] ?? '' );
}
}
出力コードの自動生成
編集画面のメタボックス下部にある「▶ まとめて出力コードを取得」を開くと、そのメタボックスの全フィールドを出力するPHPコードが生成されます。「コードをコピー」でクリップボードにコピーし、テンプレートに貼り付けて調整してください。
リピーターの生成コードはforeach ( $rows as $i => $row )の形になっており、$i(0始まりの行番号)を奇数/偶数のスタイル分岐やid属性の付与にそのまま使えます。
この欄は開発者向けツールなので、本番環境などクライアントに見せたくない場合はncf_show_output_codeフィルターで非表示にできます(下記フック参照)。
フック
| フック | 種別 | 説明 |
|---|---|---|
ncf_register_fields |
filter | フィールド定義を登録する(前述) |
ncf_show_output_code |
filter | falseを返すと「まとめて出力コードを取得」欄を非表示にする。function( $show, $post )で呼ばれる |
ncf_show_promo |
filter | falseを返すと宣伝欄を非表示にする。function( $show, $post )で呼ばれる |
ncf_promo_url |
filter | 宣伝欄のリンクURLを差し替える |
ncf_after_save |
action | NCFの保存処理が完了した直後に発火。function( $post_id, $saved )。$savedは保存したメタキーと値の連想配列(削除されたキーはnull)。キャッシュの破棄や外部連携などに |
// 例1: 本番環境では出力コード欄を隠す
if ( wp_get_environment_type() === 'production' ) {
add_filter( 'ncf_show_output_code', '__return_false' );
}
// 例2: BOOTH宣伝欄を隠す
// add_filter( 'ncf_show_promo', '__return_false' );
// 例3: NCFのフィールドが保存されたらキャッシュを消す
add_action( 'ncf_after_save', function( $post_id, $saved ) {
if ( array_key_exists( 'ncf_demo_repeater', $saved ) ) {
delete_transient( 'my_repeater_cache_' . $post_id );
}
}, 10, 2 );
補足
- 保存時はフィールド型に応じたサニタイズが自動で適用されます。独自の加工が必要な場合のみ
sanitize_callbackを指定してください。 select/radio/checkboxはoptionsに定義された値のみ、imageは実在する画像添付ファイルIDのみ、postは実在する対象post_typeの投稿IDのみ保存されます(定義外の値は空になります)。post型は軽量化のため選択肢を既定50件に絞っていますが、保存済みの投稿は件数から漏れていても選択肢に含まれるため、再保存で選択が消えることはありません。件数を増やす場合はposts_per_pageを指定します。wysiwyg型はwp_kses_post相当のタグのみ保存されます(scriptやiframeは除去されます)。埋め込みが必要な場合はsanitize_callbackで調整してください。wysiwyg型はフィールドごとにエディタを1つ生成するため、1画面に大量に配置すると表示が重くなります。個数は控えめにしてください。