Почему важно расширять 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 или к опытным разработчикам сообщества.