2026年5月28日
2026年5月28日
Meta Boxでカスタムフィールドを作る方法|rwmb_meta_boxesでの登録と表示
Meta Box は、投稿や固定ページ、カスタム投稿タイプの編集画面に独自の入力欄(カスタムフィールド)を追加するためのプラグインです。フィールドはPHPの配列で定義し、rwmb_meta_boxes フィルターに登録します。この記事では、イベント情報(会場・定員・開催形式・申込URL)を投稿に追加する例で、登録から表示までを順に説明します。
Meta Boxでできること
- 投稿・固定ページ・カスタム投稿タイプの編集画面に入力欄を追加する
- テキスト、数値、URL、セレクトボックス、日付、画像など多数のフィールドタイプを使う
- 入力値を投稿のメタデータ(
wp_postmetaテーブル)に保存し、テーマのテンプレートで表示する
wordpress.org で配布されている Meta Box 本体は、フィールドをコードで定義するためのフレームワークです。管理画面からフィールドを作る画面(MB Builder)は拡張機能で、2026年10月時点では、MB Builder を含む無料パッケージ「Meta Box Lite」が公式サイト(metabox.io)で配布されています。この記事では、本体だけで使えるコードでの登録方法を扱います。
ステップ1:Meta Boxをインストールする
管理画面の「プラグイン」→「新規プラグインを追加」で「Meta Box」を検索し、作者が「Meta Box」のプラグインをインストールして有効化します。WP-CLI を使える場合は次のコマンドでも同じです。
wp plugin install meta-box --activate
ステップ2:フィールドを登録する
フィールドは rwmb_meta_boxes フィルターで登録します。フィルターは登録済みのメタボックスの配列を受け取るので、そこに自分の定義を追加して返します。コードは子テーマの functions.php か、自作のプラグインに書きます(親テーマに書くと、テーマの更新で消えます)。
<?php
// 子テーマの functions.php、または自作プラグインに追加
add_filter( 'rwmb_meta_boxes', function ( $meta_boxes ) {
$meta_boxes[] = [
'title' => 'イベント情報',
'id' => 'event_info',
'post_types' => [ 'post' ],
'context' => 'normal',
'priority' => 'high',
'fields' => [
[
'name' => '会場',
'id' => 'event_venue',
'type' => 'text',
'desc' => '例: 〇〇市民ホール 大ホール',
],
[
'name' => '定員',
'id' => 'event_capacity',
'type' => 'number',
'min' => 0,
],
[
'name' => '開催形式',
'id' => 'event_format',
'type' => 'select',
'placeholder' => '選択してください',
'options' => [
'onsite' => '会場開催',
'online' => 'オンライン',
'hybrid' => 'ハイブリッド',
],
],
[
'name' => '申込ページのURL',
'id' => 'event_url',
'type' => 'url',
],
],
];
return $meta_boxes;
} );
これで、投稿の編集画面に「イベント情報」の入力欄が表示されます。登録だけで保存処理も行われるため、add_meta_box() や save_post のコードを自分で書く必要はありません。
メタボックスの主な設定
| キー | 内容 |
|---|---|
title |
編集画面に表示する見出し(必須) |
id |
メタボックスの識別子。省略すると題名から作られるが、明示するのがおすすめ |
post_types |
表示する投稿タイプ。文字列か配列で指定(省略時は post) |
context |
表示位置。normal(既定)・side など。ブロックエディターで使えるのは normal と side だけ |
priority |
high(既定)か low |
autosave |
自動保存の対象にするか(既定は false) |
fields |
フィールドの定義の配列 |
フィールドの主な設定
| キー | 内容 |
|---|---|
name |
入力欄のラベル |
id |
フィールドの識別子。投稿メタのキーとしてそのまま使われる |
type |
フィールドタイプ(text・number・url・select など) |
desc |
入力欄の下に出る説明 |
フィールドの id はメタキーになるため、他のプラグインやテーマと重ならないように、event_ のような接頭辞を付けておくと安全です。
ステップ3:テンプレートで値を表示する
保存した値は rwmb_meta() で取り出します。第1引数がフィールドの id、第3引数を省略すると現在の投稿が対象です。次のコードは single.php などのループ内で使う例です。
<?php
// single.php などのループ内(Meta Box が無効のときは何も出さない)
if ( function_exists( 'rwmb_meta' ) ) :
$venue = rwmb_meta( 'event_venue' );
$capacity = rwmb_meta( 'event_capacity' );
$format = rwmb_meta( 'event_format' );
$url = rwmb_meta( 'event_url' );
?>
<dl class="event-info">
<?php if ( $venue ) : ?>
<dt>会場</dt>
<dd><?php echo esc_html( $venue ); ?></dd>
<?php endif; ?>
<?php if ( '' !== (string) $capacity ) : ?>
<dt>定員</dt>
<dd><?php echo esc_html( number_format( (int) $capacity ) ); ?>名</dd>
<?php endif; ?>
<?php if ( $format ) : ?>
<dt>開催形式</dt>
<dd><?php rwmb_the_value( 'event_format' ); ?></dd>
<?php endif; ?>
<?php if ( $url ) : ?>
<dt>申込</dt>
<dd><a href="<?php echo esc_url( $url ); ?>">申込ページを開く</a></dd>
<?php endif; ?>
</dl>
<?php endif; ?>
ポイントは次の3つです。
- セレクトボックスの場合、
rwmb_meta()が返すのは保存された値(onlineなど)です。ラベル(「オンライン」)を表示したいときはrwmb_the_value()を使います。rwmb_the_value()は既定で値をそのまま出力します - 出力するときは
esc_html()・esc_url()でエスケープします function_exists( 'rwmb_meta' )で囲んでおくと、Meta Box を停止したときにテンプレートが致命的エラーで止まるのを防げます
プラグインに依存しない読み出し方
テキストや数値のような単一の値は、フィールドの id をメタキーとして wp_postmeta に保存されます。そのため、WordPress標準の get_post_meta() でも読み出せます。
<?php
// プラグインに依存しない読み出し(単一値のフィールド向け)
$venue = get_post_meta( get_the_ID(), 'event_venue', true );
if ( $venue ) {
echo '<p>会場: ' . esc_html( $venue ) . '</p>';
}
ただし、複数選択や複製(clone)を有効にしたフィールドは保存形式が変わるため、rwmb_meta() で読み出すほうが確実です。
うまくいかないときの確認点
- 入力欄が表示されない:編集画面の表示設定(ブロックエディターでは右上の「︙」から開く「設定」)で、メタボックスが非表示にされていないかを確認します。
post_typesに対象の投稿タイプが入っているかも確認します - ブロックエディターで表示位置が変わらない:
contextにafter_titleなどを指定しても、ブロックエディターではnormal(本文の下)かside(サイドバー)にしか表示されません - 値が表示されない:テンプレートの
rwmb_meta()に渡しているidが、登録したフィールドのidと一致しているかを確認します
注意点
- フィールドの
idを後から変えると、保存済みの値は古いメタキーに残ったまま読み出せなくなります。運用を始める前に名前を決めておきます - フィールドを大量に作ると、編集画面が重くなり、入力の手間も増えます。テンプレートで実際に使う項目だけに絞ります
- 本番サイトで試す前に、ステージング環境やローカル環境で表示と保存を確認しておくと安全です
まとめ
- Meta Box 本体はフィールドをコードで定義するフレームワーク。
rwmb_meta_boxesフィルターに配列を追加して返すと、入力欄と保存処理が用意される - 値は
rwmb_meta()で取り出し、セレクトボックスのラベルはrwmb_the_value()で表示する。出力時はエスケープする - 単一値のフィールドは
get_post_meta()でも読める。idは接頭辞付きで、運用開始後は変えない