Как добавить собственные REST API эндпоинты в WordPress

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

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

REST API предоставляет возможность взаимодействовать с сайтом через стандартные HTTP-запросы (GET, POST, PUT, DELETE). Каждый эндпоинт — это URL, который обрабатывает определённый запрос и возвращает данные в формате JSON. Стандартные эндпоинты позволяют работать со страницами, постами, пользователями и т.д. Но что если вам нужно получить данные из кастомных таблиц или реализовать бизнес-логику? Тогда приходится создавать собственные эндпоинты.

Добавляя свои эндпоинты, вы получаете полный контроль над тем, какие данные и как возвращать, а также как обрабатывать запросы. Это особенно полезно для мобильных приложений, SPA или интеграций с внешними системами.

Регистрация собственного эндпоинта: базовый пример

Чтобы создать свой эндпоинт, нужно использовать хук rest_api_init и функцию register_rest_route. Рассмотрим пример, который добавит эндпоинт /wpapi/v1/hello, возвращающий простое приветствие.

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

function wpapi_hello_endpoint() {
    return array('message' => 'Привет от WPAPI!');
}

После добавления этого кода в файл плагина или в functions.php темы, при обращении к https://yoursite.ru/wp-json/wpapi/v1/hello вы получите JSON с сообщением.

Пояснения по коду

  • rest_api_init — событие, когда WordPress инициализирует REST API;
  • register_rest_route — функция для регистрации эндпоинта, принимает пространство имён (namespace), маршрут (route) и параметры;
  • methods — HTTP-метод, поддерживаемый эндпоинтом;
  • callback — функция, которая будет вызвана при запросе к эндпоинту.

Обработка параметров запроса и проверка прав доступа

Часто нужно принимать параметры от клиента: например, ID записи или фильтры. Также важно удостовериться, что запрос делает авторизованный пользователь, если данные не публичные.

Добавим к нашему примеру обработку параметра name и проверку прав.

add_action('rest_api_init', function() {
    register_rest_route('wpapi/v1', '/greet', array(
        'methods' => 'GET',
        'callback' => 'wpapi_greet_endpoint',
        'permission_callback' => function () {
            return current_user_can('read');
        },
        'args' => array(
            'name' => array(
                'required' => true,
                'validate_callback' => function($param, $request, $key) {
                    return is_string($param) && !empty($param);
                }
            ),
        ),
    ));
});

function wpapi_greet_endpoint($request) {
    $name = sanitize_text_field($request->get_param('name'));
    return array('message' => 'Привет, ' . $name . '!');
}

Теперь при GET-запросе к /wp-json/wpapi/v1/greet?name=Иван вернётся приветствие с именем, но только для авторизованных пользователей с правом read.

Разбор особенностей

  • permission_callback — функция проверки прав, должна вернуть true или false;
  • args — описание ожидаемых параметров, с возможностью валидации и обязательности;
  • sanitize_text_field — стандартная функция для очистки входящих данных.

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

Если у вас есть кастомные типы записей (custom post types) и метаполя, их тоже можно использовать в REST API. Для этого нужно добавить поддержку REST API при регистрации типа записи и зарегистрировать метаполя.

Регистрация кастомного типа записи с поддержкой REST API

add_action('init', function() {
    register_post_type('wpapi_product', array(
        'label' => 'Продукты',
        'public' => true,
        'show_in_rest' => true,
        'rest_base' => 'products',
        'supports' => array('title', 'editor', 'custom-fields'),
    ));
});

А теперь зарегистрируем метаполе, которое тоже будет доступно через API.

add_action('rest_api_init', function() {
    register_rest_field('wpapi_product', 'price', array(
        'get_callback' => 'wpapi_get_product_price',
        'update_callback' => 'wpapi_update_product_price',
        'schema' => array(
            'description' => 'Цена продукта',
            'type' => 'number',
            'context' => array('view', 'edit'),
        ),
    ));
});

function wpapi_get_product_price($object) {
    return get_post_meta($object['id'], 'price', true);
}

function wpapi_update_product_price($value, $object, $field_name) {
    if (!is_numeric($value)) {
        return new WP_Error('rest_invalid_param', 'Цена должна быть числом.', array('status' => 400));
    }
    return update_post_meta($object->ID, $field_name, $value);
}

Теперь при запросах к эндпоинту /wp-json/wp/v2/products у каждого продукта будет поле price с возможностью читать и обновлять его через REST API.

Практические советы и лучшие практики при создании собственных эндпоинтов

Создавая REST API эндпоинты, следует учитывать несколько важных моментов:

  • Безопасность. Всегда проверяйте права доступа, не отдавайте чувствительные данные без проверки.
  • Валидация и санитизация. Обрабатывайте все входящие данные, чтобы избежать уязвимостей.
  • Именование. Используйте уникальное пространство имён (например, wpapi/v1) и префиксы в названиях функций, чтобы избежать конфликтов.
  • Документирование. Чётко описывайте параметры и формат ответов, это облегчает использование API другими разработчиками.
  • Кэширование. Для сложных и часто запрашиваемых данных используйте кэширование, чтобы снизить нагрузку на сервер.

Заключение: расширяйте WordPress с помощью своих REST API эндпоинтов

Добавление собственных REST API эндпоинтов — это мощный способ интеграции и кастомизации WordPress. Вы можете создать API под свои задачи, обеспечив гибкий и безопасный доступ к данным сайта. В этой статье мы рассмотрели основы создания таких эндпоинтов с примерами кода, которые можно использовать как шаблон для своих проектов. Пользуйтесь возможностями WPAPI и создавайте уникальные решения!

Шаблоны для WP Плагины для WP