ACF(Advanced Custom Fields)プラグインでは有料の機能になっているリピーターフィールド(繰り返しフィールド)。これを何とか自力で実装できないかと調べていたところ、以下ページにありがたいコードが公開されていました。

Creating a “repeater meta-box” without a Plugin in WordPress」 - GitHub

まあコードの検証はさておき(ダメ?)早速テーマのfunctions.phpへ追加して試したら、おおおーーーっ、きちんと繰り返しフィールドが登録できるじゃないですか!!

でふと疑問が...この値ってどうやって取り出すんだ??

そうなんです、1つのカスタムフィールド名(メタキー)に1つの値がある場合は、以下の方法でショートコードを使って簡単に出力できます。

そして、カスタムフィールドを簡単に管理できて、繰り返しフィールドも作れる「Custom Field Suite」プラグインを使った場合には、以下の方法で出力できます。

ただ、「Custom Field Suite」プラグインの場合は、1メタキーに1つの値があるものを複数作るという形なので、上記の方法で呼び出せるのですが、今回のコードではACFのように繰り返しフィールドのメタキーに対して配列で保存されるようになっているんです。

ちなみに、データベース上でこんな風に保存されています。

a:2:{i:0;a:2:{s:9:"TitleItem";s:15:"リピート1";s:16:"TitleDescription";s:28:"   リピート1の内容 ";}i:1;a:2:{s:9:"TitleItem";s:15:"リピート2";s:16:"TitleDescription";s:26:" リピート2の内容 ";}}

冒頭のGitHubのコードをそのまま流用した場合、以下のようにデータが作成されます。

メタキーcustomdata_group
タイトルTitleItem
内容TitleDescription

つまり追加するごとに「TitleItem」と「TitleDescription」のデータがセットで次々に保存されていくようになっています(例では「リピート1」「リピート2」というタイトルの2つの繰り返し入力があります)。

この中から、内容(TitleDescription)にあるデータだけを、ショートコードでリスト表示させよう!というのが本ページの内容です。

自身のメモも兼ねて公開します。

コードは例ですので、もっとスマートかつ正しい方法があるかも知れませんので、参考としてご覧ください

配列で保存されているカスタムフィールドの値をリストで取り出すコード例

回答例となるのが以下のコードです。

function sample_repeat_field_sc_test(){
$meta_data_all = get_post_meta( get_the_ID(), 'customdata_group', true );

ob_start();
echo '<ul>';
foreach( $meta_data_all as $meta_data){
echo '<li>'.$meta_data['TitleDescription'].'</li>';
}
echo '</ul>';
return ob_get_clean();
	
}
add_shortcode('sample-r-field','sample_repeat_field_sc_test');

とてつもなく簡単なコードでできてしまいました(笑)。

機能としては、投稿の本文の任意の場所へ

[sample-r-field]

というショートコードを入れると、「customdata_group」というメタキーにある「TitleDescription」の値をul(リスト)タグを使って一覧出力するという動作をします。

下図が実際に表示させてみたものです。

配列で保存されている繰り返しフィールドの値をショートコードで表示する方法(メモ)|Personal WP Customization Notes (PWCN)

コードの簡単な説明

以下に先ほどのコードを色付でちょっとわかりやすく表示します。

function sample_repeat_field_sc_test(){
$meta_data_all = get_post_meta( get_the_ID(), 'customdata_group', true );

ob_start();
echo '<ul>';
foreach( $meta_data_all as $meta_data){
echo '<li>'.$meta_data['TitleDescription'].'</li>';
}
echo '</ul>';
return ob_get_clean();
	
}
add_shortcode('sample-r-field','sample_repeat_field_sc_test');

まずは、冒頭のリピーターフィールドを作るコードの「customdata_group」というメタキーのデータを「get_post_meta」関数で取り出して、「$meta_data_all」という変数に格納します。

次にこのデータの中から「TitleDescription」の部分を取り出し、foreachで回して入力されている回数だけ取り出して、前後をリストタグで囲みます。

上記の例では、foreachを使って「$meta_data_all」で取り出した配列の1つ1つを「$meta_data」として、「TitleDescription」を入力されている回数だけ取り出しなさいという指示をしています。

そして、foreachの前後にulタグを入れて、リストを完成させています。

最後に前後を「ob_start();」「return ob_get_clean();」で囲んで、ショートコードが入力されている場所に出力しなさいというおまじないをしています。

この記述をしないと、ショートコードの挿入位置ではなく、ページの冒頭に一覧が表示されてしまいます

あとは、ユーザー定義関数化して、add_shortcodeでショートコード化するという処理をしています。