Carl Papworth Carl Papworth - 1 month ago 19
PHP Question

Wordpress ACF selection: Only first object returned when dynamically using categories as choices

I'm trying to modify an ACF selection field by dynamically fetching Post categories, so that user can select between different (It's for a Blog page template). I'm using the function according to ACF, right now, only the first category is returned.

This is what I've got in

functions.php
:

function acf_load_color_field_choices( $field ) {

function categoryName() {
$args = array(
'type' => 'post',
'taxonomy' => 'category',
'parent' => 0, // get top level categories
'orderby' => 'name',
'order' => 'ASC',
'hierarchical' => 1,
'pad_counts' => 0
);

$categories = get_categories( $args );

foreach ( $categories as $category ){

echo $category->name;

}
}


// reset choices
$field['choices'] = array();


// get the textarea value from options page without any formatting
$choices = categoryName();


// explode the value so that each line is a new array piece
$choices = explode("\n", $choices);


// remove any unwanted white space
$choices = array_map('trim', $choices);


// loop through array and add to field 'choices'
if( is_array($choices) ) {

foreach( $choices as $choice ) {

$field['choices'][ $choice ] = $choice;

}

}


// return the field
return $field;

}

add_filter('acf/load_field/name=blog_by_cat', 'acf_load_color_field_choices');


I've also tried:

function acf_load_cat_field_choices( $field ) {


// reset choices
$field['choices'] = array();

// get the textarea value from options page without any formatting

$choices = get_categories();
$value = get_categories();

// explode the value so that each line is a new array piece
$choices = explode("\n", $choices);

// remove any unwanted white space
$choices = array_map('trim', $choices);

// loop through array and add to field 'choices'
if( is_array($choices) ) {

foreach( $choices as $choice ) {

$field['choices'][ $value->slug ] = $choice->name;


}

}

// return the field
return $field;


This returns nothing

And:

function acf_load_cat_field_choices( $field ) {


// reset choices
$field['choices'] = array();

// get the textarea value from options page without any formatting

$choices = get_categories();

// explode the value so that each line is a new array piece
$choices = explode("\n", $choices);

// remove any unwanted white space
$choices = array_map('trim', $choices);

// loop through array and add to field 'choices'
if( is_array($choices) ) {

foreach( $choices as $choice ) {

$field['choices'][$choice] = $choice;


}

}

// return the field
return $field;

}


This returns "Array" (one time)

Answer

So I found a way to do this correctly:

function acf_load_cat_field_choices( $field ) {

// reset choices
$field['choices'] = array();

// get the textarea value from options page without any formatting

$getCatSlugs = array('all_posts');
$getCatNames = array('All Posts');


$args = array(
        'type'          => 'post',
        'taxonomy'      => 'category',
        'parent'        => 0, // get top level categories
        'orderby'       => 'name',
        'order'         => 'ASC',
        'hierarchical'  => 1,
        'pad_counts'    => 0
);

$categories = get_categories( $args );

foreach ( $categories as $category ){

        $getCatSlugs[] = $category->slug;
        $getCatNames[] = $category->name;


}

$values = implode("\n", $getCatSlugs);
$labels = implode("\n", $getCatNames);


$values = explode("\n", $values);
$labels = explode("\n", $labels);



// loop through array and add to field 'choices'


    foreach( array_combine($values, $labels ) as $value => $label ) {
        $field['choices'][ $value ] = $label;       
   }


// return the field
return $field;

}

add_filter('acf/load_field/name=post_by_cat', 'acf_load_cat_field_choices');