Как добавить произвольные поля в REST API WordPress

Почему важно расширять REST API WordPress произвольными полями

REST API в WordPress с версии 4.7 стал мощным инструментом для создания современных фронтендов и мобильных приложений. Однако по умолчанию в ответах API не возвращаются все произвольные поля (custom fields), которые могут содержать важную информацию для вашего проекта.

Расширение API позволит получать эти данные напрямую, без дополнительных запросов к базе и доработок на стороне клиента. Это значительно упрощает архитектуру и повышает производительность.

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

Что такое произвольные поля и как они хранятся в WordPress

Произвольные поля — это дополнительные метаданные, которые можно прикреплять к постам, страницам и другим типам записей (custom post types). Они хранятся в таблице wp_postmeta и имеют ключи и значения.

Например, если у вас есть кастомный тип записей «Товары», вы можете добавить поле «Цена» с ключом price и значением 1999.

По умолчанию эти поля недоступны через REST API, поэтому нам нужно явно указать, какие из них должны возвращаться.

Добавление произвольных полей в REST API: базовый пример

Для начала зарегистрируем новое поле в API с помощью функции register_rest_field(). В нашем случае допустим, что мы хотим вернуть поле price для типа записей product.

add_action('rest_api_init', 'wp_gpt_register_price_field');
function wp_gpt_register_price_field() {
    register_rest_field('product', 'price', [
        'get_callback' => 'wp_gpt_get_product_price',
        'schema' => [
            'description' => 'Цена продукта',
            'type'        => 'integer',
            'context'     => ['view', 'edit']
        ],
    ]);
}

function wp_gpt_get_product_price($object) {
    return (int) get_post_meta($object['id'], 'price', true);
}

Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин. После этого при обращении к API по адресу /wp-json/wp/v2/product в ответе появится новое поле price.

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

Если нужно добавить сразу несколько полей, можно зарегистрировать их по отдельности или объединить в один объект. Но важно не создавать лишних вызовов к базе данных, чтобы не замедлять API.

Рассмотрим пример, когда нам нужно вернуть поля price, color и size. Чтобы оптимизировать, получаем все метаданные одной функцией, а потом возвращаем нужные значения.

add_action('rest_api_init', 'wp_gpt_register_multiple_fields');
function wp_gpt_register_multiple_fields() {
    register_rest_field('product', 'custom_fields', [
        'get_callback' => 'wp_gpt_get_product_custom_fields',
        'schema' => null,
    ]);
}

function wp_gpt_get_product_custom_fields($object) {
    $meta = get_post_meta($object['id']);
    return [
        'price' => isset($meta['price'][0]) ? (int) $meta['price'][0] : null,
        'color' => isset($meta['color'][0]) ? sanitize_text_field($meta['color'][0]) : null,
        'size'  => isset($meta['size'][0]) ? sanitize_text_field($meta['size'][0]) : null,
    ];
}

Теперь в поле custom_fields будет массив с нужными метаданными. Такой подход уменьшает количество обращений к базе и упрощает структуру ответа.

Безопасность и валидация данных в REST API

Очень важно обеспечить безопасность при работе с произвольными полями, особенно если они могут изменяться через API. Для этого нужно правильно указывать права доступа и валидировать данные.

При регистрации поля можно использовать параметры update_callback и permission_callback. Рассмотрим пример с проверкой прав и сохранением поля price:

add_action('rest_api_init', 'wp_gpt_register_price_field_with_update');
function wp_gpt_register_price_field_with_update() {
    register_rest_field('product', 'price', [
        'get_callback' => 'wp_gpt_get_product_price',
        'update_callback' => 'wp_gpt_update_product_price',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
        'schema' => [
            'description' => 'Цена продукта',
            'type'        => 'integer',
            'context'     => ['view', 'edit']
        ],
    ]);
}

function wp_gpt_update_product_price($value, $post, $field_name) {
    $price = intval($value);
    if ($price < 0) {
        return new WP_Error('rest_invalid_price', 'Цена должна быть положительным числом', ['status' => 400]);
    }
    return update_post_meta($post->ID, 'price', $price);
}

Такой код позволит безопасно обновлять поле через REST API только авторизованным пользователям с нужными правами.

Практические рекомендации и полезные плагины

Для расширения REST API можно использовать и готовые плагины, например:

  • ACF to REST API — расширяет REST API полями Advanced Custom Fields;
  • WP REST API Controller — позволяет управлять отображаемыми полями через админку;
  • Custom Fields to REST API — простой способ добавить все произвольные поля в API.

Однако если вам нужны тонкие настройки и безопасность, лучше использовать собственные решения на базе register_rest_field().

Обязательно тестируйте добавленные поля на разных типах записей и проверяйте корректность данных и прав доступа.

Заключение

Добавление произвольных полей в REST API WordPress — важная задача для создания современных приложений на базе WP. Используя описанные методы, вы сможете получить полный контроль над данными, обеспечить безопасность и оптимизировать производительность.

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

Как добавить автоматическое отключение неиспользуемых плагинов в WordPress
04.04.2026
WooCommerce: автоматическое изменение стоимости доставки при изменении заказа
28.05.2026
Как удалить неиспользуемые медиа файлы в WordPress
10.12.2025
Как создать автоматический генератор изображений для постов WordPress с помощью GPT
17.04.2026
Как использовать WPGPT для автоматизации создания контекста в блоках Gutenberg
26.03.2026