Использование 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.