Динамическое заполнение вариантов Select field

Обзор

Нужно динамически заполнять варианты поля? Этот туториал показывает, как взять значение, сохранённое на странице опций, и использовать его для переопределения массива choices у поля Select.

Атрибут массива ‘choices’ также используется с полями Radio Button и Checkbox. Большая часть этого туториала подходит для любого из этих полей, но пример с AJAX можно использовать только с полем Select.

Требования

Для этого туториала требуется использовать фильтр acf/load_field в сочетании с модификатором name, чтобы применить фильтр ко всем полям с конкретным name. Атрибут name — это то, как поле хранится и на что ссылается база данных WordPress.

Заполнение вариантов из поля Text Area

В этом примере мы загрузим поле Text Area с именем my_select_values со страницы опций и используем текст каждой строки как вариант для выбора в поле Select. name поля Select в этом примере — color.

functions.php

function acf_load_color_field_choices( $field ) {
    
    // Сбрасываем choices
    $field['choices'] = array();
    
    
    // Получаем значения Text Area со страницы опций без какого-либо форматирования
    $choices = get_field('my_select_values', 'option', false);

    
    // Разбиваем значение так, чтобы каждая строка стала отдельным элементом массива
    $choices = explode("\n", $choices);

    
    // Удаляем лишние пробелы
    $choices = array_map('trim', $choices);

    
    // Проходим по массиву и добавляем в поле 'choices'
    if( is_array($choices) ) {
        
        foreach( $choices as $choice ) {
            
            $field['choices'][ $choice ] = $choice;
            
        }
        
    }


    // Возвращаем поле
    return $field;
    
}

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

 

Заполнение вариантов из поля Repeater

В этом примере мы загрузим поле Repeater с именем my_select_values со страницы опций и используем подполе value и label как варианты для выбора в поле Select.

functions.php

function acf_load_color_field_choices( $field ) {
    
    // Сбрасываем choices
    $field['choices'] = array();

    // Проверяем, есть ли в Repeater строки данных для перебора
    if( have_rows('my_select_values', 'option') ) {
        
        // Выполняем цикл, пока нижеуказанное условие истинно
        while( have_rows('my_select_values', 'option') ) {
            
            // Получаем массив со всеми значениями после завершения цикла
            the_row();
            
            
            // Переменные
            $value = get_sub_field('value');
            $label = get_sub_field('label');

            
            // Добавляем в choices
            $field['choices'][ $value ] = $label;
            
        }
        
    }


    // Возвращаем поле
    return $field;
    
}

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

Заполнение поля Select через AJAX

В отличие от полей Radio Button и Checkbox, поле Select можно заполнять через AJAX. Это может ускорить загрузку страницы при использовании фильтра acf/load_field для заполнения вариантов поля Select. Для работы этого фильтра у поля Select должны быть включены параметры «Стилизованный интерфейс» и «Использовать AJAX для ленивой загрузки вариантов». Параметр «Использовать AJAX для ленивой загрузки вариантов» скрыт, пока в настройках поля Select не включён «Стилизованный интерфейс».

function filter_field( array $field ) : array {

 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {

   $field['choices'] = time_consuming_call_to_get_choices();

 }

 return $field;

}

add_filter( "acf/load_field/key=$key", 'filter_field', 10, 1 );

Обновлено: 01.06.2026