wpmail.ru wordpress WP Mail

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

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

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

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

Создание собственного REST API расширяет возможности вашего сайта, позволяет строить SPA-приложения, мобильные приложения или интеграции с CRM, ERP и другими системами.

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

Регистрация маршрута происходит с помощью хука rest_api_init и функции register_rest_route(). Рассмотрим пример создания простого маршрута, который возвращает данные о текущем пользователе.

add_action('rest_api_init', 'wpmail_register_api_routes');
function wpmail_register_api_routes() {
    register_rest_route('wpmail/v1', '/current-user', [
        'methods' => 'GET',
        'callback' => 'wpmail_get_current_user',
        'permission_callback' => function () {
            return is_user_logged_in();
        }
    ]);
}

function wpmail_get_current_user(WP_REST_Request $request) {
    $user = wp_get_current_user();
    if ($user->ID === 0) {
        return new WP_Error('no_user', 'Пользователь не авторизован', ['status' => 401]);
    }
    return [
        'ID' => $user->ID,
        'login' => $user->user_login,
        'email' => $user->user_email
    ];
}

В этом примере мы регистрируем маршрут /wp-json/wpmail/v1/current-user, который возвращает информацию о залогиненном пользователе. Обратите внимание на permission_callback — проверка прав доступа. Без неё любой пользователь мог бы получить данные.

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

Часто нужно принимать параметры в запросах, например, ID поста или фильтры. Рассмотрим пример маршрута, который получает пост по ID, переданному в URL.

add_action('rest_api_init', 'wpmail_register_post_route');
function wpmail_register_post_route() {
    register_rest_route('wpmail/v1', '/post/(?P<id>\d+)', [
        'methods' => 'GET',
        'callback' => 'wpmail_get_post_by_id',
        'args' => [
            'id' => [
                'validate_callback' => function($param, $request, $key) {
                    return is_numeric($param) && $param > 0;
                }
            ]
        ],
        'permission_callback' => '__return_true'
    ]);
}

function wpmail_get_post_by_id(WP_REST_Request $request) {
    $id = (int) $request->get_param('id');
    $post = get_post($id);
    if (!$post) {
        return new WP_Error('no_post', 'Пост не найден', ['status' => 404]);
    }
    return [
        'ID' => $post->ID,
        'title' => $post->post_title,
        'content' => apply_filters('the_content', $post->post_content),
        'date' => $post->post_date
    ];
}

Здесь мы используем параметр id в URL, проверяем его валидность с помощью validate_callback и возвращаем данные поста. Если пост не найден, возвращаем ошибку с HTTP кодом 404.

Дополнительные параметры и фильтрация

Вы можете добавлять параметры в запросы GET или POST, например, фильтры по дате, категории и т.д. Важно валидировать и санитизировать все входящие данные, чтобы избежать уязвимостей.

Пример добавления параметра category:

register_rest_route('wpmail/v1', '/posts', [
    'methods' => 'GET',
    'callback' => 'wpmail_get_posts_by_category',
    'args' => [
        'category' => [
            'required' => false,
            'sanitize_callback' => 'sanitize_text_field'
        ]
    ],
    'permission_callback' => '__return_true'
]);

function wpmail_get_posts_by_category(WP_REST_Request $request) {
    $category = $request->get_param('category');
    $args = [
        'post_type' => 'post',
        'posts_per_page' => 10
    ];
    if ($category) {
        $args['category_name'] = $category;
    }
    $query = new WP_Query($args);
    $posts = [];
    foreach ($query->posts as $post) {
        $posts[] = [
            'ID' => $post->ID,
            'title' => $post->post_title
        ];
    }
    return $posts;
}

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

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

add_action('rest_api_init', 'wpmail_register_create_post_route');
function wpmail_register_create_post_route() {
    register_rest_route('wpmail/v1', '/create-post', [
        'methods' => 'POST',
        'callback' => 'wpmail_create_post',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
        'args' => [
            'title' => [
                'required' => true,
                'sanitize_callback' => 'sanitize_text_field'
            ],
            'content' => [
                'required' => true,
                'sanitize_callback' => 'wp_kses_post'
            ]
        ]
    ]);
}

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

    $post_id = wp_insert_post([
        'post_title' => $title,
        'post_content' => $content,
        'post_status' => 'pending',
        'post_author' => get_current_user_id()
    ]);

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

    return [
        'message' => 'Пост успешно создан',
        'post_id' => $post_id
    ];
}

Обратите внимание, что вызывающий пользователь должен иметь право редактировать записи. Также мы санитизируем входящие данные с помощью встроенных функций WordPress. Статус поста установлен в pending для модерации перед публикацией.

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

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

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

Выбор плагинов зависит от целей проекта и требуемой функциональности.

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

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

  • Всегда используйте permission_callback, чтобы ограничить доступ к чувствительным данным.
  • Санитизируйте и валидируйте все входящие данные.
  • Не возвращайте лишнюю информацию, особенно если это касается персональных данных.
  • Используйте аутентификацию (например, JWT или OAuth) для защищённых маршрутов.
  • Проверяйте и обновляйте используемые плагины для REST API во избежание уязвимостей.

Заключение

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

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее