so ACF gets the entire group field as an array
is simply returning one element of that returned array. So yes, this could create extra work if you do not want to get the entire group and all of its sub fields.
Basically what you are doing is a shortcut for
$array = get_field('group_field'); value = $array['sub_field'];
Thank you for the explication.
I’ve also seen that
get_field('field')['subfield'] does not work very well when working with an image subfield in a custom block.
$groupA_image = get_field( 'groupA')['img']; $groupA_imgUrl = $groupA_image[ 'sizes' ][ 'large' ];
$groupA_image = get_field( 'groupA_img' ); $groupA_imgUrl = $groupA_image[ 'sizes' ][ 'large' ];
I don’t know why this does not work in the case of an image sub field. The only thing that I can think of is that when called that way the format_value method of the image field is not being run for some reason. Exactly what is returned by this:
$groupA_image = get_field( 'groupA')['img']; var_dump($groupA_image);
I personally do not use shortcuts of this nature because I feel that it makes it harder to understand what’s going on when I have to look at it again in 6 months or a year.
To be honest, I don’t event use the shortcut of
when getting the sub field of a group because when I look at this code in 6 months or a year I want to know that I’m looking at code for a group field.
Another reason is the possibility of unpredictable results, like in this case, that might break the site after an update.
Sorry, I didn’t mean to imply anything other than I don’t use shortcuts. I’m sure if I wanted to spend several hours stepping through the code I could figure out what it works in some cases and does not in others but I would rather not.
To answer your question, I would likely do what I posted above
// get group $group_value = get_field('group_field_name'); // get the image $image = $group_value['image_sub_field_name']; // get the url $url = $image['sizes']['large']; // or I might shorten the above two lines to something like this $url = $group_value['image_sub_field_name']['sizes']['large'];
If we really want to get down to what I would do, I would not return an image array for an ACF image field to begin with. Why? Because getting the details for every size of an image causes extra work to be done. This extra work will not be noticed for 1 image field but if you have 10 image fields all returning this information then there would likely be a performance hit. If the only image size I am going to use it “large” then I would return the image ID and then get the other information I need using built in WP functions, something like this.
$group_value = get_field('group_field_name'); // image field set to return image ID $image_id = $group_value['image_sub_field_name']; // get only the image size I need $image = wp_get_attachment_image_src($image_id, 'large'); $image_url = $image; // get the alt for image $image_alt = get_post_meta($image_id, '_wp_attachment_image_alt', true); // etc...
A group field can have more calls to the DB or the same number. This depends on if the values for the sub fields are already in the WP meta cache. Usually they are, but there are conditions where they are not. Each sub field of a group field is stored separately in the database.
In the normal course of actions WP runs setup_postdata on the current post and all meta fields retrieved in a single query and stored in the cache.
When getting values for a post that does not already have its meta fields stored then there is one db query for the group field and an additional db query for each sub field.
Ok, thank you. I’m using your suggestion from a few posts earlier and it works fine. It also looks like a cleaner code.
I asked the other question on the forum here, and to support too, but with no answer. Do you know where I can find the answer? I would be storing a value programmatically in de custom post type with the data of the block. This shouldn’t be so difficult. But I can’t find the answer in the docs here and I know that on the wordpress forum they will tell me to ask here :/
EDIT: I’ve found a little work-around to that problem. A bit ugly, because it involves css !important rules, but it works. Still frustrating I can’t retrieve and store a value programmatically.
You must be logged in to reply to this topic.
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!