В современных проектах на WordPress часто возникает необходимость автоматически отслеживать изменения контента, пользователей или других объектов и реагировать на них в реальном времени. Для этого отлично подходят webhook'и — механизмы, которые позволяют системе отправлять уведомления на сторонний сервер при наступлении определённых событий.
Что такое Webhook в контексте WordPress
Webhook — это HTTP-запрос, который WordPress отправляет на определённый URL при возникновении события. Например, можно настроить отправку webhook при публикации новой записи, обновлении профиля пользователя или изменении настроек.
Основное преимущество webhook — это возможность интеграции WordPress с внешними сервисами и автоматизация рабочих процессов без постоянного опроса сервера.
В WordPress нет встроенной поддержки webhook'ов в классическом понимании, но мы можем создать собственную систему на базе хуков и функций, которая будет отправлять HTTP-запросы при нужных событиях.
Настройка отправки webhook при изменении записи
Рассмотрим пример, как создать webhook, который будет срабатывать при публикации или обновлении записи. Для этого используем хук save_post, который вызывается при сохранении записи.
Добавим в файл functions.php вашей темы или в собственный плагин следующий код:
function wptask_send_webhook_on_post_save( $post_id, $post, $update ) {
// Игнорируем автосохранения и ревизии
if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) {
return;
}
// Формируем данные для отправки
$data = array(
'post_id' => $post_id,
'post_title' => $post->post_title,
'post_status' => $post->post_status,
'updated' => $update,
'timestamp' => current_time( 'mysql' ),
);
// URL для webhook
$webhook_url = 'https://example.com/webhook-endpoint';
// Отправка POST-запроса
wp_remote_post( $webhook_url, array(
'method' => 'POST',
'headers' => array('Content-Type' => 'application/json; charset=utf-8'),
'body' => json_encode( $data ),
'timeout' => 5,
) );
}
add_action( 'save_post', 'wptask_send_webhook_on_post_save', 10, 3 );В этом коде мы отправляем JSON с информацией о записи на сторонний URL каждый раз, когда запись создаётся или обновляется. Вы можете заменить $webhook_url на адрес вашего сервера, который будет обрабатывать эти данные.
Настройка приема webhook и реакция на данные
Для полноты картины рассмотрим, как может выглядеть простой обработчик webhook на стороне сервера, который принимает уведомления из WordPress. Например, на PHP:
<?php
// webhook-endpoint.php
// Получаем данные из входящего запроса
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if ($data) {
// Логируем или обрабатываем данные
file_put_contents('webhook_log.txt', print_r($data, true), FILE_APPEND);
// Здесь можно запускать любые действия, например, обновлять базу данных, отправлять email и т.д.
}
http_response_code(200); // Отвечаем, что запрос обработан успешно
?>Отслеживание изменений пользователей через Webhook
Аналогично можно настроить webhook на события, связанные с пользователями, например, при регистрации, обновлении профиля или удалении пользователя.
В WordPress есть хуки user_register, profile_update и delete_user. Используем их для отправки webhook'ов.
function wptask_send_webhook_on_user_change( $user_id ) {
$user = get_userdata( $user_id );
if ( ! $user ) {
return;
}
$data = array(
'user_id' => $user_id,
'user_login' => $user->user_login,
'user_email' => $user->user_email,
'timestamp' => current_time( 'mysql' ),
);
$webhook_url = 'https://example.com/user-webhook-endpoint';
wp_remote_post( $webhook_url, array(
'method' => 'POST',
'headers' => array('Content-Type' => 'application/json; charset=utf-8'),
'body' => json_encode( $data ),
'timeout' => 5,
) );
}
add_action( 'user_register', 'wptask_send_webhook_on_user_change' );
add_action( 'profile_update', 'wptask_send_webhook_on_user_change' );
add_action( 'delete_user', 'wptask_send_webhook_on_user_change' );Этот код будет отправлять webhook при регистрации нового пользователя, изменении профиля и удалении пользователя. Это удобно для синхронизации данных с CRM, email-сервисами или внешними системами.
Полезные плагины для работы с Webhook в WordPress
Если не хочется писать код с нуля, можно использовать готовые решения:
- WP Webhooks — комплексный плагин для создания и приёма webhook, позволяет автоматизировать обмен данными между WordPress и внешними системами.
- AutomatorWP — плагин автоматизации с поддержкой webhook'ов, позволяет строить сложные сценарии без кода.
- Clearfy Pro — в пакете оптимизаций есть инструменты для управления REST API и webhook, повышающие безопасность и производительность.
Использование готовых плагинов ускорит разработку и упростит администрирование, особенно если вы не хотите погружаться в детали HTTP-запросов.
Практические советы по работе с Webhook
Обработка ошибок и повторные попытки
При отправке webhook важно учитывать ошибки сети или сбои сервера получателя. Рекомендуется логировать неудачные попытки и при необходимости реализовать механизм повторной отправки.
В базовом примере с wp_remote_post можно проверять результат и сохранять данные для повторных попыток, например, в отдельной таблице или опции WordPress.
Безопасность webhook
Webhook могут стать точкой входа для злоумышленников. Чтобы обезопасить систему, используйте:
- Авторизацию на стороне получателя (например, секретные ключи в заголовках).
- Проверку IP-адресов отправителей.
- Шифрование данных при необходимости.
Оптимизация производительности
Отправка webhook может замедлить выполнение основного запроса WordPress. Чтобы избежать задержек, рекомендуется использовать асинхронные задачи, например, через WP-Cron или очереди задач.
В простом случае можно выполнить отправку в отдельном процессе или отложить её, чтобы не блокировать пользователя.