WP REST API и WebSocket в WordPress: решение для real-time обмена данными

Использование WordPress REST API — отличный способ взаимодействовать с данными сайта через HTTP-запросы. Однако REST API по своей природе работает в режиме запрос-ответ, что не подходит для задач с реальным временем, например, для уведомлений, чатов, отображения динамических данных без перезагрузки страницы. Для таких сценариев идеально подходит протокол WebSocket, который обеспечивает постоянное двунаправленное соединение между клиентом и сервером.

Почему WP REST API недостаточно для real-time приложений

REST API в WordPress работает по классической модели: клиент делает запрос — сервер отвечает. Для обновления данных клиент должен периодически опрашивать сервер (polling), что ведет к излишней нагрузке и задержкам. В результате пользователь получает обновления с задержкой, а серверу приходится обрабатывать много лишних запросов.

Протокол WebSocket решает эти проблемы, позволяя держать открытое соединение и отправлять данные с сервера на клиент в момент их появления. Это идеально подходит для чатов, систем уведомлений, live-обновлений и других интерактивных функций.

Как совместить WP REST API с WebSocket — общая архитектура

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

Типичная схема:

  • Пользователь взаимодействует с фронтендом, который обращается к WP REST API для общих данных.
  • Когда требуется real-time обновление, фронтенд устанавливает WebSocket-соединение с отдельным сервером.
  • WordPress при определенных событиях (например, при публикации поста) отправляет уведомление серверу WebSocket через REST API или напрямую через сокет.
  • Сервер WebSocket рассылает обновления подключенным клиентам в режиме реального времени.

Пример интеграции: создание WebSocket-сервера на PHP для WordPress

Для запуска WebSocket-сервера можно использовать библиотеку Ratchet. Ниже пример простого сервера:

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class WPAPIWebSocketServer implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        // Для примера просто рассылаем сообщение всем
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection {$conn->resourceId} has disconnected\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "An error has occurred: {$e->getMessage()}\n";
        $conn->close();
    }
}

// Запуск сервера
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;

require dirname(__DIR__) . '/vendor/autoload.php';

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new WPAPIWebSocketServer()
        )
    ),
    8080
);

$server->run();

Этот сервер слушает порт 8080 и принимает WebSocket-соединения. Для интеграции с WordPress можно добавить REST API эндпоинт, который будет отправлять сообщения на WebSocket-сервер при определенных событиях.

Создание REST API эндпоинта для отправки уведомлений на WebSocket

Добавим в WordPress следующий код, который отправляет POST-запрос серверу WebSocket:

add_action('rest_api_init', function () {
    register_rest_route('wpapi/v1', '/notify', [
        'methods' => 'POST',
        'callback' => 'wpapi_send_notification',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
    ]);
});

function wpapi_send_notification(WP_REST_Request $request) {
    $message = $request->get_param('message');

    // Отправка сообщения на WebSocket-сервер
    $url = 'http://localhost:8080/send'; // Пример, зависит от реализации WebSocket-сервера

    $response = wp_remote_post($url, [
        'body' => json_encode(['message' => $message]),
        'headers' => ['Content-Type' => 'application/json'],
    ]);

    if (is_wp_error($response)) {
        return new WP_Error('send_failed', 'Не удалось отправить уведомление', ['status' => 500]);
    }

    return ['success' => true];
}

В этом примере WordPress отправляет уведомление на WebSocket-сервер, который затем рассылает сообщение всем подключенным клиентам.

Использование готовых плагинов и решений

Если не хочется реализовывать WebSocket-сервер с нуля, можно воспользоваться готовыми решениями:

  • WP WebSockets — плагин, реализующий WebSocket сервер внутри WordPress. Удобен для быстрой интеграции, но может быть ограничен по нагрузке.
  • Pusher или Ably — внешние SaaS-сервисы для real-time обмена данными с простым API. Интегрируются с WordPress через плагины или кастомный код.
  • Socket.IO — если есть возможность поднять Node.js сервер, можно использовать его в связке с WordPress для real-time функций.

Например, плагин WP WebSockets от WPShop позволяет быстро добавить поддержку WebSocket в WordPress, включая отправку сообщений из PHP и JavaScript.

Пример использования WP WebSockets в теме или плагине

После установки и активации плагина можно отправлять сообщения с помощью PHP функции:

wpwebsockets_send_message('channel_name', 'Ваше сообщение');

А на клиенте подключиться к каналу и слушать сообщения:

const socket = new WebSocket('wss://ваш-сайт.ru:порт');
socket.onmessage = function(event) {
    console.log('Новое сообщение:', event.data);
};

Заключение: когда стоит использовать WebSocket с WP REST API

Если ваш проект требует обмена данными в реальном времени, например, чаты, уведомления, live-обновления, WebSocket — оптимальный выбор. REST API отлично подходит для стандартных CRUD операций и начальной загрузки данных, а WebSocket дополняет их, обеспечивая мгновенную реакцию на события.

Интеграция WebSocket в WordPress требует дополнительного сервера или плагина, но современные решения и библиотеки значительно упрощают эту задачу. Используйте проверенные библиотеки, следите за безопасностью и масштабируемостью, и вы получите мощный real-time функционал на базе WordPress.

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