REST API в WordPress — мощный инструмент для создания современных, интерактивных плагинов и приложений. Он позволяет обмениваться данными между фронтендом и бэкендом через HTTP-запросы в формате JSON. В этой статье мы подробно разберём, как использовать REST API при разработке плагина для WordPress, с примерами кода и советами для начинающих и опытных разработчиков.
Что такое REST API в WordPress и зачем он нужен
REST API (Representational State Transfer Application Programming Interface) — это интерфейс, который позволяет взаимодействовать с данными WordPress удалённо через HTTP-запросы. Это значит, что вы можете создавать, читать, обновлять и удалять данные на сайте, не используя стандартную админку, а через вызовы к API.
В WordPress REST API встроен с версии 4.7 и предоставляет набор стандартных маршрутов (эндпоинтов) для работы с постами, пользователями, таксономиями и пр. Но вы также можете создавать свои собственные маршруты для специфичных задач вашего плагина.
Использование REST API открывает широкие возможности для разработки, например:
- Создание SPA (Single Page Application) на React или Vue, которые общаются с WordPress;
- Мобильные приложения, которые используют данные сайта;
- Интеграция с внешними сервисами;
- Расширение функциональности плагинов с помощью AJAX без перезагрузки страницы.
Регистрация собственного маршрута REST API в плагине WordPress
Чтобы добавить свой маршрут, нужно использовать функцию register_rest_route(). Обычно регистрацию делают в хуке rest_api_init. Рассмотрим пример создания плагина, который возвращает список задач.
add_action('rest_api_init', function () {
register_rest_route('wpcontent/v1', '/tasks', array(
'methods' => 'GET',
'callback' => 'wpcontent_get_tasks',
));
});
function wpcontent_get_tasks(WP_REST_Request $request) {
// Пример: возвращаем статичный список задач
$tasks = array(
array('id' => 1, 'title' => 'Сделать резервную копию'),
array('id' => 2, 'title' => 'Обновить плагины'),
array('id' => 3, 'title' => 'Проверить безопасность'),
);
return rest_ensure_response($tasks);
}
В этом примере мы создали маршрут /wpcontent/v1/tasks, при обращении к которому возвращается JSON с массивом задач.
Пояснение к коду
Вызов register_rest_route() принимает три параметра: пространство имён маршрута, путь и массив настроек. В массиве указываются методы HTTP, которые поддерживает маршрут, и функция-обработчик, которая возвращает данные.
Функция-обработчик получает объект WP_REST_Request, через который можно получить параметры запроса, заголовки, тело и пр.
Обработка POST-запросов и создание ресурсов через REST API
REST API позволяет не только получать данные, но и создавать их. Для этого нужно добавить маршрут с методом POST и реализовать логику создания.
add_action('rest_api_init', function () {
register_rest_route('wpcontent/v1', '/tasks', array(
'methods' => 'POST',
'callback' => 'wpcontent_create_task',
'permission_callback' => function () {
return current_user_can('edit_posts');
}
));
});
function wpcontent_create_task(WP_REST_Request $request) {
$params = $request->get_json_params();
if (empty($params['title'])) {
return new WP_Error('no_title', 'Название задачи обязательно', array('status' => 400));
}
// Здесь можно сохранить задачу в базу, например, через кастомный тип записи или опцию
// Для примера просто возвращаем переданные данные
$new_task = array(
'id' => rand(100,999),
'title' => sanitize_text_field($params['title']),
);
return rest_ensure_response($new_task);
}
Обратите внимание на параметр permission_callback. Он отвечает за проверку прав доступа. В данном случае только пользователи с правом edit_posts смогут создавать задачи.
Примеры популярных плагинов, использующих REST API
Некоторые плагины активно используют REST API для расширения функциональности:
- WPGraphQL — расширяет REST API возможностями GraphQL.
- Advanced Custom Fields (ACF) — позволяет работать с дополнительными полями через REST API с помощью дополнений.
- Contact Form 7 — поддерживает отправку форм через AJAX и REST API.
Изучение их кода поможет понять лучшие практики работы с REST API.
Советы по безопасности при работе с REST API
При создании собственных маршрутов обязательно проверяйте права доступа, чтобы не допустить несанкционированных действий. Для этого используйте параметр permission_callback, проверяйте nonce и права пользователя.
Также не стоит раскрывать в API конфиденциальные данные и использовать в ответах только необходимую информацию.
Работа с параметрами запроса и фильтрация данных
REST API позволяет принимать параметры через URL и тело запроса. Рассмотрим пример маршрута с параметрами для фильтрации списка задач.
add_action('rest_api_init', function () {
register_rest_route('wpcontent/v1', '/tasks', array(
'methods' => 'GET',
'callback' => 'wpcontent_get_tasks_filtered',
'args' => array(
'status' => array(
'required' => false,
'validate_callback' => function($param) {
return in_array($param, array('new', 'completed'), true);
},
),
),
));
});
function wpcontent_get_tasks_filtered(WP_REST_Request $request) {
$status = $request->get_param('status');
$tasks = array(
array('id' => 1, 'title' => 'Сделать резервную копию', 'status' => 'completed'),
array('id' => 2, 'title' => 'Обновить плагины', 'status' => 'new'),
array('id' => 3, 'title' => 'Проверить безопасность', 'status' => 'new'),
);
if ($status) {
$tasks = array_filter($tasks, function($task) use ($status) {
return $task['status'] === $status;
});
}
return rest_ensure_response(array_values($tasks));
}
В этом примере мы принимаем необязательный параметр status и фильтруем задачи по нему. Благодаря валидации параметров API становится надежнее и удобнее для клиентов.
Интеграция REST API с фронтендом на JavaScript
Для вызова REST API с фронтенда можно использовать стандартный fetch или библиотеки типа Axios. Пример получения списка задач:
fetch('/wp-json/wpcontent/v1/tasks')
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error('Ошибка:', err));
Для отправки POST-запроса с созданием новой задачи обязательно передавайте nonce для безопасности и заголовки:
fetch('/wp-json/wpcontent/v1/tasks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': wpApiSettings.nonce
},
body: JSON.stringify({ title: 'Новая задача' })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error('Ошибка:', err));
<Чтобы передать nonce, необходимо локализовать скрипт в PHP, например:
function wpcontent_enqueue_scripts() {
wp_enqueue_script('wpcontent-script', plugin_dir_url(__FILE__) . 'script.js', array('jquery'), null, true);
wp_localize_script('wpcontent-script', 'wpApiSettings', array(
'nonce' => wp_create_nonce('wp_rest')
));
}
add_action('wp_enqueue_scripts', 'wpcontent_enqueue_scripts');
Заключение
REST API в WordPress — это современный и гибкий инструмент, который открывает новые горизонты в разработке плагинов и тем. В статье мы рассмотрели, как создавать собственные маршруты, работать с методами GET и POST, обеспечивать безопасность, а также интегрировать API с фронтендом. Благодаря REST API ваши расширения могут стать более интерактивными, масштабируемыми и удобными для пользователей.