wphow.ru wordpress WPHow

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

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

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

Что такое REST API в WordPress и зачем создавать собственные endpoint’ы

REST API (Representational State Transfer Application Programming Interface) — это архитектурный стиль взаимодействия между клиентом и сервером через стандартные HTTP-запросы. В WordPress REST API уже встроен и позволяет получать, создавать, редактировать и удалять записи, страницы, пользователей и другие сущности.

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

Создание собственного REST API endpoint позволяет:

  • Расширить стандартный функционал WordPress;
  • Создать API для мобильных приложений или SPA на React/Vue;
  • Поддерживать интеграции с другими системами;
  • Обеспечить безопасность и контроль доступа к данным;
  • Оптимизировать обмен данными без загрузки страниц.

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

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

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

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

function wphow_get_latest_posts() {
    $args = array(
        'numberposts' => 5,
        'post_status' => 'publish'
    );
    $recent_posts = wp_get_recent_posts($args);
    return rest_ensure_response($recent_posts);
}

Объяснение:

  • wphow_register_custom_endpoint — функция для регистрации маршрута /wp-json/wphow/v1/latest-posts/.
  • 'methods' => 'GET' — указывает, что endpoint поддерживает GET-запросы.
  • callback — функция, которая выполнится при обращении к endpoint и вернет данные.
  • permission_callback — функция для проверки доступа. Здесь мы разрешаем всем (можно усложнить для авторизованных пользователей).

Теперь вы можете получить последние 5 постов, отправив запрос по адресу https://ваш-сайт.ru/wp-json/wphow/v1/latest-posts/.

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

Чтобы сделать API гибче, добавим возможность указывать количество постов через параметр count в запросе, например: /wp-json/wphow/v1/latest-posts/?count=10.

Изменим функцию регистрации и callback следующим образом:

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

function wphow_get_latest_posts($request) {
    $count = (int) $request->get_param('count');
    $args = array(
        'numberposts' => $count,
        'post_status' => 'publish'
    );
    $recent_posts = wp_get_recent_posts($args);
    return rest_ensure_response($recent_posts);
}

Таким образом, мы обеспечили валидацию параметра и ограничили максимальное значение параметра count до 20, чтобы не перегружать сервер излишним объемом данных.

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

REST API в WordPress позволяет не только читать, но и создавать записи. Для примера создадим endpoint, который будет принимать POST-запрос с параметрами title и content для создания новой записи.

add_action('rest_api_init', 'wphow_register_post_creation_endpoint');
function wphow_register_post_creation_endpoint() {
    register_rest_route('wphow/v1', '/create-post/', array(
        'methods' => 'POST',
        'callback' => 'wphow_create_post',
        'permission_callback' => 'wphow_check_api_permission',
        'args' => array(
            'title' => array(
                'required' => true,
                'sanitize_callback' => 'sanitize_text_field'
            ),
            'content' => array(
                'required' => true,
                'sanitize_callback' => 'wp_kses_post'
            ),
        ),
    ));
}

function wphow_create_post($request) {
    $title = $request->get_param('title');
    $content = $request->get_param('content');

    $post_data = array(
        'post_title' => $title,
        'post_content' => $content,
        'post_status' => 'draft',
        'post_author' => get_current_user_id(),
        'post_type' => 'post',
    );

    $post_id = wp_insert_post($post_data);

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

    return rest_ensure_response(array('post_id' => $post_id, 'message' => 'Запись успешно создана'));
}

function wphow_check_api_permission() {
    return current_user_can('edit_posts');
}

Обратите внимание на функцию wphow_check_api_permission, которая проверяет, имеет ли пользователь право создавать записи. Это важный момент для безопасности API.

Использование пользовательских типов записей и метаданных в REST API

Если у вас есть кастомные типы записей (Custom Post Types) или метаданные, вы также можете расширять REST API для работы с ними.

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

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

Для добавления собственных полей в REST API можно использовать функцию register_rest_field:

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

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

function wphow_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);
}

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

Как тестировать собственные REST API endpoint’ы

Для тестирования созданных endpoint’ов можно использовать:

  • Браузер — для GET-запросов;
  • Postman или Insomnia — для сложных запросов (POST, PUT, DELETE);
  • curl из командной строки.

Пример curl-запроса для создания новой записи:

curl -X POST https://ваш-сайт.ru/wp-json/wphow/v1/create-post/ \
  -H 'Content-Type: application/json' \
  -d '{"title": "Новая запись через API", "content": "Содержимое записи."}' \
  -u username:application_password

Не забудьте использовать метод аутентификации для защищенных запросов, например, Basic Auth с паролями приложений WordPress.

Рекомендации по безопасности при создании REST API endpoint’ов

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

  • Всегда проверяйте права пользователя через permission_callback;
  • Санитизируйте и валидируйте все входящие данные;
  • Используйте nonce или другие методы аутентификации;
  • Ограничивайте объем выдаваемых данных;
  • Логируйте подозрительную активность.

Соблюдение этих правил поможет избежать уязвимостей и защитить сайт от несанкционированного доступа.

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

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

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

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

×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙