Home › Forums › Backend Issues (wp-admin) › Get_field_objects or get_fields inside acf/load_field causes fatal error › Reply To: Get_field_objects or get_fields inside acf/load_field causes fatal error
I fixed my issues and if anyone runs into a similar problem here is my solution.
As using the above-mentioned functions (get_fields & get_field_objects) in any form caused an infinite loop I made a workaround for my problem. Solved it by writing a separate function which uses get_post_meta to fetch all fields using the post ID of the ACF field group. These fields are then quickly filtered to remove metadata. There is also a check for a field value using get_field, which is an optional step to hide fields without a value set. This could potentially cause a lot of queries if you have lots of fields.
I load the function on admin_init, which is probably not the best hook to use, if someone has any pointers into using a better hook for this I would like to know.
The fixed code is following.
function fetch_custom_field_group( $acf_post_id ) {
$post_meta = get_post_meta($acf_post_id);
if ( ! is_array($post_meta) ) {
return;
}
foreach ( $post_meta as $item ) {
// Unserialize get_post_meta data into a usable array
$item = unserialize($item[0]);
// Check whether field has a value set
$field = get_field( $item['name'] );
// Check if unserialize returned and whether the field has a key, filtering out any unnecessary fields
// optionally at last add a check to not show fields with empty values
if ( $item === false || empty($item['key']) || empty($field) ) {
continue;
}
// Fill everything into a new array that can be used
$acf_fields[] = $item;
}
return $acf_fields;
}
add_action('admin_init', 'fetch_custom_field_group');
The rewritten function for loading field choices is separate from the actual hook and can be reused, just by passing the ACF field group ID into the 2nd function argument.
function acf_load_field_choices( $field, $acf_post_id ) {
// Empty the choices array, ensuring nothing is there
$field['choices'] = array();
// Get all fields from the ACF field group we are using
$choices = fetch_custom_field_group($acf_post_id);
// Get names to be used as keys for the input fields
$choice_name = array_column( $choices, 'name' );
// Get labels to be used as labels for the input fields
$choice_label = array_column( $choices, 'label' );
// Combine into key-value pair of names and labels
$choices = array_combine( $choice_name, $choice_label );
$field['choices'] = $choices;
return $field;
}
And finally, for acf/_load_field filter, I just return the previous function passing the ID of the ACF field group I want to use.
function acf_load_my_checkbox_field( $field ) {
return acf_load_field_choices($field, 198);
}
add_filter( 'acf/load_field/name=your_field_name', 'acf_load_my_checkbox_field' );
Screenshot of result:
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!
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Privacy Policy. If you continue to use this site, you consent to our use of cookies.