Интеграция пользовательских типов полей с 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