Output Fields Of Entire Group Advanced Custom Fields

I’m trying to find a way (using the wordpress plugin ACF) to output an entire group of fields.

I have two “Field Groups” and I want to say if either of them is “Active” (with a checkbox) to echo them to my template.

Read More

The question is, how do I get an array of all the fields data from one “Field Group”?

Right now I am attempting something like the following:

<?php

$group_ID = 37;

$fields = array();
$fields = apply_filters('acf/field_group/get_fields', $fields, $group_ID);

echo "<pre>";
print_r($fields);
echo "</pre>";

?>

It outputs an array of fields but as far as I can tell it contains no actual data:

Array
(
    [0] => Array
        (
            [key] => field_537b79d92081f
            [label] => Active-1
            [name] => active-1
            [_name] => active-1
            [type] => true_false
            [order_no] => 0
            [instructions] => 
            [required] => 0
            [id] => acf-field-active-1
            [class] => true_false
            [conditional_logic] => Array
                (
                    [status] => 0
                    [rules] => Array
                        (
                            [0] => Array
                                (
                                    [field] => null
                                    [operator] => ==
                                )

                        )

                    [allorany] => all
                )

            [message] => 
            [default_value] => 0
            [field_group] => 37
        )

    [1] => Array
        (
            [key] => field_537b78a4c743e
            [label] => Title-1
            [name] => title-1
            [_name] => title-1
            [type] => text
            [order_no] => 1
            [instructions] => 
            [required] => 0
            [id] => acf-field-title-1
            [class] => text
            [conditional_logic] => Array
                (
                    [status] => 0
                    [rules] => Array
                        (
                            [0] => Array
                                (
                                    [field] => field_537b79d92081f
                                    [operator] => ==
                                    [value] => 1
                                )

                        )

                    [allorany] => all
                )

            [default_value] => 
            [placeholder] => 
            [prepend] => 
            [append] => 
            [formatting] => html
            [maxlength] => 
            [field_group] => 37
        )

    [2] => Array
        (
            [key] => field_537b78c6c743f
            [label] => Info-1
            [name] => info-1
            [_name] => info-1
            [type] => textarea
            [order_no] => 2
            [instructions] => 
            [required] => 0
            [id] => acf-field-info-1
            [class] => textarea
            [conditional_logic] => Array
                (
                    [status] => 0
                    [rules] => Array
                        (
                            [0] => Array
                                (
                                    [field] => field_537b79d92081f
                                    [operator] => ==
                                    [value] => 1
                                )

                        )

                    [allorany] => all
                )

            [default_value] => 
            [placeholder] => 
            [maxlength] => 
            [rows] => 
            [formatting] => br
            [field_group] => 37
        )

)

I would like to basically do the following (excuse the sudo/broken code, PHP isn’t my language):

<?php

    $group_ID1 = 37;

    $fields = array($group_ID1);

    if ($fields1['active'] !== null) {
        echo "<h1>";
        echo $fields1['active']['text'];
        echo $fields1['title']['text'];
        echo $fields1['content']['text'];
        echo "<h1>";
    }

    $group_ID2 = 38;

    $fields2 = array($group_ID2);

    if ($fields2['active'] !== null) {
        echo "<h1>";
        echo $fields2['active']['text'];
        echo $fields2['title']['text'];
        echo $fields2['content']['text'];
        echo "<h1>";
    }

?>

I can also get a specific fields data like below:

<?php

    $field_key = "field_537b78c6c743f";
    $field = get_field_object($field_key);

    if($field) {
        echo "<pre>";
        print_r($field);
        echo "</pre>";
    }

?>

Which outputs the following:

Array
(
    [key] => field_537b78c6c743f
    [label] => Info-1
    [name] => info-1
    [_name] => info-1
    [type] => textarea
    [order_no] => 2
    [instructions] => 
    [required] => 0
    [id] => acf-field-info-1
    [class] => textarea
    [conditional_logic] => Array
        (
            [status] => 0
            [rules] => Array
                (
                    [0] => Array
                        (
                            [field] => field_537b79d92081f
                            [operator] => ==
                            [value] => 1
                        )

                )

            [allorany] => all
        )

    [default_value] => 
    [placeholder] => 
    [maxlength] => 
    [rows] => 
    [formatting] => br
    [field_group] => 37
    [value] => testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
)

But do I really need to call each field key for each “Field Group”? Is there not an array of all the fields in one “Field Group”?

Related posts

Leave a Reply

3 comments

  1. You can get array of all the fields, belonging to one group. The function is:

    $acf_fields = acf_get_fields_by_id( $group_ID );
    

    We need to know ACF field group ID. You can find it in url on group edit page, for example:

    http://site.ru/wp-admin/post.php?post=340&action=edit
    

    In this case group ID is 340. If you don’t want to use hardcoded ID (if your groups are changing from time to time), you can get it, using group name (in this example group name id Technic CPT):

    global $wpdb;
    $group_ID = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_title = 'Technic CPT'" );
    

    Output wil look like this:

    array(1) {
      [0] => array(29) {
        ["ID"] => int(366)
        ["key"] => string(19) "field_55f05295a59ca"
        ["label"] => string(29) "Gallery of technic"
        ["name"] => string(15) "technic_gallery"
        ["prefix"] => string(0) ""
        ["type"] => string(7) "gallery"
        ["value"] => NULL
        ["menu_order"] => int(6)
        ["instructions"] => string(155) "Field instructions"
        ["required"] => int(0)
        ["id"] => string(0) ""
        ["class"] => string(0) ""
        ["conditional_logic"] => int(0)
        ["parent"] => int(340)
        ["wrapper"] => array(3) {
          ["width"] => int(50)
          ["class"] => string(0) ""
          ["id"] => string(0) ""
        }
        ["_name"] => string(15) "technic_gallery"
        ["_input"] => string(0) ""
        ["_valid"] => int(1)
        ["min"] => string(0) ""
        ["max"] => int(10)
        ["preview_size"] => string(9) "thumbnail"
        ["library"] => string(3) "all"
        ["min_width"] => int(475)
        ["min_height"] => int(365)
        ["min_size"] => string(0) ""
        ["max_width"] => string(0) ""
        ["max_height"] => string(0) ""
        ["max_size"] => int(2)
        ["mime_types"] => string(0) ""
      }
    }
    
  2. I used the following approach to get what I wanted:

    <?php
        // Get wordpress page all fields
        $post_id = get_the_ID();
        $fields = get_field_objects($post_id);
    ?>
    
    <?php
        // Remember Widget
        $status = $fields['remember-status']['value'];
        $text = $fields['remember-text']['value'];
        if ($status == TRUE) {
            echo "<div class="info-container">";
                echo "<p>" . $text . "</p>";
            echo "</div>";
        };
    ?>
    
  3. Filter acf/field_group/get_fields does not seem to load the fields.

    You have to load them after getting them, but it is a good idea to check if the value is set or not before you try to load them, in case anything has changed 🙂

    You can use acf/load_value and possibly acf/format_value filters to get desired output.

    I have created this little loader function which gets reference to array of ACF fields got by acf/field_group/get_fields filter, loops through them and loads (and formats) their values if necessary:

    function my_load_ACF_fields_values( &$ACF_FIELDS, $post_id = null ){
      if( empty($ACF_FIELDS) ) return false;
      if( empty($post_id) ) $post_id = get_the_ID();
    
      foreach( $ACF_FIELDS as &$acf_field ){
        if( !isset($acf_field['value']) ){
           $acf_field['value'] = apply_filters('acf/load_value', false, $post_id, $acf_field);
           $acf_field['formatted_value'] = apply_filters(
              'acf/format_value', $acf_field['value'], $post_id, $acf_field
           );
        }
      } 
      return true;
    }
    

    So the usage is then following:

    //1. GET FIELDS BY GROUP ID
    $my_acf_fields = apply_filters('acf/field_group/get_fields', [], $my_acf_GROUP_ID);
    
    //2. LOAD/INJECT THEIR VALUES
    my_load_ACF_fields_values( $my_acf_fields /*, $possiblyCustomPostID */ );
    
    //3. Display/Process fields...
    

    NOTE: Please note, that I know loading values one-by-one isn’t such a great idea, sadly ACF’s api does not seem to have better way and on top of all it seems the plugin does this itself for ACF’s native display…