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.
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”?
You can get array of all the fields, belonging to one group. The function is:
We need to know ACF field group ID. You can find it in url on group edit page, for example:
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):
Output wil look like this:
I used the following approach to get what I wanted:
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 possiblyacf/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:So the usage is then following:
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…