サポート » 使い方全般 » ACFで作成したフィールのサブフィールドをカンマ区切り取得したい

  • 解決済 photographer hiro.

    (@mura0403)


    お世話になります。

    現在、アドバンスドカスタムフィールを使用して
    オプションページをを作成しています。

    作成したフィールドからサブフィールドをカンマ(,)区切りで取得したいと思っております。
    whileやforeachなどを使用しないで取得は可能でしょうか。

    ソース

    <?php
    if( have_rows('keyword-group-cafe', 'option') ):
    $ky =get_field('keyword-group-cafe', 'option');//seb_field -> 'meta-keyword'
    endif;
    ?>

    array(3) {
      [0]=>
      array(1) {
        ["meta-keyword"]=>
        string(9) "ランチ"
      }
      [1]=>
      array(1) {
        ["meta-keyword"]=>
        string(15) "ケーキ"
      }
      [2]=>
      array(1) {
        ["meta-keyword"]=>
        string(9) "カフェ"
      }
    }

    下のような取り方やループを取得は可能ですが
    思った方法が取得できず、苦戦しています。

    $ky[0]['meta-keyword']

    よろしくお願い致します。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • x743

    (@x743)

    ACFのRepeaterかFlexible Contentをお使いですか?

    それなら『have_rows』に対応するのは『get_sub_field』ではないでしょうか。

    whileやforeachなどを使用しないで取得

    これは難しいのではないかと思います。

    トピック投稿者 photographer hiro.

    (@mura0403)

    x743様

    ご回答ありがとうございましす。
    ACFのPro版を使っています。

    それなら『have_rows』に対応するのは『get_sub_field』ではないでしょうか。
    これは難しいのではないかと思います。

    やっぱりそうですよね。
    ひょっとしたら「array_xxx()」とか使ってできないかななんと思ってしまいました。

    ループを使用しますの、どうしても自分の中で
    流れが美しくないと感じてしまして(めんどくさいのもあります。。。)

    結果としては表示されてるのですが
    模索しております。

    jdbb

    (@jdbb)

    phpのバージョン依存になりますが

    $meta_keywords = array_map(function($custom_field_value) {
      return $custom_field_value['meta-keyword'];
    }, $ky);

    をimplodeでつないでやればいけなくもないです。
    クロージャが使えなければ別関数用意してevalみたいなので。

    ただパッと見で分かりにくいのでループで回したほうがやはりいいかと思います。

    トピック投稿者 photographer hiro.

    (@mura0403)

    jdbb様
    ご回答ありがとうございます。

    たとえばなんですけど
    最終ときには、下の感じにしたいのですが可能なものでしょうか。

    $keyword = sub_field1,sub_field2,sub_field3,・・・・・・・・
    恐れ入ります、よろしくお願い致します。

    トピック投稿者 photographer hiro.

    (@mura0403)


    ループした時の場合です。

    x743

    (@x743)

    jdbbさんの提案を少し変更して

    $keyword = implode(',', array_map('current', $ky));

    これでもいけると思います。

    実際はDBを直接説叩けばループを使用しないでRepeaterなどの値を取得することは出来るかと思います。

    $fields = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE post_id = %d AND meta_key LIKE %s", $post_id, $field_key), ARRAY_N);

    これを前述のimplodeで繋げば同じような出力になりますし、

    $fields = $wpdb->get_row($wpdb->prepare("SELECT group_concat(meta_value separator ',') AS meta_value FROM $wpdb->postmeta WHERE post_id = %d AND meta_key LIKE %s", $post_id, $field_key), OBJECT);

    いっそのことgroup_concatで繋げちゃってもいいと思います。

    Repeaterなどのmeta_keyは{リピーターフィルド名}_{オフセット}_{サブフィールド名}などというようにフォーマットが決まっていますので、それに合わせてLIKEで探索させるという感じです。

    とは言え、美しさなら、Wordpress関数に合わせた仕様になっているhave_rows, the_row, get_sub_fieldのマニュアル通りの組み合わせで取得や結合をしていくのがベターだと思います。

    $ky[0][‘meta-keyword’]

    最初に示されたような形式で値が取得できているのなら、foreachで回してカンマをくっつければいいのではないでしょうか(implodeで繋げてもいいと思います)。

    トピック投稿者 photographer hiro.

    (@mura0403)

    jdbb様
    x743様

    いろいろとありがとうございます。
    なるほどです。
    色々と勉強させて頂きました。
    本当にありがとうございました。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「ACFで作成したフィールのサブフィールドをカンマ区切り取得したい」には新たに返信することはできません。