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

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

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

REST API endpoint — это URL, по которому можно получить доступ к определённым данным или функциям сайта через запросы типа GET, POST, PUT, DELETE. Это удобно для интеграции WordPress с внешними сервисами, мобильными приложениями или для создания современных одностраничных приложений (SPA) на базе WordPress.

Создание собственного endpoint позволяет расширить стандартные возможности API, добавив уникальную бизнес-логику, фильтрацию данных, авторизацию и другие функции.

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

Для создания собственного REST API endpoint используется функция register_rest_route(). Она регистрирует новый маршрут и связывает его с обработчиком запроса.

Рассмотрим пример создания endpoint, который возвращает список кастомных записей «Отзывы» с дополнительными полями.

Пример кода регистрации маршрута

add_action('rest_api_init', 'wpgen_register_reviews_endpoint');
function wpgen_register_reviews_endpoint() {
    register_rest_route('wpgen/v1', '/reviews', array(
        'methods' => 'GET',
        'callback' => 'wpgen_get_reviews',
        'permission_callback' => '__return_true', // или своя функция проверки прав
    ));
}

Здесь мы создаём маршрут /wp-json/wpgen/v1/reviews с методом GET, который вызывает функцию wpgen_get_reviews.

Обработка запроса и получение данных

В функции-обработчике получаем нужные записи и формируем ответ в формате JSON:

function wpgen_get_reviews(WP_REST_Request $request) {
    $args = array(
        'post_type' => 'review', // ваш кастомный тип записи
        'posts_per_page' => 10,
        'post_status' => 'publish',
    );
    $query = new WP_Query($args);
    $reviews = array();
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $reviews[] = array(
                'id' => get_the_ID(),
                'title' => get_the_title(),
                'content' => get_the_content(),
                'rating' => get_post_meta(get_the_ID(), 'rating', true),
            );
        }
        wp_reset_postdata();
    }
    return rest_ensure_response($reviews);
}

Добавление параметров и фильтров к REST API endpoint

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

register_rest_route('wpgen/v1', '/reviews', array(
    'methods' => 'GET',
    'callback' => 'wpgen_get_reviews',
    'permission_callback' => '__return_true',
    'args' => array(
        'rating' => array(
            'validate_callback' => function($param, $request, $key) {
                return is_numeric($param) && $param >= 1 && $param <= 5;
            },
            'required' => false,
        ),
        'page' => array(
            'validate_callback' => 'is_numeric',
            'default' => 1,
        ),
    ),
));

В функции-обработчике используйте параметры из запроса:

function wpgen_get_reviews(WP_REST_Request $request) {
    $rating = $request->get_param('rating');
    $page = max(1, (int) $request->get_param('page'));
    $args = array(
        'post_type' => 'review',
        'posts_per_page' => 10,
        'paged' => $page,
        'post_status' => 'publish',
    );
    if ($rating) {
        $args['meta_query'] = array(
            array(
                'key' => 'rating',
                'value' => $rating,
                'compare' => '=',
                'type' => 'NUMERIC',
            ),
        );
    }
    // остальной код запроса
}

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

Важно контролировать, кто может обращаться к вашему endpoint. В параметре permission_callback укажите функцию, которая проверит права пользователя или API-ключ.

Например, чтобы разрешить доступ только авторизованным пользователям:

function wpgen_check_permissions() {
    return is_user_logged_in();
}

И зарегистрировать маршрут так:

register_rest_route('wpgen/v1', '/reviews', array(
    'methods' => 'GET',
    'callback' => 'wpgen_get_reviews',
    'permission_callback' => 'wpgen_check_permissions',
));

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

REST API в WordPress позволяет не только получать данные, но и создавать или обновлять их. Рассмотрим пример обработки POST-запроса для добавления нового отзыва.

add_action('rest_api_init', 'wpgen_register_create_review_endpoint');
function wpgen_register_create_review_endpoint() {
    register_rest_route('wpgen/v1', '/review', array(
        'methods' => 'POST',
        'callback' => 'wpgen_create_review',
        'permission_callback' => function() {
            return current_user_can('edit_posts');
        },
        'args' => array(
            'title' => array('required' => true),
            'content' => array('required' => true),
            'rating' => array(
                'required' => true,
                'validate_callback' => function($param) {
                    return is_numeric($param) && $param >= 1 && $param <= 5;
                },
            ),
        ),
    ));
}

function wpgen_create_review(WP_REST_Request $request) {
    $title = sanitize_text_field($request->get_param('title'));
    $content = sanitize_textarea_field($request->get_param('content'));
    $rating = intval($request->get_param('rating'));

    $post_id = wp_insert_post(array(
        'post_title' => $title,
        'post_content' => $content,
        'post_type' => 'review',
        'post_status' => 'pending', // на проверку
    ));

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

    update_post_meta($post_id, 'rating', $rating);

    return rest_ensure_response(array('success' => true, 'id' => $post_id));
}

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

Если вы хотите дополнительно защитить REST API и оптимизировать его работу, рекомендую обратить внимание на плагин Clearfy Pro. Он позволяет легко управлять правами доступа к API, ограничивать запросы и ускорять работу сайта.

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

Для тестирования можно использовать инструменты как Postman, curl или браузер (для GET-запросов). Пример запроса с curl:

curl https://example.com/wp-json/wpgen/v1/reviews?rating=5&page=1

Для POST-запроса с передачей JSON:

curl -X POST https://example.com/wp-json/wpgen/v1/review \
-H "Content-Type: application/json" \
-d '{"title":"Отличный плагин", "content":"Очень удобный и простой в использовании.", "rating":5}' \
-u user:password

Убедитесь, что аутентификация настроена корректно, если endpoint требует авторизации.

Итог

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

Если хотите быстро добавить расширенные возможности с управлением доступом, обратите внимание на Clearfy Pro. Это поможет избежать многих распространённых ошибок и повысить безопасность вашего API.

Как удалить загруженные файлы в WordPress после удаления плагинов
21.01.2026
Как создать автоматическое сообщение после отзыва в WordPress
07.03.2026
Как создать настройки плагина WordPress на основе Customizer
11.04.2026
Увеличение производительности WooCommerce за счёт оптимизации запросов в базе данных
02.05.2026
Как создать адаптивный велосипедный каталог на WordPress с фильтрами и сортировкой
27.12.2025