WordPress REST API — мощный инструмент, который позволяет разработчикам создавать и взаимодействовать с данными сайта через HTTP-запросы. Однако базовый функционал стандартного API не всегда покрывает все потребности, особенно если нужна более гибкая фильтрация, сортировка или вывод пользовательских данных. В этой статье мы рассмотрим, как создавать нестандартные запросы к REST API WordPress, расширять его функционал и интегрировать с фронтендом.
Что такое REST API в WordPress и зачем нужны нестандартные запросы
REST API — это интерфейс для взаимодействия с сайтом WordPress через HTTP-запросы. Он позволяет получать, создавать, обновлять и удалять данные, такие как записи, страницы, таксономии и метаданные. По умолчанию API предоставляет стандартные эндпоинты, например, /wp-json/wp/v2/posts для получения записей.
Однако, в реальных проектах часто требуется более специфичный функционал:
- Фильтрация записей по произвольным полям (мета-данным).
- Поиск по нескольким параметрам одновременно.
- Создание собственных типов данных и кастомных эндпоинтов.
- Добавление дополнительных полей в ответ API.
Для реализации таких задач необходимо создавать нестандартные или кастомные запросы, расширяя стандартный функционал REST API WordPress.
Расширение REST API: создание кастомного эндпоинта (wp_easy_register_custom_endpoint)
Для создания собственного эндпоинта в REST API используется функция register_rest_route. Давайте рассмотрим пример, где мы создадим эндпоинт, который возвращает список постов с дополнительным фильтром по произвольному мета-полю rating.
add_action('rest_api_init', function () {
register_rest_route('wp_easy/v1', '/top-rated-posts/', array(
'methods' => 'GET',
'callback' => 'wp_easy_get_top_rated_posts',
'permission_callback' => '__return_true',
));
});
function wp_easy_get_top_rated_posts(WP_REST_Request $request) {
$rating = $request->get_param('rating');
if (!$rating) {
return new WP_Error('no_rating', 'Параметр rating обязателен', array('status' => 400));
}
$args = array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'rating',
'value' => $rating,
'compare' => '>=',
'type' => 'NUMERIC',
),
),
);
$query = new WP_Query($args);
$posts = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'rating' => get_post_meta(get_the_ID(), 'rating', true),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}Этот пример создает эндпоинт /wp-json/wp_easy/v1/top-rated-posts?rating=4, который возвращает посты с рейтингом от 4 и выше. Это полезно, если вы используете произвольное поле rating для оценки контента.
Добавление пользовательских полей в ответ REST API (wp_easy_add_custom_fields)
По умолчанию не все произвольные поля (мета-поля) включены в ответ API. Чтобы добавить их, нужно расширить ответ с помощью фильтров. Например, добавим поле rating к стандартным постам:
add_action('rest_api_init', function () {
register_rest_field('post', 'rating', array(
'get_callback' => 'wp_easy_get_post_rating',
'update_callback' => null,
'schema' => array(
'description' => 'Рейтинг поста',
'type' => 'integer',
'context' => array('view', 'edit'),
),
));
});
function wp_easy_get_post_rating($object) {
return (int) get_post_meta($object['id'], 'rating', true);
}Теперь при запросе к /wp-json/wp/v2/posts в ответе будет поле rating для каждого поста.
Использование плагинов для расширения REST API и удобной работы
Если не хочется писать код, можно использовать плагины, которые облегчают работу с REST API:
- WP REST API Controller — позволяет управлять настройками API через админку, включая какие поля доступны.
- ACF to REST API — добавляет поля Advanced Custom Fields в ответы REST API.
- REST API Filter — расширяет возможности фильтрации стандартных эндпоинтов.
Используя эти плагины, можно быстро получить нужный функционал без сложного кодирования.
Практические советы по оптимизации нестандартных запросов REST API
При создании кастомных запросов важно помнить об оптимизации:
- Используйте
WP_Queryс точными параметрами, избегайте избыточных запросов. - Кешируйте результаты с помощью Transients API или внешних систем кеширования.
- Ограничивайте количество возвращаемых записей через параметр
per_pageи пагинацию. - Проверяйте права доступа через
permission_callback, чтобы не раскрывать конфиденциальные данные.
Это поможет избежать перегрузки сервера и ускорить отклик API.
Пример сложного запроса с несколькими параметрами (wp_easy_complex_api_query)
Теперь создадим более сложный эндпоинт, который принимает параметры для фильтрации по категории, дате публикации и рейтингу:
add_action('rest_api_init', function () {
register_rest_route('wp_easy/v1', '/filtered-posts/', array(
'methods' => 'GET',
'callback' => 'wp_easy_complex_api_query',
'permission_callback' => '__return_true',
));
});
function wp_easy_complex_api_query(WP_REST_Request $request) {
$category = $request->get_param('category');
$date_after = $request->get_param('date_after');
$rating = $request->get_param('rating');
$meta_query = array();
if ($rating) {
$meta_query[] = array(
'key' => 'rating',
'value' => $rating,
'compare' => '>=',
'type' => 'NUMERIC',
);
}
$args = array(
'post_type' => 'post',
'category_name' => $category,
'date_query' => array(),
'meta_query' => $meta_query,
);
if ($date_after) {
$args['date_query'][] = array(
'after' => $date_after,
'inclusive' => true,
);
}
$query = new WP_Query($args);
$posts = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'date' => get_the_date('c'),
'rating' => (int) get_post_meta(get_the_ID(), 'rating', true),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}Пример вызова: /wp-json/wp_easy/v1/filtered-posts?category=novosti&date_after=2023-01-01&rating=3 — вернет посты из категории "новости", опубликованные после 1 января 2023 года с рейтингом не ниже 3.
Заключение по работе с REST API WordPress на практике
Использование REST API позволяет создавать гибкие и мощные решения для взаимодействия с WordPress-сайтом. С помощью кастомных эндпоинтов и расширения стандартного API можно решать конкретные задачи, связанные с бизнес-логикой или пользовательским интерфейсом. Не забывайте о безопасности и производительности при разработке, а также используйте готовые плагины для ускорения процесса.