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で検証しています。