採用情報とか店舗情報、商品情報など、フィールドがいっぱいあるような投稿を出力する場合、フィールド一つひとつ記述するのがとっても面倒臭い。
ので、よく見かける「カスタムフィールドの値をすべて出力する」のACF版を用意。
出力
<table><tbody>
<?php
$fields = get_post_custom();
if( $fields ){
ksort( $fields );
foreach ( $fields as $key => $value ) {
if( !( preg_match( "/^_/", $key ) ) ){
if( !empty( $value[0] ) ){
$fieldlabel = get_field_object( $key );
echo '<tr>';
echo '<th>' . esc_html( $fieldlabel[ 'label' ] ) . '</th><td>' . get_field( $key ) . '</td>';
echo '</tr>';
}
}
}
}
?>
</tbody></table>
フィールドのID順に並ばれても困るので、「ksort()」で並んでもらいます。
よって、フィールド名(ラベルじゃない)を、並べたい順に連番する必要があります。
- itemdata_1_name
- itemdata_2_price
- itemdata_3_maker
みたいな感じ。
ACFの管理画面で並べ替えてもIDが変わるnameが変わるわけではないので注意
キー名はラベルに変換。
ACFを使っていない場合は
「get_field( $key )」を
- 「$value[0]」
- 「get_post_meta( $post->ID, $key, true )」
- 「apply_filters( ‘the_content’, get_post_meta( $post->ID, $key, true ) )」
などに変えればOK。
キーごとに出力文を書くか、キーに連番を振るか、
既にデータが入力されている場合、キー名は変えられないのでキーごとに出力文を書くしかないですね。
「順番は気にしない」なんてことは無いでしょうから。
新規サイトの場合は連番を振ってから入力していけばいいのですが、
とか出てくると、もうダメ。
ならば、
- itemdata_100_name
- itemdata_200_price
- itemdata_300_maker
のようにマージンを取っておけば何とかなる。
「自動で値を全部出す」をやめれば
出したいフィールドを指定するのであれば、連番とかキー名とか一切気にしなくて済む。
<table><tbody>
<?php
$field_names = array( 'item_name', 'item_price', 'item_maker' );
foreach ( $field_names as $field_name ) {
if( get_post_meta( $post->ID, $field_name, true ) ){
$field_label = get_field_object( $field_name );
echo '<tr class="' . $field_name . '">';
echo '<th>' . esc_html( $field_label[ 'label' ] ) . '</th><td>' . get_field( $field_name ) . '</td>';
echo '</tr>';
}
}
?>
</tbody></table>
「$field_names」に、出したいフィールドの名前を、出したい順に書き連ねておく。
フィールドごとに見た目を変えたいこともあるので、クラス名も追加。
結局、大抵の場合これだけで済みそうな気がしてきた。