WordPressでは、カスタムフィールドを使って投稿や固定ページに任意の情報を追加できます。商品情報やイベントの詳細など、カスタムフィールドに入力があるかどうかで表示内容を切り替えることで、柔軟なコンテンツ設計が可能になります。
この記事でわかること
get_post_meta()で値を取得し、入力有無で表示を切り替える方法empty()が0や”0″も「未入力」扱いしてしまう罠と正しい判定方法- 価格・イベント日時での実用例
カスタムフィールドの値を取得する
まず、WordPressの関数 get_post_meta() を使用して、カスタムフィールドの値を取得します。
カスタムフィールドの値を取得
$custom_field_value = get_post_meta( get_the_ID(), 'custom_field_key', true );
ここで 'custom_field_key' は実際に使用しているカスタムフィールドのキー名に置き換えてください。get_post_meta() は、値が設定されていない場合は常に空文字列 '' を返します(null は返しません)。
値の有無で表示を切り替える
取得した値が設定されている場合にだけ表示を行いたい場合は、以下のように記述します。
値が設定されている場合だけ表示
$custom_field_value = get_post_meta( get_the_ID(), 'custom_field_key', true );
if ( $custom_field_value !== '' ) {
echo '<div class="custom-field">';
echo '<h3>カスタムフィールドのタイトル</h3>';
echo '<p>' . esc_html( $custom_field_value ) . '</p>';
echo '</div>';
}
empty()は0や”0″も「未入力」扱いしてしまう
empty($value) は、$value が空文字・null だけでなく、数値の0や文字列の"0" でも true になります。そのため !empty($value) で判定すると、「価格が0円」「在庫数が0」のような正当な値まで「未入力」と誤判定してしまいます。カスタムフィールドの未入力判定には $value !== ''(厳密な文字列比較)を使ってください。empty()の落とし穴全般についてはemptyで空かどうか確認する方法|0や”0″の落とし穴で詳しく解説しています。esc_html() による出力エスケープは、HTMLの不正な挿入を防ぐため必ず行ってください。値が未入力の場合に代替テキストを表示する
値が入力されていないときに「未入力」や「お問い合わせください」などのテキストを表示するには、三項演算子が便利です。
未入力時に代替テキストを表示
$custom_field_value = get_post_meta( get_the_ID(), 'custom_field_key', true ); $display_text = ( $custom_field_value !== '' ) ? esc_html( $custom_field_value ) : '未入力'; echo '<p>' . $display_text . '</p>';
実用例:価格が未入力なら「お問い合わせください」
商品ページなどで価格が入力されていない場合に代替文を表示する例です。0円(無料)という正当な価格も正しく表示されるように、!== '' で判定します。
価格が未入力の場合の表示(0円も正しく表示される)
$price = get_post_meta( get_the_ID(), 'price', true ); $display_price = ( $price !== '' ) ? esc_html( $price ) . '円' : 'お問い合わせください'; echo '<p>価格: ' . $display_price . '</p>';
もし!empty($price)で判定していたら
!empty($price) で判定した場合、価格が正当な0(無料)に設定された商品でもempty(0) が true になるため「お問い合わせください」と誤表示されます。!== '' であれば、0という値そのものは正しく「入力あり」と判定されます。実用例:イベント開催日が未定の場合の表示
イベント情報の開催日時がまだ未確定のときに「未定」と表示する例です。
イベント開催日が未入力の場合の表示
$event_date = get_post_meta( get_the_ID(), 'event_date', true ); $display_date = ( $event_date !== '' ) ? esc_html( $event_date ) : '未定'; echo '<p>開催日時: ' . $display_date . '</p>';
関連する条件分岐の注意点
empty()の0や”0″に関する落とし穴は、カスタムフィールドに限らずPHP全般で発生します。詳しくはemptyで空かどうか確認する方法|0や”0″の落とし穴とisset・””の使い分けを参照してください。
よくある質問(FAQ)
Qカスタムフィールドに値があれば表示、なければ別のHTMLを表示するコードは?
A
$value = get_post_meta($post_id, 'field_key', true); if ($value !== '') { echo '
' . esc_html($value) . '
'; } else { echo '
未設定
'; }
という条件分岐で実現できます。QACF(Advanced Custom Fields)で同様の条件分岐をするには?
A
if (get_field('field_name')) { echo get_field('field_name'); }という形でACFのget_field()を使います。the_field()は直接出力するため条件分岐には使えません。Qカスタムフィールドの値が0や”0″でもempty()がtrueになる問題の対処法は?
A
empty()ではなく$value !== ''(厳密な文字列比較)を使ってください。get_post_meta()は値が無い場合に必ず空文字列''を返すため(nullは返しません)、!== ''による比較が正確に機能します。まとめ
- 基本:
get_post_meta()で取得し、値の有無で表示を切り替える - 注意:
empty()は0や”0″も「未入力」扱いしてしまう - 正しい判定:
$value !== ''(厳密な文字列比較)を使う - 出力時:必ず
esc_html()でエスケープする
「0円」「在庫0」のような正当な値まで未入力扱いにしてしまわないよう、判定方法には注意してカスタムフィールドを活用してください。

