wp-code.ru wordpress WP-Codе

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

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

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

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

Собственный REST API endpoint позволяет:

  • создавать уникальные маршруты для получения или отправки данных;
  • интегрировать сайт с внешними сервисами, которые требуют особого формата данных;
  • организовывать кастомную бизнес-логику на сервере;
  • обеспечивать гибкость и расширяемость.

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

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

add_action('rest_api_init', 'wpcode_register_custom_endpoint');
function wpcode_register_custom_endpoint() {
    register_rest_route('wpcode/v1', '/latest-posts', array(
        'methods' => 'GET',
        'callback' => 'wpcode_get_latest_posts',
        'permission_callback' => '__return_true',
    ));
}

function wpcode_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' => $post->post_title,
            'link' => get_permalink($post->ID),
        );
    }
    return rest_ensure_response($data);
}

В этом коде мы создаём namespace wpcode/v1, а внутри него маршрут /latest-posts. При GET-запросе возвращается JSON с пятью последними опубликованными постами.

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

Для проверки можно перейти в браузере по адресу:

https://ваш-сайт.ru/wp-json/wpcode/v1/latest-posts

Вы получите JSON с данными постов. Такой подход отлично подходит для API, к которому не требуется аутентификация.

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

Часто нужно принимать параметры в запросе, чтобы фильтровать или сортировать данные. В нашем примере добавим параметр count, который задаёт количество постов.

add_action('rest_api_init', 'wpcode_register_custom_endpoint_with_params');
function wpcode_register_custom_endpoint_with_params() {
    register_rest_route('wpcode/v1', '/latest-posts', array(
        'methods' => 'GET',
        'callback' => 'wpcode_get_latest_posts_with_params',
        'permission_callback' => '__return_true',
        'args' => array(
            'count' => array(
                'validate_callback' => function($param, $request, $key) {
                    return is_numeric($param) && $param > 0 && $param <= 20;
                },
                'default' => 5,
            ),
        ),
    ));
}

function wpcode_get_latest_posts_with_params(WP_REST_Request $request) {
    $count = (int) $request->get_param('count');
    $args = array(
        'numberposts' => $count,
        'post_status' => 'publish',
    );
    $posts = get_posts($args);
    $data = array();
    foreach ($posts as $post) {
        $data[] = array(
            'id' => $post->ID,
            'title' => $post->post_title,
            'link' => get_permalink($post->ID),
        );
    }
    return rest_ensure_response($data);
}

Теперь, отправляя запрос https://ваш-сайт.ru/wp-json/wpcode/v1/latest-posts?count=10, вы получите 10 постов (но не больше 20 благодаря валидации).

Защита endpoint: проверка прав доступа и аутентификация

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

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

function wpcode_permission_check() {
    return is_user_logged_in();
}

register_rest_route('wpcode/v1', '/private-data', array(
    'methods' => 'GET',
    'callback' => 'wpcode_get_private_data',
    'permission_callback' => 'wpcode_permission_check',
));

function wpcode_get_private_data(WP_REST_Request $request) {
    $current_user = wp_get_current_user();
    return rest_ensure_response(array(
        'user_id' => $current_user->ID,
        'user_login' => $current_user->user_login,
        'message' => 'Это приватные данные',
    ));
}

Такой подход позволяет выполнять аутентификацию через стандартные механизмы WordPress (cookie, nonce). Для внешних приложений можно использовать OAuth, JWT или Basic Auth.

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

Для расширения и упрощения работы с REST API можно использовать плагины:

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

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

Работа с кастомными типами записей и таксономиями через REST API

Если на сайте есть кастомные типы записей (custom post types) и таксономии, их тоже можно подключить к REST API или создать отдельные endpoints.

Для регистрации кастомного типа записи с поддержкой REST API нужно указать параметр 'show_in_rest' => true:

function wpcode_register_custom_post_type() {
    register_post_type('product', array(
        'label' => 'Продукты',
        'public' => true,
        'show_in_rest' => true,
        'supports' => array('title', 'editor', 'thumbnail'),
    ));
}
add_action('init', 'wpcode_register_custom_post_type');

После этого стандартные REST API endpoints для продуктов будут доступны по адресу /wp-json/wp/v2/product.

Создание кастомного endpoint для кастомных данных

Можно создать endpoint, который вернёт только продукты с определённым условием, например, по цене (если есть метаполе).

add_action('rest_api_init', 'wpcode_register_products_by_price_endpoint');
function wpcode_register_products_by_price_endpoint() {
    register_rest_route('wpcode/v1', '/products-by-price', array(
        'methods' => 'GET',
        'callback' => 'wpcode_get_products_by_price',
        'permission_callback' => '__return_true',
        'args' => array(
            'min_price' => array(
                'validate_callback' => 'is_numeric',
                'default' => 0,
            ),
        ),
    ));
}

function wpcode_get_products_by_price(WP_REST_Request $request) {
    $min_price = $request->get_param('min_price');
    $args = array(
        'post_type' => 'product',
        'meta_query' => array(
            array(
                'key' => 'price',
                'value' => $min_price,
                'compare' => '>=',
                'type' => 'NUMERIC',
            ),
        ),
        'posts_per_page' => 10,
    );
    $query = new WP_Query($args);
    $data = array();
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $data[] = array(
                'id' => get_the_ID(),
                'title' => get_the_title(),
                'price' => get_post_meta(get_the_ID(), 'price', true),
                'link' => get_permalink(),
            );
        }
        wp_reset_postdata();
    }
    return rest_ensure_response($data);
}

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

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше