ACF 記事インポート時のフィールドラベル

ワードプレス

またまた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で行う

以前から、インポートにはこのプラグインを使わせてもらっていましたが、今回のケースで改めて調べてみると、「やっぱりこれだな!」でした。

 

開発者様の記事

 

あらかじめ、ラベルを保存する項目を指定しておきます。

/* ---------- 
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つあるので、変数にしておいた方がよさそう。試してないけど。

 

何らかの事情で出力側を変更できない場合は、こちらを選択することになると思います。

あっちこっちに出力文が散乱してる、とか。