Как использовать REST API в WordPress для создания плагинов

Что такое REST API в WordPress и зачем он нужен

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

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

Понимание работы REST API критично для разработки современных расширений WordPress, особенно если ваш плагин должен взаимодействовать с фронтендом на React, Vue или мобильными приложениями.

Регистрация собственных маршрутов REST API в плагине

Чтобы расширить стандартный REST API, нужно зарегистрировать свои маршруты. Это выполняется с помощью функции register_rest_route(), которая вызывается на хуке rest_api_init.

Рассмотрим пример регистрации нового маршрута для нашего плагина wpengine_rest_api_example:

add_action('rest_api_init', function () {
    register_rest_route('wpengine/v1', '/message/', array(
        'methods' => 'GET',
        'callback' => 'wpengine_rest_api_example_get_message',
    ));
});

function wpengine_rest_api_example_get_message(WP_REST_Request $request) {
    return array('message' => 'Привет от WPengine REST API!');
}

В этом примере мы создали новый маршрут /wpengine/v1/message/, который при GET-запросе будет возвращать JSON с сообщением. Такой подход позволяет легко расширять API под нужды вашего плагина.

Параметры маршрута и проверка входных данных

Очень важно валидировать и фильтровать параметры запросов, чтобы избежать ошибок и угроз безопасности. В register_rest_route() можно указать схему параметров и функцию проверки.

register_rest_route('wpengine/v1', '/user/(?P<id>\d+)', array(
    'methods' => 'GET',
    'callback' => 'wpengine_rest_api_example_get_user',
    'args' => array(
        'id' => array(
            'validate_callback' => function($param, $request, $key) {
                return is_numeric($param) && $param > 0;
            }
        ),
    ),
));

function wpengine_rest_api_example_get_user(WP_REST_Request $request) {
    $user_id = (int)$request->get_param('id');
    $user = get_userdata($user_id);
    if (!$user) {
        return new WP_Error('no_user', 'Пользователь не найден', array('status' => 404));
    }
    return array('id' => $user->ID, 'login' => $user->user_login, 'email' => $user->user_email);
}

Здесь мы регистрируем маршрут с параметром id, который проверяется на положительное число. Если пользователь с таким ID не найден, возвращается ошибка с кодом 404.

Пример: создание плагина с REST API для управления заметками

Далее создадим простой плагин, который позволит создавать, получать и удалять пользовательские заметки через REST API.

Структура плагина

  • Регистрация кастомного типа записи note
  • Создание REST API маршрутов для CRUD операций
  • Обработка запросов с проверкой прав пользователя

Код плагина

/**
 * Регистрация кастомного типа записи 'note'
 */
function wpengine_rest_api_example_register_post_type() {
    register_post_type('note', array(
        'label' => 'Заметки',
        'public' => false,
        'show_ui' => true,
        'supports' => array('title', 'editor'),
        'show_in_rest' => true,
        'rest_base' => 'notes',
    ));
}
add_action('init', 'wpengine_rest_api_example_register_post_type');

/**
 * Регистрация маршрутов REST API
 */
function wpengine_rest_api_example_register_routes() {
    register_rest_route('wpengine/v1', '/notes/', array(
        'methods' => 'GET',
        'callback' => 'wpengine_rest_api_example_get_notes',
        'permission_callback' => function() {
            return current_user_can('read');
        },
    ));

    register_rest_route('wpengine/v1', '/notes/', array(
        'methods' => 'POST',
        'callback' => 'wpengine_rest_api_example_create_note',
        'permission_callback' => function() {
            return current_user_can('edit_posts');
        },
        'args' => array(
            'title' => array('required' => true),
            'content' => array('required' => true),
        ),
    ));

    register_rest_route('wpengine/v1', '/notes/(?P<id>\d+)', array(
        'methods' => 'DELETE',
        'callback' => 'wpengine_rest_api_example_delete_note',
        'permission_callback' => function() {
            return current_user_can('delete_posts');
        },
    ));
}
add_action('rest_api_init', 'wpengine_rest_api_example_register_routes');

/**
 * Получение заметок текущего пользователя
 */
function wpengine_rest_api_example_get_notes(WP_REST_Request $request) {
    $current_user_id = get_current_user_id();
    $args = array(
        'post_type' => 'note',
        'author' => $current_user_id,
        'post_status' => 'publish',
        'numberposts' => -1,
    );
    $notes = get_posts($args);
    $result = array();
    foreach ($notes as $note) {
        $result[] = array(
            'id' => $note->ID,
            'title' => $note->post_title,
            'content' => $note->post_content,
        );
    }
    return $result;
}

/**
 * Создание новой заметки
 */
function wpengine_rest_api_example_create_note(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_type' => 'note',
        'post_title' => $title,
        'post_content' => $content,
        'post_status' => 'publish',
        'post_author' => get_current_user_id(),
    ));

    if (is_wp_error($post_id)) {
        return new WP_Error('cannot_create', 'Не удалось создать заметку', array('status' => 500));
    }

    return array('id' => $post_id, 'title' => $title, 'content' => $content);
}

/**
 * Удаление заметки по ID
 */
function wpengine_rest_api_example_delete_note(WP_REST_Request $request) {
    $id = (int)$request->get_param('id');
    $post = get_post($id);

    if (!$post || $post->post_type !== 'note' || $post->post_author !== get_current_user_id()) {
        return new WP_Error('not_found', 'Заметка не найдена или доступ запрещен', array('status' => 404));
    }

    wp_delete_post($id, true);

    return array('deleted' => true, 'id' => $id);
}

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

Помимо самостоятельной разработки, есть готовые решения, которые упрощают работу с REST API:

  • WP REST API Controller — позволяет управлять доступом и видимостью стандартных маршрутов API через удобный интерфейс.
  • Advanced Custom Fields (ACF) — с помощью дополнения ACF to REST API можно добавить пользовательские поля в ответы API.
  • JWT Authentication for WP REST API — плагин для реализации аутентификации через JSON Web Tokens, что важно для безопасности.

Использование этих плагинов значительно ускорит разработку и улучшит безопасность ваших API-интерфейсов.

Советы по безопасности и производительности REST API

При разработке REST API важно учитывать безопасность:

  • Используйте permission_callback для проверки прав доступа к маршрутам.
  • Валидация и санитизация всех входных данных.
  • Ограничение объема возвращаемых данных и пагинация.
  • Кэширование ответов для уменьшения нагрузки на сервер.

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

Как отключить XML-RPC в WordPress для повышения безопасности
05.03.2026
Как создать автоматические задачи в WordPress с помощью WP-Cron
22.01.2026
WooCommerce: решение проблемы не отображения атрибутов вариативных товаров
05.06.2026
Как удалить старые чанк-блоки Gutenberg из базы данных WordPress
18.01.2026
Как разделить базу данных WordPress по таблицам для улучшения производительности
09.04.2026