ACF динамически заполняет варианты выбора поля выбора — не полностью работает

#php #wordpress #advanced-custom-fields

#php #wordpress #расширенные пользовательские поля

Вопрос:

Итак, это пример моего кода:

 function acf_populate_age_select( $field ) {
    //Get the values from textarea on option page
    $site_settings = get_field('theme_settings','option');
    $exhibitor_options = $site_settings[0]['exhibitor_options'];

    //Turn the values in to an array
    $ages = explode(PHP_EOL,$exhibitor_options['age_groups']);
    
    //Clear the choices
    $field['choices'] = array();
    
    //Repopulate $field['choices']
    foreach ( $ages as $age ) {
        $field['choices'][$age] = $age;
    }
    return $field;
}
add_filter( "acf/load_field/key=field_5f451fd1af75e", 'acf_populate_age_select' );
  

Взят пример из:

https://www.advancedcustomfields.com/resources/dynamically-populate-a-select-fields-choices/

Я пытаюсь заполнить значение выпадающего поля при загрузке из поля текстовой области на странице параметров. Он заполняется нормально, но я сталкиваюсь с некоторыми проблемами.

Ошибки, с которыми я сталкиваюсь, являются:

  • если я сначала очищаю $field[‘choices’], а затем повторно заполняю его, то, пока выбранное значение на странице в базе данных правильное, оно сбрасывается до первого значения в редакторе, как если бы значение было сохранено, но выпадающий список перезаписывается после загрузки

  • если я сначала не очищу варианты, старые значения останутся в выпадающем списке как призраки, даже если их нельзя найти в базе данных или серверной части WP

Может кто-нибудь увидеть, что я делаю неправильно, или знает, что я мог бы попытаться заполнить выпадающий список, а затем выделить текущее выбранное значение, хранящееся в базе данных?

Я использую ACF Pro v5.9 на WordPress v5.5

Ответ №1:

[palmface] похоже, это важная строка:

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

Итак, для приведенного выше вопроса:

 //Turn the values in to an array
$ages = explode(PHP_EOL,$exhibitor_options['age_groups']);

$ages = array_map('trim', $ages);

if($ages === $field['choices'])
   return $field;
    
//Clear the choices
$field['choices'] = array();
  

Как вы можете видеть, я также проверил, равны ли массивы, и если да, то не обновлять. Но я думаю, что обрезка (для удаления конечного возврата) была хитростью.