またまたAdvanced Custom Fields関連。
記事をインポートしただけだと、ラベルが表示できない
以前書いた「カスタムフィールドの値を全部出す」のように、キーだけ指定してラベルは連動して取得していたのですが、
<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>
これだと、インポート直後にはラベルが取得できないです。
※記事を保存したタイミングでラベルが追加されるため。
10件20件なら記事を全部開いて更新しても良いのですが、、、
回避策1 – 出力方法を変える
$cf_data = [
'item_name' => '商品名',
'item_price' => '価格(税込み)',
'item_maker' => 'メーカー',
];
foreach( $cf_data as $key => $value ){
if( get_post_meta( $post->ID, $key, true ) ){
if( !empty( $value ) ){
$label = '<span class="cf-data-element-label">' . $value . '</span>';
}else{
$label = '';
}
echo '<p class="cf-data-element cf-data-element-' . $key . '">' . $label . '<span class="cf-data-element-body">' . get_post_meta( $post->ID, $key, true ) . '</span></p>';
}
}
※tableからp・spanに変更していますがたまたまです。
ラベルを手書きしているので手間は増えます。
※ラベル出力が必要ないフィールドなら「’商品名’」⇒「”」のようにします。
※内容が画像だったりするならば、
if( $key === 'item_image' ){
echo apply_filters( 'the_content', get_post_meta( $post->ID, $key, true ) );
}else{
echo get_post_meta( $post->ID, $key, true );
}
などに変更。
ま、ACFのための手間なので、「get_field( $key );」でいいか。
回避策2 -インポートをReally Simple CSV Importerで行う
以前から、インポートにはこのプラグインを使わせてもらっていましたが、今回のケースで改めて調べてみると、「やっぱりこれだな!」でした。
開発者様の記事
Really Simple CSV Importer 日本語解説&カスタマイズ例
あらかじめ、ラベルを保存する項目を指定しておきます。
/* ----------
functions.php
インポート時、カスタムフィールドのラベルを取得
---------- */
function really_simple_csv_importer_all_update( $post ){
$_postID = $post->ID;
$_item_name = get_post_meta( $_postID, 'item_name', true );
update_field( 'item_name', $_item_name, $_postID );
$_item_price = get_post_meta( $_postID, 'item_price', true );
update_field( 'item_price', $_item_price, $_postID );
$_item_maker = get_post_meta( $_postID, 'item_maker', true );
update_field( 'item_maker', $_item_maker, $_postID );
}
add_filter( 'really_simple_csv_importer_post_saved', 'really_simple_csv_importer_all_update', 5, 3 );
これで、インポート直後からラベルが取得できます。
キーごとに書き換える項目が3つあるので、変数にしておいた方がよさそう。試してないけど。
何らかの事情で出力側を変更できない場合は、こちらを選択することになると思います。
あっちこっちに出力文が散乱してる、とか。