Как создать и использовать внутренний REST API в WordPress

В этой статье подробно рассмотрим, как создать собственный внутренний REST API в WordPress для обмена данными между вашим сайтом и внешними сервисами или фронтенд-приложениями. Это решение актуально для разработчиков, которые хотят расширить функционал сайта, организовать взаимодействие с мобильными приложениями или SPA (Single Page Application), а также упростить интеграцию с внешними системами.

Что такое REST API в WordPress и почему стоит создавать собственные эндпоинты

WordPress из коробки предоставляет мощный REST API, который позволяет читать, создавать, обновлять и удалять записи, страницы, пользователей и другие типы контента. Однако стандартный набор эндпоинтов не всегда покрывает специфические задачи проекта.

Создание собственных REST API-эндпоинтов позволяет:

  • Обеспечить доступ к кастомным данным и бизнес-логике;
  • Оптимизировать обмен данными под конкретные нужды клиента;
  • Обеспечить безопасность и контроль доступа к API;
  • Интегрировать нестандартные функции без изменения ядра WordPress.

Далее рассмотрим, как создавать и регистрировать свои маршруты, обрабатывать запросы и возвращать ответы.

Регистрация собственного REST API в WordPress

Для регистрации собственного эндпоинта используйте хук rest_api_init. В обработчике этого хука вызывается функция register_rest_route, в которой задаются название маршрута, методы запроса и callback-функция.

Пример регистрации простого эндпоинта, который возвращает список последних 5 публикаций:

add_action('rest_api_init', 'wpin_register_custom_routes');
function wpin_register_custom_routes() {
    register_rest_route('wpin/v1', '/latest-posts', array(
        'methods' => 'GET',
        'callback' => 'wpin_get_latest_posts',
        'permission_callback' => '__return_true', // для публичного доступа
    ));
}

function wpin_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),
            'link' => get_permalink($post),
            'date' => get_the_date('', $post)
        );
    }
    return rest_ensure_response($data);
}

Теперь при запросе https://your-site.ru/wp-json/wpin/v1/latest-posts вы получите JSON-массив с данными последних пяти публикаций.

Добавление параметров и фильтрация данных в REST API

Очень часто нужно принимать параметры от клиента, чтобы фильтровать или изменять результат. Для этого в register_rest_route можно задать схему аргументов и обработать их в callback.

Пример эндпоинта с параметром category для фильтрации постов по таксономии:

add_action('rest_api_init', 'wpin_register_filtered_posts_route');
function wpin_register_filtered_posts_route() {
    register_rest_route('wpin/v1', '/posts', array(
        'methods' => 'GET',
        'callback' => 'wpin_get_posts_by_category',
        'args' => array(
            'category' => array(
                'required' => false,
                'validate_callback' => function($param, $request, $key) {
                    return is_string($param) && !empty($param);
                },
            ),
        ),
        'permission_callback' => '__return_true',
    ));
}

function wpin_get_posts_by_category(WP_REST_Request $request) {
    $category = $request->get_param('category');
    $args = array(
        'post_status' => 'publish',
        'numberposts' => 10,
    );
    if ($category) {
        $args['category_name'] = sanitize_text_field($category);
    }
    $posts = get_posts($args);
    $data = array();
    foreach ($posts as $post) {
        $data[] = array(
            'id' => $post->ID,
            'title' => get_the_title($post),
            'link' => get_permalink($post),
            'date' => get_the_date('', $post),
        );
    }
    return rest_ensure_response($data);
}

Теперь можно делать запросы типа /wp-json/wpin/v1/posts?category=novosti и получать посты только из категории «новости».

Обработка POST-запросов: создание и обновление данных через REST API

Кроме GET-запросов, часто нужно принимать POST-запросы для создания или редактирования данных. Для этого указывайте 'methods' => 'POST' и реализуйте проверку прав в permission_callback.

Ниже пример эндпоинта для создания новой записи с проверкой прав пользователя:

add_action('rest_api_init', 'wpin_register_create_post_route');
function wpin_register_create_post_route() {
    register_rest_route('wpin/v1', '/create-post', array(
        'methods' => 'POST',
        'callback' => 'wpin_create_post',
        'permission_callback' => function() {
            return current_user_can('edit_posts');
        },
        'args' => array(
            'title' => array('required' => true),
            'content' => array('required' => true),
        ),
    ));
}

function wpin_create_post(WP_REST_Request $request) {
    $title = sanitize_text_field($request->get_param('title'));
    $content = sanitize_textarea_field($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' => 'Запись создана успешно'));
}

Этот эндпоинт позволит авторизованным пользователям с правом редактирования создавать новые записи в статусе черновика.

Безопасность и разрешения для REST API

Очень важно грамотно настроить разрешения и проверку прав доступа в permission_callback. Никогда не оставляйте этот параметр __return_true для операций, изменяющих данные.

Для проверки авторизации можно использовать функции WordPress, например, current_user_can(), is_user_logged_in() или реализовать OAuth / JWT аутентификацию для внешних клиентов.

Также не забывайте валидировать и санитизировать входящие данные, чтобы избежать уязвимостей.

Примеры полезных плагинов для работы с REST API в WordPress

  • WPRemark — плагин для управления отзывами с поддержкой REST API, который можно расширять своими эндпоинтами.
  • Clearfy Pro — оптимизационный плагин, позволяющий отключать ненужные REST API-вызовы для повышения безопасности.
  • WPStories — плагин для сторис с удобными REST API для управления контентом из внешних приложений.

Отладка и тестирование REST API

Для тестирования своих эндпоинтов удобно использовать инструменты:

  • Postman — мощный клиент для отправки HTTP-запросов;
  • curl — для быстрых запросов из терминала;
  • Плагины для браузера, например, REST API Console;
  • Встроенный в WordPress JSON-ответ с информацией об ошибках.

Также включайте режим отладки WordPress и логируйте ошибки для поиска проблем.

Выводы и рекомендации

Создание и использование собственных REST API в WordPress — мощный инструмент для расширения функционала и интеграции. Следите за безопасностью, валидируйте данные и тщательно тестируйте свои маршруты. Используйте готовые плагины для упрощения задач и придерживайтесь стандартов WordPress для максимальной совместимости.

Как удалить неиспользуемые шорткоды в WordPress
11.03.2026
Как удалить записи со старым мета-полем даты в WordPress
08.12.2025
WooCommerce: Обновление стоимости в корзине при изменении атрибутов товара
13.05.2026
Как добавить уникальный фильтр на таксономии WordPress с примерами кода
03.03.2026
Как создать автоматические задания в WordPress через WP-Cron и wp_schedule_event
21.03.2026