При разработке современных сайтов на WordPress часто возникает необходимость расширить стандартный REST API дополнительными данными. Это особенно актуально, если вы создаёте SPA, мобильное приложение или интеграцию с внешними сервисами, где нужны нестандартные метаданные или поля пользовательских типов записей.
Почему стоит добавлять дополнительные поля в REST API WordPress
Стандартный REST API WordPress возвращает только базовые данные записи, такие как заголовок, содержимое, дата публикации и т.д. Однако, в реальных проектах часто используются произвольные поля (custom fields), метаданные, связанные таксономии или пользовательские данные, которые не выводятся по умолчанию.
Добавление этих полей позволяет получить всю нужную информацию одним запросом, уменьшить количество обращений к серверу и упростить логику клиентского приложения.
Например, если у вас есть сайт с каталогом товаров, и вы храните цену, артикул, наличие в кастомных полях, то без расширения API эти данные нужно запрашивать отдельно или получать через дополнительные endpoint’ы.
Как добавить дополнительные поля в REST API WordPress: базовый пример
Для добавления дополнительных полей в REST API в WordPress используется функция register_rest_field. Она позволяет "прицепить" новые данные к уже существующим типам записей.
Рассмотрим, как добавить в ответ API поле "product_price" из метаполя "_product_price" для типа записи "product".
add_action('rest_api_init', function () {
register_rest_field('product', 'product_price', [
'get_callback' => 'wplearn_get_product_price',
'schema' => null,
]);
});
function wplearn_get_product_price($object) {
$product_id = $object['id'];
$price = get_post_meta($product_id, '_product_price', true);
return $price ? $price : '';
}
Теперь при запросе /wp-json/wp/v2/product в каждом объекте будет поле product_price с нужным значением.
Добавление нескольких полей и сложных данных
Если нужно добавить сразу несколько полей, можно зарегистрировать их по очереди. Или же возвращать массив с несколькими значениями из одного callback-функции.
Например, добавим одновременно цену и наличие на складе:
add_action('rest_api_init', function () {
register_rest_field('product', 'custom_data', [
'get_callback' => 'wplearn_get_product_custom_data',
'schema' => null,
]);
});
function wplearn_get_product_custom_data($object) {
$product_id = $object['id'];
$price = get_post_meta($product_id, '_product_price', true);
$stock = get_post_meta($product_id, '_product_stock', true);
return [
'price' => $price ? $price : 0,
'stock' => $stock ? (int)$stock : 0,
];
}
Такой подход удобен для передачи комплексных данных, которые логически связаны.
Добавление полей с проверкой прав доступа
Очень важно контролировать, кому доступны эти дополнительные данные, особенно если они содержат чувствительную информацию. Для этого можно добавить параметр update_callback (для изменения через API) и permission_callback для проверки прав.
add_action('rest_api_init', function () {
register_rest_field('product', 'cost_price', [
'get_callback' => 'wplearn_get_cost_price',
'update_callback' => 'wplearn_update_cost_price',
'permission_callback' => function () {
return current_user_can('manage_options'); // только админы
},
'schema' => [
'description' => 'Себестоимость товара',
'type' => 'number',
'context' => ['edit'],
],
]);
});
function wplearn_get_cost_price($object) {
return get_post_meta($object['id'], '_cost_price', true);
}
function wplearn_update_cost_price($value, $object, $field_name) {
if (!is_numeric($value)) {
return new WP_Error('rest_invalid_param', 'Цена должна быть числом', ['status' => 400]);
}
update_post_meta($object->ID, '_cost_price', $value);
return true;
}
Такое решение позволяет не только получать, но и менять дополнительные поля через REST API, при этом защищая их от неавторизованного доступа.
Пример плагина для расширения REST API с несколькими дополнительными полями
Для удобства можно оформить весь код в простой плагин, который подключается отдельно и расширяет API без правки темы.
/*
Plugin Name: WPlearn REST API Extensions
Description: Добавляет дополнительные поля в REST API для кастомных типов записей.
Version: 1.0
Author: WPlearn
*/
add_action('rest_api_init', function () {
register_rest_field('product', 'custom_fields', [
'get_callback' => 'wplearn_get_custom_fields',
'schema' => null,
]);
});
function wplearn_get_custom_fields($object) {
$id = $object['id'];
return [
'price' => get_post_meta($id, '_product_price', true),
'stock' => get_post_meta($id, '_product_stock', true),
'sku' => get_post_meta($id, '_product_sku', true),
];
}
Активировав этот плагин, вы расширите REST API и сможете использовать новые поля в своих фронтенд-приложениях.
Советы по отладке и тестированию
Для проверки новых полей используйте инструменты типа Postman или встроенный в браузер fetch/axios. Запросите GET /wp-json/wp/v2/product и убедитесь, что поле отображается.
Если поле не появляется, проверьте, что тип записи совпадает, и что rest_api_init хук вызывается.
Для сложных структур данных рекомендуется описывать схему (schema) в register_rest_field, это улучшит автодокументацию и валидацию.
Заключение
Добавление дополнительных полей в REST API WordPress — практический и мощный способ сделать API более гибким и насыщенным. Особенно это полезно для кастомных проектов с уникальными данными. В статье приведены базовые и продвинутые примеры с кодом, которые легко адаптировать и расширять под свои нужды.
Если хотите упростить работу с REST API, обратите внимание на плагин Clearfy Pro, который содержит множество оптимизаций и расширений для WordPress, включая улучшения API.