ACF – get fields from group

i have been using this code to get all fields from a specific group:

<?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'];

    }
}
?>

but it displays only fields’ names. doesnt there exist a simple hook/function, something like this: get_all_fields_from_group($id)

Related posts

Leave a Reply

6 comments

  1. Thank you so much for your post, I spent half day to figure out how to get field names by their group.

    If you have field names, you can easily get their values: get_field($field[‘name’]);

    EXAMPLE HOW TO GET IMAGES FOR SLIDER

        <?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']."'/>";
    
    
                            }
                        }
    
    ?> 
    

    Thanks again!

  2. I’m surprised no one mentioned acf_get_fields('someGroupId') yet.

    /**
     * acf_get_fields
     *
     * Returns and array of fields for the given $parent.
     *
     * @date    30/09/13
     * @since   5.0.0
     *
     * @param   (int|string|array) $parent The field group or field settings. Also accepts the field group ID or key.
     * @return  array
     */
    
  3. Here’s a function I created to get a group’s fields:

    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;
    }
    
  4. In case anyone stumbled upon this page like I did, and tried to figure this out, these methods won’t work anymore with Version 5 and above of Advanced Custom Fields as it’s usings posts instead of postmeta.

    In that environment, this is the way I was able to get fields from a group and use them as values for a select field:

    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');
    
  5. Since ACF uses custom posts of type ‘acf’ as groups, we can use get_page_by_title to retrieve the group’s ID, and then do the rest. Here’s a small utility function:

    // 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
    }
    

    Usage:

    $group_fields = get_group_fields('My marvelous group');
    
    foreach($group_fields as $field){
       $label = $field['label'];
       $value = $field['value'];
       // etc...
    }
    
  6. If someone is still searching.
    You can just do it like this:

    <?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>';
            }
          }
    ?>