Как создать собственный REST API endpoint в WordPress с примерами кода

WordPress с версии 4.7 поставляется с мощным REST API, которое позволяет взаимодействовать с сайтом через HTTP-запросы. Однако часто возникает необходимость добавить свои собственные endpoint'ы для решения специфических задач. В этой статье подробно разберём, как создать собственный REST API endpoint в WordPress, чтобы получать, изменять или удалять данные на сайте.

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

REST API endpoint — это URL-адрес, по которому можно отправлять HTTP-запросы (GET, POST, PUT, DELETE и др.) для получения или изменения данных. В WordPress уже есть множество стандартных endpoints для работы с постами, пользователями, таксономиями и т.д. Но иногда стандартных методов недостаточно, и нужно расширить API собственными маршрутами.

Например, вы хотите предоставить мобильному приложению или внешнему сервису доступ к специфическим данным вашего сайта, которые не входят в стандартный набор. Или создать API для формы обратной связи с дополнительной логикой. В таких случаях и создают кастомные endpoint'ы.

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

Для регистрации собственного endpoint используется функция register_rest_route, которую нужно вызывать в хуке rest_api_init. Давайте рассмотрим простой пример.

add_action('rest_api_init', function() {
    register_rest_route('wpfreecourses/v1', '/hello', array(
        'methods' => 'GET',
        'callback' => 'wpfreecourses_hello_endpoint',
    ));
});

function wpfreecourses_hello_endpoint(WP_REST_Request $request) {
    return array('message' => 'Привет из собственного REST API endpoint!');
}

В этом примере мы создаём endpoint /wp-json/wpfreecourses/v1/hello, который при GET-запросе вернёт JSON с сообщением. Префикс wpfreecourses/v1 — это namespace и версия API, что помогает структурировать и версионировать ваши endpoint'ы.

Поддержка различных HTTP-методов

Вы можете указать несколько методов, например, 'GET, POST' или использовать константы, например WP_REST_Server::READABLE для GET и HEAD, и WP_REST_Server::CREATABLE для POST.

Пример регистрации POST-метода с обработкой входящих данных:

add_action('rest_api_init', function() {
    register_rest_route('wpfreecourses/v1', '/data', array(
        'methods' => 'POST',
        'callback' => 'wpfreecourses_save_data',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        }
    ));
});

function wpfreecourses_save_data(WP_REST_Request $request) {
    $params = $request->get_json_params();
    if (empty($params['title'])) {
        return new WP_Error('no_title', 'Не передан заголовок', array('status' => 400));
    }
    $post_id = wp_insert_post(array(
        'post_title' => sanitize_text_field($params['title']),
        'post_status' => 'draft',
        'post_type' => 'post'
    ));
    if (is_wp_error($post_id)) {
        return $post_id;
    }
    return array('success' => true, 'post_id' => $post_id);
}

Обработка параметров запроса и валидация данных

REST API позволяет принимать параметры как в URL (GET), так и в теле запроса (POST). Чтобы корректно работать с входящими данными, используйте методы объекта WP_REST_Request:

  • get_param() — получить параметр по имени
  • get_params() — получить все параметры
  • get_json_params() — получить параметры из JSON тела запроса

Важно проводить валидацию и санитизацию данных. В примере выше мы использовали sanitize_text_field для очистки строки заголовка.

Добавление схемы для endpoint

Чтобы описать структуру данных и параметры, можно добавить схему (schema). Это полезно для валидации и документации.

register_rest_route('wpfreecourses/v1', '/data', array(
    'methods' => 'POST',
    'callback' => 'wpfreecourses_save_data',
    'permission_callback' => function () {
        return current_user_can('edit_posts');
    },
    'args' => array(
        'title' => array(
            'required' => true,
            'type' => 'string',
            'sanitize_callback' => 'sanitize_text_field',
            'description' => 'Заголовок поста'
        ),
    ),
));

Безопасность и права доступа к REST API endpoint

Обязательно контролируйте, кто может использовать ваши endpoint'ы. Используйте параметр permission_callback для проверки прав пользователя.

Если endpoint публичный и не требует авторизации, верните true в permission_callback. Иначе проверяйте права, например:

'permission_callback' => function () {
    return current_user_can('edit_posts');
}

Без правильной проверки вы рискуете раскрыть конфиденциальные данные или позволить нежелательные действия.

Пример расширенного REST API endpoint для кастомного типа записи

Допустим, у вас есть кастомный тип записи course для сайта wpfreecourses.ru. Создадим endpoint для получения списка курсов с фильтрацией по категории и пагинацией.

add_action('rest_api_init', function() {
    register_rest_route('wpfreecourses/v1', '/courses', array(
        'methods' => 'GET',
        'callback' => 'wpfreecourses_get_courses',
        'args' => array(
            'category' => array('type' => 'string'),
            'per_page' => array('type' => 'integer', 'default' => 10),
            'page' => array('type' => 'integer', 'default' => 1),
        ),
        'permission_callback' => '__return_true',
    ));
});

function wpfreecourses_get_courses(WP_REST_Request $request) {
    $category = $request->get_param('category');
    $per_page = $request->get_param('per_page');
    $page = $request->get_param('page');

    $args = array(
        'post_type' => 'course',
        'posts_per_page' => $per_page,
        'paged' => $page,
    );

    if ($category) {
        $args['tax_query'] = array(
            array(
                'taxonomy' => 'course_category',
                'field' => 'slug',
                'terms' => sanitize_text_field($category),
            ),
        );
    }

    $query = new WP_Query($args);
    $courses = array();

    foreach ($query->posts as $post) {
        $courses[] = array(
            'id' => $post->ID,
            'title' => $post->post_title,
            'excerpt' => $post->post_excerpt,
            'link' => get_permalink($post->ID),
        );
    }

    return array(
        'total' => (int)$query->found_posts,
        'per_page' => $per_page,
        'page' => $page,
        'courses' => $courses,
    );
}

Использование плагина Clearfy Pro для расширения REST API

На сайте Clearfy Pro есть инструменты для оптимизации и безопасности REST API. Например, можно управлять доступом к стандартным endpoint'ам, отключать ненужные маршруты и защищать API от нежелательных запросов.

Это удобно, если вы создаёте собственные endpoint'ы и хотите избежать конфликтов или угроз безопасности.

Тестирование собственного REST API endpoint

После создания endpoint тестируйте его с помощью инструментов, таких как Postman, Insomnia или curl.

Пример запроса через curl:

curl https://ваш-сайт.ru/wp-json/wpfreecourses/v1/hello

Если всё сделано правильно, вы получите JSON с сообщением.

Для POST-запросов:

curl -X POST https://ваш-сайт.ru/wp-json/wpfreecourses/v1/data \
-H "Content-Type: application/json" \
-d '{"title":"Новый пост через API"}'

Выводы

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

Этот навык особенно полезен для разработчиков, создающих кастомные решения и мобильные приложения на базе WordPress.

Как избежать конфликтов между плагинами WordPress: практические советы и примеры кода
09.11.2025
Как создать уникальные заголовки и мета описания в WordPress для улучшения SEO
15.04.2026
WooCommerce: как автоматически создавать купоны при оформлении заказа
19.06.2026
Как создать собственный REST API endpoint в WordPress с примерами кода
22.12.2025
Как автоматизировать удаление неиспользуемых медиафайлов в WordPress
05.04.2026