web-dev-qa-db-ja.com

ACF - グループからフィールドを取得

私は特定のグループからすべてのフィールドを取得するためにこのコードを使っています:

<?php
$GroupOrPostSlug = 'acf_specialgroup';
//or insert the ID of your fields Group.
$groupID='';



global $wpdb;
if (empty($groupID))
{$groupID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name =  '$GroupOrPostSlug' ");}
if (empty($groupID))
{$groupID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title =  '$GroupOrPostSlug' ");}

$custom_field_keys = get_post_custom_keys($groupID);
foreach ( $custom_field_keys as $key => $fieldkey )
{
    if (stristr($fieldkey,'field_'))
    {
        //echo $key . " => " . $fieldkey . "<br />";
        //echo $field['label'] . ': ' . $field['value'];
        //echo $fieldkey . "<br />";
        $field = get_field_object($fieldkey, $groupID);
        echo $field['label'];

    }
}
?>

しかし、それはフィールドの名前だけを表示します。このような単純なフック/関数は存在しません。get_all_fields_from_group($id)

5
T.Todua

あなたの投稿を本当にありがとう、私は彼らのグループによってどのようにフィールド名を得るかを理解するために半日を費やしました。

フィールド名がある場合は、それらの値を簡単に取得できます。get_field($ field ['name']);

スライダーの画像を取得する方法の例

    <?php 
                    //or insert the ID of your fields Group.
                    $groupID='116';
                    $custom_field_keys = get_post_custom_keys($groupID);
                    foreach ( $custom_field_keys as $key => $fieldkey )
                    {
                        if (stristr($fieldkey,'field_'))
                        {
                            //echo $key . " => " . $fieldkey . "<br />";
                            //echo $field['label'] . ': ' . $field['value'];
                            //echo $fieldkey . "<br />";
                            $field = get_field_object($fieldkey, $groupID); 

                            $acf_field_name = $field['name'];

                            $attachment = get_field($acf_field_name);
                            echo "<img src='".$attachment['url']."' title='".$attachment['title']."'/>";


                        }
                    }

?> 

再度、感謝します!

9
Dejan

これは私がグループのフィールドを取得するために作成した関数です:

function my_acf_get_fields_in_group( $group_id ) {
    $acf_meta = get_post_custom( $group_id );
    $acf_fields = array();

    foreach ( $acf_meta as $key => $val ) {
        if ( preg_match( "/^field_/", $key ) ) {
            $acf_fields[$key] = $val;
        }
    }

    return $acf_fields;
}
3

ACFはグループとしてタイプ 'acf'のカスタム投稿を使用するので、グループのIDを取得するためにget_page_by_titleを使用して、残りを実行できます。これは小さな効用関数です:

// This was tested with ACF free edition v4.4.11
function get_group_fields($group_name){
  $group = get_page_by_title($group_name, OBJECT, 'acf');
  if(empty($group)) return false;

  $meta = get_post_meta($group->ID);
  $acf_fields = array();

  foreach($meta as $key => $value){
    $acf_meta_key = stristr($key,'field_'); // acf fields all start with "field_"
    if($acf_meta_key) $acf_fields[] = get_field_object($key);
  }

  return $acf_fields; // returns an array of field objects
}

使用法:

$group_fields = get_group_fields('My marvelous group');

foreach($group_fields as $field){
   $label = $field['label'];
   $value = $field['value'];
   // etc...
}
1
Luca Reghellin

私がやったように誰かがこのページに出くわしてこれを見つけようとした場合、postmetaの代わりにpostを使っているのでこれらの方法はAdvanced Custom Fieldsのバージョン5以降ではもううまくいきません。

その環境では、これは私がグループからフィールドを取得し、選択フィールドの値としてそれらを使用することができた方法です:

function acf_load_select_choices( $field ) {

  global $wpdb;
  $group_slug = 'Name or slug of the group';

  $group_ID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name =  '$group_slug' "); 
  if (empty($group_ID))
    $group_ID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title =  '$group_slug' ");

  $field['choices'] = array();
  $fields = acf_get_fields_by_id($group_ID);

  // to see what $fields contains, use:
  echo '<pre>'.var_dump($fields).'</pre>';

  if( $fields ) {
    foreach( $fields as $fieldrow ) {
      $field['choices'][ $fieldrow['name'] ] = $fieldrow['label'];
    }
  }

  return $field;

}

add_filter('acf/load_field/name=selectfieldname', 'acf_load_select_choices');
1
ionfish

誰かがまだ探しているなら。あなたはちょうどこれのようにそれをすることができます:

<?php 

      $fields = get_field_objects();

      if( $fields )
      {
        foreach( $fields as $field_name => $field )
        {
            echo '<div>';
                echo '<h3>' . $field['label'] . '</h3>';
                echo $field['value'];
            echo '</div>';
        }
      }
?>
0
Artemiy Egorov