カスタムフィールドの値を出力する
はじめに
WordPressには、投稿のタイトルや本文など以外に追加情報を登録できる「カスタムフィールド」という機能があります。このレシピでは、WordPress標準のカスタムフィールド欄から登録した値を出力する方法を説明します。
※ 標準のカスタムフィールドは、投稿画面などの上部にある「表示オプション」をクリックして表示される「カスタムフィールド」のチェックをONにすると表示されます。
チェックがONになると、カスタムフィールドの欄が投稿画面の本文欄の下側に表示されます。
標準の方法のため、「Advanced Custom Fields」などのプラグインで登録されたカスタムフィールドの場合は意図した通りに値が取得・出力できない場合があります。
出力の形式
カスタムフィールドの値を出力したいときは、single.phpなどのテンプレートファイル内の出力したい箇所に下記のように記載します。
1 |
echo esc_html( $post->カスタムフィールドの名前 ); |
値の取得部分が「 $post->カスタムフィールドの名前
」、出力部分が「echo esc_html( );
」です。
シンプルな例
カスタムフィールドとして「TEL」という項目を追加し、値を「000-000-0000」としたときを考えます。
この場合、下記のように「 echo esc_html( $post->TEL );
」というコードを追加することで「000-000-0000」の部分を出力することができます。
1 2 3 4 5 6 |
<!-- ループ --> <?php while ( have_posts() ) : the_post(); ?> <!-- カスタムフィールドのTELを出力 --> <?php echo esc_html( $post->TEL ); ?> <?php endwhile; ?> <!-- /ループ --> |
※「esc_html( )
」の部分は、カスタムフィールドの値に「<」や「>」といった文字が含まれていても文字のとおりに出力してくれるものです。もしカスタムフィールドの値に「<strong>000-000-0000</strong>
」のようにタグを登録して出力したい場合は、「esc_html( )
」の部分は取り除いてください。
※「 $post->カスタムフィールドの名前
」の形式の代わりに「 get_post_meta( $post->ID, 'カスタムフィールドの名前', true )
」という形式でも同じように値が取得できます。
結果
1 |
000-000-0000 |
値がある場合のみ他の文字なども合わせて出力する
「値が登録されている場合のみいろいろなタグなどを含めて値を出力したい」というような場合、下記のように記載します。
1 2 3 4 5 6 7 8 9 10 11 |
<!-- ループ --> <?php while ( have_posts() ) : the_post(); ?> <!-- カスタムフィールドのTELの値があれば出力 --> <?php if ( $post->TEL ) : ?> <dl> <dt>TEL</dt> <dd><?php echo esc_html( $post->TEL ); ?></dd> </dl> <?php endif; ?> <?php endwhile; ?> <!-- /ループ --> |
「if ( $post->カスタムフィールドの名前 ) :
」の部分は「もしカスタムフィールドの値があれば」という意味です。「if ( $post->カスタムフィールドの名前 ) :
」の部分から「endif;
」の部分までが、値がある場合のみ表示される部分になります。
※ 「:
」「endif;
」は「{
」「}
」でも同じ意味になります。
※ 「if ( $post->カスタムフィールドの名前 ) :
」とすると、カスタムフィールドの値が「0」だった場合に表示されなくて困る場合があります。PHPは「0」も「値がない」とみなしてしまうためです。厳密には、「カスタムフィールドの項目が設定されている」という意味で「if ( isset( $post->カスタムフィールドの名前 ) :
」などとする必要がありますが、まずは簡単なものを覚えてもらえばよいと思います。
結果
1 2 3 4 |
<dl> <dt>TEL</dt> <dd>000-000-0000</dd> </dl> |
1つの名前に登録された複数の値を出力する
カスタムフィールドは下記のように1つの名前で複数の値を登録することができます。
複数の値が登録されている場合、「 $post->カスタムフィールドの名前
」では最初の1つの値しか取得ができません。複数の値を取得するには、下記のような書き方に変わります。
1 |
get_post_meta( $post->ID, 'カスタムフィールドの名前', false ); |
例の「TEL」の場合、下記のように使用して出力します。
1 2 3 4 5 6 7 8 9 10 11 |
<!-- ループ --> <?php while ( have_posts() ) : the_post(); ?> <!-- カスタムフィールドのTELを出力 --> <dl> <dt>TEL</dt> <?php foreach ( get_post_meta( $post->ID, 'TEL', false ) as $tel ) : ?> <dd><?php echo esc_html( $tel ); ?></dd> <?php endforeach; ?> </dl> <?php endwhile; ?> <!-- /ループ --> |
※ foreach
の部分は get_post_meta( $post->ID, 'TEL', false )
で得られる「000-000-0000」「111-111-1111」の値を1つずつ $tel
にセットし、endforeach;
までの間に出力などに使うことができる、というPHPの機能です。PHPがまだよくわからない場合は定型文として覚えてしまったほうがよいかもしれません。
結果
1 2 3 4 5 |
<dl> <dt>TEL</dt> <dd>000-000-0000</dd> <dd>111-111-1111</dd> </dl> |
更新履歴
- 2016/09/15 「値がある場合のみ他の文字も含めて出力する」のチェック方法の説明を修正しました。(不要な部分がありました)
- 2016/02/16 初版