WP REST API — мощный инструмент WordPress, позволяющий создавать и получать данные сайта через HTTP-запросы. Это открывает большие возможности для интеграции WordPress с внешними приложениями, мобильными приложениями или другими сайтами. В этой статье подробно разберём, как реализовать удалённый вывод данных из WordPress, создавая кастомные REST-эндпоинты с примерами кода и советами по безопасности.
Что такое WP REST API и зачем нужен удалённый вывод данных
WP REST API позволяет получить доступ к данным WordPress (посты, страницы, таксономии, пользователи и пр.) через стандартные HTTP-запросы. Благодаря этому можно использовать WordPress как backend для других сервисов или создавать кастомные приложения с динамическим контентом.
Удалённый вывод данных — это когда с другого сайта или приложения делается запрос к WordPress и получаемая информация отображается или используется там. Например, мобильное приложение может запрашивать последние новости, слайдер на стороннем сайте — актуальные акции, а CRM — список клиентов.
Стандартные WP REST API-эндпоинты подходят для большинства задач, но часто нужна кастомизация: свои поля, фильтры, формат ответа. Для этого создаются кастомные эндпоинты.
Создание кастомного REST API эндпоинта в WordPress
Чтобы создать свой REST API маршрут, используем функцию register_rest_route. Обычно это делают в плагине или в файле functions.php темы, но лучше через плагин, чтобы не потерять изменения при смене темы.
Пример простого эндпоинта, который возвращает список последних 5 постов с кастомным полем:
add_action('rest_api_init', function() {
register_rest_route('wpdemo/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wpdemo_get_latest_posts',
'permission_callback' => '__return_true',
));
});
function wpdemo_get_latest_posts( $request ) {
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'post_status' => 'publish',
);
$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(),
'excerpt' => get_the_excerpt(),
'custom_field' => get_post_meta(get_the_ID(), 'my_custom_field', true),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}Теперь, сделав GET-запрос на https://ваш-сайт.ru/wp-json/wpdemo/v1/latest-posts/, вы получите JSON с последними постами и нужными полями.
Разъяснения по коду
rest_api_init— хук для регистрации новых маршрутов API;register_rest_route— функция регистрации маршрута, где указываем namespace (wpdemo/v1), путь, методы и callback;permission_callback— проверка прав доступа, здесь для простоты разрешаем всем, но в реальных проектах надо продумать безопасность;WP_Query— стандартный класс для выборки постов;rest_ensure_response— гарантирует правильный формат ответа.
Фильтрация и пагинация через параметры запроса
Часто нужно не просто получить фиксированный список, а передавать параметры: страницу, количество элементов, фильтры по категориям или меткам.
Добавим поддержку параметров page и per_page в наш эндпоинт:
add_action('rest_api_init', function() {
register_rest_route('wpdemo/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wpdemo_get_latest_posts',
'permission_callback' => '__return_true',
'args' => array(
'page' => array(
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0;
},
'default' => 1,
),
'per_page' => array(
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0 && $param <= 20;
},
'default' => 5,
),
),
));
});
function wpdemo_get_latest_posts( $request ) {
$page = (int) $request->get_param('page');
$per_page = (int) $request->get_param('per_page');
$args = array(
'post_type' => 'post',
'posts_per_page' => $per_page,
'paged' => $page,
'post_status' => 'publish',
);
$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(),
'excerpt' => get_the_excerpt(),
'custom_field' => get_post_meta(get_the_ID(), 'my_custom_field', true),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
$response = rest_ensure_response($posts);
$response->header('X-WP-Total', (int) $query->found_posts);
$response->header('X-WP-TotalPages', (int) $query->max_num_pages);
return $response;
}Теперь можно делать такие запросы:
/wp-json/wpdemo/v1/latest-posts/?page=2&per_page=10— вторая страница по 10 постов;/wp-json/wpdemo/v1/latest-posts/— по умолчанию первая страница и 5 постов.
В заголовках ответа возвращаем общее число постов и число страниц, что удобно для реализации пагинации на стороне клиента.
Безопасность и кеширование REST API
При создании кастомных эндпоинтов важно не забывать про безопасность. Если данные публичны — permission_callback можно оставить как в примерах. Если данные чувствительные — нужно проверять авторизацию, например, используя current_user_can() или проверять nonce.
Для повышения производительности стоит кешировать результаты запросов. Можно использовать Transients API WordPress для хранения результатов выборки на некоторое время.
function wpdemo_get_latest_posts( $request ) {
$page = (int) $request->get_param('page');
$per_page = (int) $request->get_param('per_page');
$cache_key = 'wpdemo_latest_posts_' . $page . '_' . $per_page;
$cached = get_transient($cache_key);
if ($cached !== false) {
return rest_ensure_response($cached);
}
$args = array(
'post_type' => 'post',
'posts_per_page' => $per_page,
'paged' => $page,
'post_status' => 'publish',
);
$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(),
'excerpt' => get_the_excerpt(),
'custom_field' => get_post_meta(get_the_ID(), 'my_custom_field', true),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
$response_data = array(
'posts' => $posts,
'total' => (int) $query->found_posts,
'total_pages' => (int) $query->max_num_pages,
);
set_transient($cache_key, $response_data, HOUR_IN_SECONDS);
return rest_ensure_response($response_data);
}Такой подход значительно снизит нагрузку на сервер при частых запросах.
Использование плагина Clearfy Pro для расширения возможностей REST API
Если вы используете плагин Clearfy Pro, он предлагает удобные настройки безопасности для REST API, позволяющие ограничивать доступ к данным, отключать ненужные маршруты и оптимизировать работу API.
Clearfy Pro также содержит инструменты для управления заголовками и кэшированием, что помогает улучшить производительность и безопасность при работе с удалённым выводом данных.
Примеры практического применения удалённого вывода данных через REST API
1. Мобильное приложение новостей
Мобильное приложение может запрашивать последние новости, используя созданный эндпоинт. В ответ приходит JSON с заголовками, кратким описанием и ссылками, что позволяет быстро и удобно отображать контент.
2. Виджет на другом сайте
Можно вывести блок с актуальными акциями или новостями на внешнем сайте — достаточно сделать AJAX-запрос к вашему WordPress, получить данные и отобразить в нужном формате.
3. Интеграция с CRM или BI-системами
REST API позволяет передавать данные заказов, клиентов и постов в внешние системы для аналитики, автоматизации маркетинга и поддержки клиентов.
Подводим итоги
Удалённый вывод данных через WP REST API — мощный инструмент для расширения возможностей вашего WordPress-сайта. Создавая кастомные эндпоинты, вы можете гибко контролировать формат и содержимое ответов, добавлять фильтры и пагинацию, а также обеспечивать безопасность и производительность.
Для начинающих и опытных разработчиков это отличный способ построить современный, интегрируемый сайт или сервис на базе WordPress.
Если хотите упростить работу с безопасностью и оптимизацией REST API, рекомендуем обратить внимание на плагин Clearfy Pro.