Добавление пользовательских настроек к полям ACF

Обзор

Каждый тип поля ACF может содержать несколько различных настроек, которые можно использовать для настройки внешнего вида и функциональности поля. Существует два основных типа таких настроек: глобальные и зависящие от типа.

Глобальные настройки поля регистрируются один раз и отображаются для каждого типа поля. Примером глобальной настройки может быть параметр «Имя поля» — он отображается у каждого поля ACF, поскольку необходим для работы полей.

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

В этой статье объясняется, как добавлять пользовательские настройки поля как к существующим типам полей, так и к собственным пользовательским типам полей.

Журнал изменений

Добавление глобальной настройки поля

Как упоминалось выше, глобальные настройки поля отображаются для каждого типа поля. В ACF 6 эти настройки показываются на вкладке «Общие» для каждого поля.

Скриншот новой глобальной настройки поля.

В следующем примере показано, как добавить новую настройку под названием «Только для админа», которая добавит переключатель true/false ко всем полям и позволит скрывать их от пользователей, не являющихся администраторами.

1. Добавление настройки

Глобальные настройки можно добавить с помощью action hook acf/render_field_settings и функции acf_render_field_setting(). Следующий фрагмент добавит глобальную настройку на вкладку «Общие» для всех типов полей. Обратите внимание, что третий параметр для acf_render_field_setting() установлен в true, чтобы указать, что это глобальная настройка.

function my_admin_only_render_field_settings( $field ) {
    acf_render_field_setting( $field, array(
        'label'        => __( 'Только для админа?', 'my-textdomain' ),
        'instructions' => '',
        'name'         => 'admin_only',
        'type'         => 'true_false',
        'ui'           => 1,
    ), true ); // Если добавляете настройку глобально, вы ДОЛЖНЫ передать true в качестве третьего параметра!
}
add_action( 'acf/render_field_settings', 'my_admin_only_render_field_settings' );

2. Использование настройки

После добавления новой настройки «Только для админа?» мы можем подключиться к любой части ACF и использовать эту настройку. Следующий код подключается к фильтру acf/prepare_field, который выполняется непосредственно перед тем, как поле будет выведено в форме. Это позволит проверить, является ли текущий пользователь администратором, и если нет — не показывать поле:

function my_admin_only_prepare_field( $field ) {
    // Прерываем выполнение, если настройка 'admin_only' отсутствует или равна false.
    if ( empty( $field['admin_only'] ) ) {
        return $field;
    }

    // Не показываем поле, если текущий пользователь не администратор.
    if ( ! current_user_can( 'manage_options' ) ) {
        return false;
    }

    // В противном случае возвращаем исходное поле.
    return $field;
}
add_filter( 'acf/prepare_field', 'my_admin_only_prepare_field' );

3. Проверка настройки

После добавления приведённого выше кода в файл functions.php и использования поля с настройкой «Только для админа?» мы можем войти как администратор или редактор и проверить наличие поля!

Добавление настроек для конкретного типа поля

Настройки поля можно добавлять или ограничивать отдельными типами полей (text, image и т. д.). В ACF 6.0 и выше эти настройки также можно отображать на определённых вкладках внутри типа поля (Общие, Проверка, Представление или Условная логика).

Для добавления настроек поля на эти вкладки можно использовать следующие action hook:

  • acf/render_field_settings/type={type} (устаревший action для вкладки «Общие» — можно использовать в ACF 5 для добавления настроек, зависящих от типа поля)
  • acf/render_field_general_settings/type={type} (для добавления настроек на вкладку «Общие»)
  • acf/render_field_validation_settings/type={type} (для добавления настроек на вкладку «Проверка»)
  • acf/render_field_presentation_settings/type={type} (для добавления настроек на вкладку «Представление»)
  • acf/render_field_conditional_logic_settings/type={type} (для добавления настроек на вкладку «Условная логика»)

Эти фильтры также применяются в базовом классе acf_field, поэтому если у вас есть пользовательский тип поля, наследующий acf_field, вы можете просто добавить в свой класс один или несколько следующих методов:

  • render_field_settings()
  • render_field_general_settings()
  • render_field_validation_settings()
  • render_field_presentation_settings()
  • render_field_conditional_logic_settings()

Следующий пример добавит новую настройку «Исключить слова» на вкладку «Проверка» для типа поля textarea. Это добавит текстовое поле, которое позже мы будем использовать для хранения списка слов, запрещённых для использования в textarea.

Скриншот новой настройки, специфичной для типа поля.

1. Добавление настройки

Поскольку в этом примере настройка добавляется на вкладку «Проверка», для вывода настройки мы будем использовать action hook acf/render_field_validation_settings/type={$type}.

Обратите внимание, что третий параметр для функции acf_render_field_setting() не используется — это делает настройку специфичной для поля, а не глобальной, как показано выше.

function my_textarea_render_field_settings( $field ) {
    acf_render_field_setting( $field, array(
        'label'        => __( 'Исключить слова', 'my-textdomain' ),
        'instructions' => __( 'Введите слова через запятую', 'my-textdomain' ),
        'name'         => 'exclude_words',
        'type'         => 'text',
    ) );
}
add_action( 'acf/render_field_validation_settings/type=textarea', 'my_textarea_render_field_settings' );

2. Использование настройки

После добавления новой настройки «Исключить слова» и нового поля textarea, использующего эту настройку, мы можем подключиться к любой части ACF и использовать её. Следующий код подключается к фильтру acf/validate_value, который выполняется во время проверки значения. Это позволит нам проверить, содержит ли текущее значение какие-либо слова из списка исключений, и уведомить пользователя с помощью сообщения об ошибке проверки:

function my_textarea_validate_value( $valid, $value, $field, $input ) {
    // Прерываем выполнение, если поле уже недопустимо.
    if ( ! $valid ) {
        return $valid;
    }

    // Прерываем выполнение, если настройка "Исключить слова" не задана.
    if ( empty( $field['exclude_words'] ) ) {
        return $valid;
    }

    // Разбиваем слова в массив, по которому можно пройтись циклом.
    $words = explode( ',', $field['exclude_words'] );
    $words = array_map( 'trim', $words ); // Удаляем пробелы.
    $words = array_values( $words ); // Удаляем пустые значения.

    foreach( $words as $word ) {
        // Проверяем, существует ли слово.
        if( stripos( $value, $word ) !== false ) {
            $valid = sprintf( __( 'Значение не должно содержать "%s"', 'my-textdomain' ), $word );
            break;
        }
    }

    return $valid;
}
add_filter( 'acf/validate_value/type=textarea', 'my_textarea_validate_value', 10, 4 );

3. Проверка настройки

После добавления приведённого выше кода в файл functions.php и использования поля с настройкой exclude_words мы можем отредактировать запись и попытаться сохранить значение.

Скриншот сообщения о пользовательской ошибке, добавленного выше.

Добавление пользовательской вкладки настроек поля

С новым форматом вкладок, представленным в ACF 6.0, плагины, добавляющие настройки к полям, могут делать это с помощью нового фильтра acf/field_group/additional_field_settings_tabs, который появился в ACF 6.1.

Например, чтобы добавить новую вкладку под названием «Мои настройки» для каждого поля, используйте:

add_filter( 'acf/field_group/additional_field_settings_tabs', function ( $tabs ) {
    $tabs['my-settings'] = 'Мои настройки';

    return $tabs;
} );

Чтобы добавить поле на эту новую вкладку, используйте фильтр acf/field_group/render_field_settings_tab/$tab-key:

add_action( 'acf/field_group/render_field_settings_tab/my-settings', function ( $field ) {
    acf_render_field_setting(
        $field,
        array(
            'label'        => 'Только для админа?',
            'instructions' => '',
            'name'         => 'admin_only',
            'type'         => 'true_false',
            'ui'           => 1,
        ),
        true
    );
} );

Добавление пользовательской вкладки в настройки группы полей

Также можно добавить пользовательскую вкладку настроек в метабокс «Настройки» в нижней части экрана редактора группы полей, используя фильтр acf/field_group/additional_group_settings_tabs так же, как и выше.

Обновление существующих настроек полей для ACF 6

Пользовательские настройки полей, добавленные с помощью action hook acf/render_field_settings или acf/render_field_settings/type={type}, продолжат работать в ACF 6, а настройки будут отображаться на вкладке «Общие» для любых полей, к которым они были добавлены.

Однако в ACF 6 есть некоторые изменения, которые могут потребовать дополнительного кода.

Перенос существующей настройки поля на другую вкладку

Если вы хотите перенести пользовательскую настройку поля на другую вкладку и при этом поддержать пользователей, которые всё ещё используют ACF 5, вам, скорее всего, понадобится добавить немного кода, чтобы настройка регистрировалась по-разному в ACF 5 и 6 и не отображалась дважды.

Один из способов сделать это — обновить существующий код настройки поля так, чтобы он завершал выполнение раньше, если используется ACF 6.0 или выше.

function render_field_settings( $field ) {
    // Мы используем ACF 6.0 или выше, поэтому здесь регистрировать настройку не нужно.
    if ( version_compare( ACF_MAJOR_VERSION, '6.0', '>=' ) ) {
        return;
    }

    // Остальной код настроек поля.
}

Затем можно добавить отдельную функцию, которая подключается к одному из action hook, зависящих от вкладки, как упоминалось выше.

Изменения в acf_render_field_setting() в ACF 6

В ACF 5 настройки поля выводились как строки таблицы внутри родительской таблицы с классом .acf-table. В ACF 6 и выше настройки типа поля больше не выводятся внутри таблицы.

В результате функция acf_render_field_setting() была обновлена так, чтобы по умолчанию выводить настройки поля, созданные этой функцией, внутри элементов <div>.

Скорее всего, это не вызовет проблем, если вы используете acf_render_field_setting() в одном из action hook, упомянутых выше, или в классе, который наследует acf_field.

Хотя это и не рекомендуется, функцию acf_render_field_setting() можно использовать и вне этих action hook. В таком случае мы рекомендуем проверить все настройки, созданные этой функцией, чтобы убедиться, что они отображаются как ожидается, и при необходимости обновить код.

Изменения инструкций настройки поля в ACF 6

В ACF 6 значение параметра instructions, передаваемого в acf_render_field_settings(), теперь отображается как подсказка, чтобы уменьшить визуальный шум в интерфейсе.

Подсказка в ACF 6.

Если вы предпочитаете отображать instructions прямо рядом с настройкой поля, как в ACF 5, это можно сделать, изменив параметр instructions на hint:

function my_textarea_render_field_settings( $field ) {
    acf_render_field_setting( $field, array(
        'label' => __( 'Исключить слова', 'my-textdomain' ),
        'hint'  => __( 'Введите слова через запятую', 'my-textdomain' ),
        'name'  => 'exclude_words',
        'type'  => 'text',
    ) );
}
add_action( 'acf/render_field_validation_settings/type=textarea', 'my_textarea_render_field_settings' );

Это выведет указанный текст подсказки под настройкой поля:

Подсказка настройки поля ACF.

Заключение

Добавлять дополнительные настройки полей в ACF легко, а возможности практически безграничны!

Обновлено: 01.06.2026