В современных проектах на WordPress часто возникает необходимость создавать собственные API для обмена данными между сайтом и внешними приложениями или мобильными клиентами. В этой статье мы подробно разберём, как создать уникальный клиентский API в WordPress, обеспечив безопасность и удобство работы с данными.
Основы создания REST API в WordPress
WordPress изначально поддерживает REST API, что позволяет разработчикам создавать свои эндпоинты для получения, добавления, обновления и удаления данных. Для этого используется класс WP_REST_Controller и функции регистрации маршрутов.
Создадим базовый пример регистрации собственного маршрута, который вернёт список последних постов:
add_action('rest_api_init', 'wpstandart_register_api_routes');
function wpstandart_register_api_routes() {
register_rest_route('wpstandart/v1', '/latest-posts', array(
'methods' => 'GET',
'callback' => 'wpstandart_get_latest_posts',
'permission_callback' => '__return_true',
));
}
function wpstandart_get_latest_posts(WP_REST_Request $request) {
$args = array(
'numberposts' => 5,
'post_status' => 'publish',
);
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => get_the_title($post->ID),
'excerpt' => get_the_excerpt($post->ID),
'date' => get_the_date('', $post->ID),
);
}
return rest_ensure_response($data);
}Этот простой эндпоинт доступен по адресу https://your-site.ru/wp-json/wpstandart/v1/latest-posts и возвращает последние 5 опубликованных записей.
Добавление аутентификации и безопасности API
Чтобы API был полезным и безопасным, нужно ограничить доступ к некоторым маршрутам. WordPress поддерживает несколько способов аутентификации: cookie, OAuth, JWT и др. Для простоты рассмотрим использование nonce и проверки прав пользователя.
Пример безопасной проверки прав для эндпоинта, который возвращает данные текущего пользователя:
register_rest_route('wpstandart/v1', '/user-data', array(
'methods' => 'GET',
'callback' => 'wpstandart_get_user_data',
'permission_callback' => function () {
return is_user_logged_in();
},
));
function wpstandart_get_user_data(WP_REST_Request $request) {
$user = wp_get_current_user();
return rest_ensure_response(array(
'ID' => $user->ID,
'login' => $user->user_login,
'email' => $user->user_email,
));
}Такая проверка позволит вызовы делать только авторизованным пользователям, что важно для защиты личных данных.
Обработка POST-запросов и сохранение данных
Для создания уникального API важно уметь принимать и обрабатывать данные. Например, добавим эндпоинт для создания записи с передачей заголовка и содержимого.
register_rest_route('wpstandart/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'wpstandart_create_post',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
),
'content' => array(
'required' => true,
'sanitize_callback' => 'wp_kses_post',
),
),
));
function wpstandart_create_post(WP_REST_Request $request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_type' => 'post',
));
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Ошибка создания записи', array('status' => 500));
}
return rest_ensure_response(array('post_id' => $post_id, 'message' => 'Запись создана и находится в черновиках'));
}Такой эндпоинт позволяет внешним приложениям создавать записи на сайте, при этом доступ разрешён только пользователям с правами редактирования.
Использование плагина Clearfy Pro для управления API
Для расширенного управления REST API, ограничения доступа и оптимизации можно использовать плагин Clearfy Pro. Он позволяет отключать ненужные эндпоинты, контролировать права доступа и повышать безопасность вашего API.
Например, с Clearfy Pro можно блокировать стандартные маршруты, которые вы не используете, чтобы снизить риск утечек данных или атак.
Резюме по созданию уникального API
1. Используйте register_rest_route для создания собственных маршрутов.
2. Обязательно реализуйте проверки прав в permission_callback, чтобы защитить данные.
3. Санитизируйте и валидируйте все входящие параметры.
4. Для сложных сценариев применяйте плагины безопасности, например, Clearfy Pro.
5. Тестируйте API с помощью инструментов Postman или curl для проверки корректной работы.
Пример полноценного расширенного API с регистрацией кастомного типа записи
В дополнение, можно расширить API, создав кастомный тип записи и добавив для него собственные маршруты. Пример регистрации типа «portfolio» и эндпоинта для него:
add_action('init', 'wpstandart_register_portfolio_cpt');
function wpstandart_register_portfolio_cpt() {
register_post_type('portfolio', array(
'labels' => array(
'name' => 'Портфолио',
'singular_name' => 'Портфолио',
),
'public' => true,
'show_in_rest' => true,
'supports' => array('title', 'editor', 'thumbnail'),
));
}
add_action('rest_api_init', 'wpstandart_register_portfolio_routes');
function wpstandart_register_portfolio_routes() {
register_rest_route('wpstandart/v1', '/portfolio', array(
'methods' => 'GET',
'callback' => 'wpstandart_get_portfolio_items',
'permission_callback' => '__return_true',
));
}
function wpstandart_get_portfolio_items() {
$items = get_posts(array(
'post_type' => 'portfolio',
'numberposts' => 10,
'post_status' => 'publish',
));
$data = array();
foreach ($items as $item) {
$data[] = array(
'id' => $item->ID,
'title' => get_the_title($item->ID),
'content' => apply_filters('the_content', $item->post_content),
'thumbnail' => get_the_post_thumbnail_url($item->ID, 'medium'),
);
}
return rest_ensure_response($data);
}Так можно быстро получить удобный API для кастомного типа записи, который можно использовать в мобильных приложениях или на фронтенде.
Заключение
Создание уникального клиентского API в WordPress требует понимания REST API, правильной организации маршрутов, обработки данных и обеспечения безопасности. Воспользуйтесь приведёнными примерами и советами, чтобы реализовать удобное и надёжное API для вашего сайта.