【WordPress】カスタムフィールドの入力有無に応じて表示を切り替える方法|empty()の0/”0″の罠に注意

【WordPress】カスタムフィールドの入力有無で表示を動的に変更する方法 WordPress

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)で同様の条件分岐をするには?
Aif (get_field('field_name')) { echo get_field('field_name'); }という形でACFのget_field()を使います。the_field()は直接出力するため条件分岐には使えません。
Qカスタムフィールドの値が0や”0″でもempty()がtrueになる問題の対処法は?
Aempty()ではなく$value !== ''(厳密な文字列比較)を使ってください。get_post_meta()は値が無い場合に必ず空文字列''を返すため(nullは返しません)、!== ''による比較が正確に機能します。

まとめ

  • 基本get_post_meta()で取得し、値の有無で表示を切り替える
  • 注意empty()は0や”0″も「未入力」扱いしてしまう
  • 正しい判定$value !== ''(厳密な文字列比較)を使う
  • 出力時:必ずesc_html()でエスケープする

「0円」「在庫0」のような正当な値まで未入力扱いにしてしまわないよう、判定方法には注意してカスタムフィールドを活用してください。