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

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

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

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

Однако часто возникает необходимость добавить собственный endpoint для специфичных задач: например, для работы с кастомными таблицами, интеграции с внешними сервисами, реализации бизнес-логики на стороне сервера. Создание собственного REST API endpoint позволяет сделать WordPress полноценным бекендом для SPA, мобильных приложений или просто расширить возможности сайта.

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

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

add_action('rest_api_init', 'wproot_register_custom_endpoint');
function wproot_register_custom_endpoint() {
    register_rest_route('wproot/v1', '/latest-posts/', [
        'methods' => 'GET',
        'callback' => 'wproot_get_latest_posts',
        'permission_callback' => '__return_true', // разрешаем всем
    ]);
}

function wproot_get_latest_posts(WP_REST_Request $request) {
    $args = [
        'posts_per_page' => 5,
        'post_status' => 'publish',
    ];
    $posts = get_posts($args);
    $data = [];
    foreach ($posts as $post) {
        $data[] = [
            'id' => $post->ID,
            'title' => get_the_title($post),
            'excerpt' => get_the_excerpt($post),
            'date' => get_the_date('', $post),
            'link' => get_permalink($post),
        ];
    }
    return rest_ensure_response($data);
}

Теперь, если обратиться через браузер или Postman к URL https://ваш-сайт.ru/wp-json/wproot/v1/latest-posts/, мы получим JSON с последними пятью постами.

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

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

add_action('rest_api_init', 'wproot_register_custom_endpoint');
function wproot_register_custom_endpoint() {
    register_rest_route('wproot/v1', '/latest-posts/', [
        'methods' => 'GET',
        'callback' => 'wproot_get_latest_posts',
        'permission_callback' => '__return_true',
        'args' => [
            'count' => [
                'required' => false,
                'default' => 5,
                'validate_callback' => function($param) {
                    return is_numeric($param) && $param > 0 && $param <= 20;
                },
                'sanitize_callback' => 'absint',
            ],
        ],
    ]);
}

function wproot_get_latest_posts(WP_REST_Request $request) {
    $count = $request->get_param('count');
    $args = [
        'posts_per_page' => $count,
        'post_status' => 'publish',
    ];
    $posts = get_posts($args);
    $data = [];
    foreach ($posts as $post) {
        $data[] = [
            'id' => $post->ID,
            'title' => get_the_title($post),
            'excerpt' => get_the_excerpt($post),
            'date' => get_the_date('', $post),
            'link' => get_permalink($post),
        ];
    }
    return rest_ensure_response($data);
}

Теперь можно запросить, например, https://ваш-сайт.ru/wp-json/wproot/v1/latest-posts/?count=10, чтобы получить 10 последних публикаций. Валидация параметра защитит от излишних нагрузок.

Добавление POST эндпоинта для создания записи

REST API поддерживает не только чтение, но и запись данных. Рассмотрим реализацию POST-запроса для создания нового поста через наш endpoint. Для этого важно правильно настроить проверку прав, чтобы только авторизованные пользователи могли создавать записи.

add_action('rest_api_init', 'wproot_register_post_creation_endpoint');
function wproot_register_post_creation_endpoint() {
    register_rest_route('wproot/v1', '/create-post/', [
        'methods' => 'POST',
        'callback' => 'wproot_create_post',
        'permission_callback' => function() {
            return current_user_can('edit_posts');
        },
        'args' => [
            'title' => [
                'required' => true,
                'validate_callback' => function($param) {
                    return is_string($param) && strlen($param) > 0;
                },
            ],
            'content' => [
                'required' => true,
            ],
        ],
    ]);
}

function wproot_create_post(WP_REST_Request $request) {
    $title = sanitize_text_field($request->get_param('title'));
    $content = wp_kses_post($request->get_param('content'));

    $new_post = [
        'post_title' => $title,
        'post_content' => $content,
        'post_status' => 'draft',
        'post_author' => get_current_user_id(),
    ];

    $post_id = wp_insert_post($new_post);

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

    return rest_ensure_response(['post_id' => $post_id, 'message' => 'Пост успешно создан в статусе черновика']);
}

Для тестирования такого запроса нужно отправить POST-запрос с заголовком авторизации и телом с параметрами title и content. Такой подход гарантирует безопасность и контроль доступа.

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

Создавая свои endpoints, важно помнить о безопасности:

  • Проверяйте права доступа — используйте permission_callback, чтобы ограничить доступ только авторизованным пользователям или определённым ролям.
  • Валидация и санитизация входящих данных — не доверяйте данным от клиента, всегда проверяйте и очищайте параметры.
  • Ограничение размера выборок — чтобы избежать излишней нагрузки, не отдавайте огромные объёмы данных одним запросом.
  • Кеширование результатов — если данные не меняются часто, используйте transient API или внешние кеши.

Кроме этого, для удобства разработки и отладки можно использовать плагины, например:

  • REST API Console — интерактивный клиент для тестирования API прямо в админке.
  • WP REST API Controller — позволяет настраивать и расширять эндпоинты без программирования.

Расширение функционала: добавление кастомных полей и метаданных в ответ

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

function wproot_register_custom_fields() {
    register_rest_field('post', 'wproot_custom_meta', [
        'get_callback' => function($post_arr) {
            $post_id = $post_arr['id'];
            return get_post_meta($post_id, 'wproot_custom_meta_key', true);
        },
        'schema' => [
            'description' => 'Кастомное мета поле',
            'type' => 'string',
        ],
    ]);
}
add_action('rest_api_init', 'wproot_register_custom_fields');

После добавления этого кода при запросе поста через REST API в ответе появится поле wproot_custom_meta с нужными данными. Это удобно для передачи дополнительной информации на фронтенд.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как удалить редиректы в WordPress без плагинов: практическое руководство
13.11.2025
Как создать свой плагин WordPress с настройками: пошаговое руководство
05.11.2025
Как создать собственный шорткод в WordPress: подробное руководство
17.11.2025
Как удалить все очередные задачи в WordPress Cron: практическое руководство
09.11.2025
Как использовать WP-CLI для управления WordPress с консоли: подробное руководство
07.12.2025
×
Делай контент живым!

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

Создать истории сейчас⋙