Lightning Proのカスタム投稿タイプ個別ページでカスタムフィールドのリピーターフィールド表示

結論的には、子テーマfunctions.phpに以下の様なコードでOKです。念のため、普通のカスタムフィールドの表示もコードに含んでいます。親テーマLightning Proのフックlightning_entry_body_after と lightning_entry_body_before は、the_contentの後か前かということで使い別けとなります。新たにphpテンプレートファイルを作らないため、親テーマ更新の影響を受けずに開発出来ます。

/****************************************************************
* Custom Post : store
* Article Page 
****************************************************************/
add_filter('lightning_entry_body_after','nissy_store_article_page');
function nissy_store_article_page(){
    
	global $post;

	if ( $post->post_type === 'store' ){
                if($post->store_name){
		$store_article_html .= '<h2>店舗名</h2><p>' . esc_html( $post->store_name ) . '</p>';
                }
		if($post->store_message ){
		$store_article_html .= '<h2>店舗メッセージ</h2><p>' . esc_html( $post->store_message ) .'</p>';
		}
		if($post->store_address ){
		$store_article_html .= '<h2>住所</h2><p>' . esc_html( $post->store_address ) .'</p>';
                }
		if($post->store_tel){		
		$store_article_html .= '<h2>電話</h2><p>' . esc_html( $post->store_tel ) .'</p>';
		}

               if( have_rows('campaign_info') ):
                   $store_article_html .= '<h2>キャンペーン</h2>';
                   while ( have_rows('campaign_info') ) : the_row();
                       $store_article_html .= '<p>'. esc_html( get_sub_field('camp_date') ) .'</p>';
                       $store_article_html .= '<p>'. esc_html( get_sub_field('camp_txt') ) .'</p>';
                   endwhile;
               endif;

        echo $store_article_html ;

	}

}

カスタム投稿タイプとカスタムフィールドの設定値は以下の通りです。

カスタム投稿タイプ

店舗:store

カスタムフィールド

店舗名:store_name テキスト
店舗メッセージ:store_message テキストエリア
住所:store_address テキストエリア
電話:store_tel テキスト

リピーターフィールド

フィールド:キャンペーン情報 campaign_info
サブフィールド:日付 camp_date
サブフィールド:テキスト  camp_txt

カスタムフィールドのデータベース格納場所

wp_postmetaテーブルで合致するpost_id(投稿ID)のmeta_key(カスタムフィールド名)にmeta_valueとして格納されています。用意されている関数を使わず、独自にカスタムフィールドを取得したい場合、投稿IDを取得後、下記の様なSQLで取得可能です。

SELECT * FROM `wp_postmeta` WHERE `post_id` = 投稿ID AND `meta_key` LIKE 'カスタムフィールド名'

カスタムフィールドの繰り返しフィールドのデータベース格納ルール

繰り返しフィールド(リピーターフィールド)のサブフィールドもwp_postmetaテーブルで合致するpost_id(投稿ID)のmeta_key(カスタムフィールド名)にmeta_valueとして格納されますが、子供となるサブフィールドのmeta_keyは格納時に命名ルールがあります。

1つキャンペーン情報が登録されたとします。

親となるmeta_keyのcampaign_infoのmeta_valueには数字の1が格納され、新たに同じテーブルへ子供のmeta_key が campaign_info_0_ camp_date と campaign_info_0_ camp_txt として2行追加されます。子供側のmeta_keyに対するmeta_valueはこの追加された2行に格納されます。子供側のmeta_keyは原形と異なる文字列になっている事に注意が必要です。

同じ様に、2つ目のキャンペーン情報が追加されると、親となるmeta_keyのcampaign_infoのmeta_valueには数字の2が更新で格納され、新たに同じテーブルへmeta_key が  campaign_info_1_camp_date と campaign_info_1_camp_txt として2行追加されます。 同じ様に追加された2行にmeta_valueが格納されます。

親となるmeta_keyのcampaign_infoのフィールドに格納されるkey_valueの数値は1から始まる自然数で繰り返しの個数をあらわし、サブフィールドのmeta_keyで使われる採番は0から始まる正の整数であることに注意が要です。常に-1の差があります。

サブフィールドで使う関数、have_rows、the_row、the_sub_field、get_sub_fieldはこのあたりを加味して作られている関数ということになります。※Advanced Custom Field Proで検証しています。