配列で保存されている繰り返しフィールドの値をショートコードで表示する方法

公開日:2023(令和5)年3月28日/最終更新日:

WordPress Create Shortcodes | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています



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)にあるデータだけを、ショートコードでリスト表示させよう!というのが本ページの内容です。

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

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

本ページで掲載しているコードは、以下に了承した上で使用ください

  • コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
  • コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
  • コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
  • コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
  • 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
  • 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)

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

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

function pwcn_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>'.esc_html($meta_data['TitleDescription']).'</li>';
}
echo '</ul>';
return ob_get_clean();
	
}
add_shortcode('pwcn-r-field','pwcn_repeat_field_sc_test');

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

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

[pwcn-r-field]

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

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

配列として保存されているカスタムフィールドの値をショートコードで出力した結果の画像

コードの簡単な説明

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

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でショートコード化するという処理をしています。

, , , , , , , , , , , , , , , , , , , , , , ,



Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Create Shortcodes | Personal WP Customization Notes (PWCN)
カスタムフィールドに保存した値を投稿本文内へショートコードで呼び出すコード