Интеграция пользовательских типов полей с WordPress REST API

Интеграция пользовательских типов полей с WordPress REST API

Начиная с версии 5.11, Advanced Custom Fields поддерживает просмотр и обновление пользовательских полей через WordPress REST API. Интеграция работает с типами полей ACF по умолчанию, а также с большинством пользовательских типов полей, зарегистрированных другими плагинами. Однако в зависимости от способа регистрации пользовательских типов полей для их полной интеграции с REST API может потребоваться дополнительный код.

В этой статье описывается добавление пользовательского типа поля в REST API, добавление или изменение схемы типа поля, а также удаление типа поля из REST API.

Добавление пользовательского типа поля в REST API

Типы полей, зарегистрированные путем создания нового класса типа поля, расширяющего класс acf_field, а затем регистрации этого класса с помощью функции acf_register_field_type(), должны автоматически работать с REST API. Однако это верно только при условии, что новый класс типа поля, расширяющий acf_field, не устанавливает свойство show_in_rest в значение false.

class hfm_font_size extends acf_field {

    // Установите $show_in_rest в true, чтобы поле отображалось в REST API.
    // В классе acf_field это поле также имеет значение true по умолчанию.
    public $show_in_rest = false;

    ...

Для типов полей, которые не зарегистрированы с помощью acf_register_field_type(), например для типов полей, которые просто создают себя внутри хука действия acf/include_field_types, их можно включить в REST API с помощью фильтра acf/rest/get_fields, как показано ниже:

add_filter( 'acf/rest/get_fields', function ( $fields, $resource, $http_method ) {
    if ( ! is_array( $fields ) ) {
        return $fields;
    }

    // Получаем наш тип поля по имени поля.
    $field_type = acf_get_field_type( 'font_size' );

    // Если наше поле еще не зарегистрировано и не инициализировано ACF, делаем это сейчас.
    if ( ! $field_type instanceof acf_field ) {
        // Инициализируем класс, содержащий наш пользовательский тип поля. Если у конструктора есть аргументы, их также необходимо передать.
        $field = new hfm_font_size();
        acf_register_field_type( $field );
    }

    // Получаем массив поля (по имени поля) и добавляем его в массив полей, поддерживаемых REST API.
    $fields[] = acf_get_field( 'font_size' );

    return $fields;
}, 10, 3 );

Приведенный выше пример добавляет в REST API пользовательский тип поля font_size. Для этого он получает тип поля из ACF, создает класс hfm_font_size, расширяющий acf_field, если тот еще не был создан, а затем добавляет поле в массив полей, доступных через REST API.

Добавление или обновление схемы пользовательских типов полей

По умолчанию ACF добавляет базовую схему для пользовательских типов полей, расширяющих класс acf_field. Это выполняется в методе acf_field::get_rest_schema(), который можно переопределить в классе, расширяющем acf_field:

class hfm_font_size extends acf_field {

    // Переопределяем метод acf_field::get_rest_schema() по умолчанию.
    public function get_rest_schema( array $field ) {
        $schema = array(
            'type'     => array( 'int', 'null' ),
            'required' => true,
        );

        if ( isset( $field['default_value'] ) && '' !== $field['default_value'] ) {
            $schema['default'] = $field['default_value'];
        }

        return $schema;
    }

    …
}

Кроме того, схему можно задать с помощью фильтра acf/rest/get_field_schema. Дополнительную информацию см. в разделе «Управление схемой поля» статьи Расширение системы REST API.

Исключение типа поля из REST API

Если тип поля зарегистрирован с помощью acf_register_field_type() и расширяет класс acf_field, для предотвращения его отображения в REST API можно использовать свойство $show_in_rest:

class hfm_font_size extends acf_field {

    // Установите $show_in_rest в false, чтобы поле не отображалось в REST API.
    public $show_in_rest = false;

    ...
}

Как и при регистрации полей, исключить тип поля также можно с помощью фильтра acf/rest/get_fields:

add_filter( 'acf/rest/get_fields', function ( $fields, $resource, $http_method ) {
    if ( ! is_array( $fields ) ) {
        return $fields;
    }

    foreach ( $fields as $field_key => $field_array ) {
        if ( 'font_size'  === $field_array['name'] ) {
            unset( $fields[ $field_key ] );
        }
    }

    return $fields;
}, 10, 3 );

Обновлено: 30.09.2026