Для многих проектов на WordPress важна оперативная реакция на изменения в контенте — будь то публикация новой статьи, обновление существующей или удаление. Особенно это актуально при синхронизации контента между несколькими сайтами или интеграции с внешними сервисами. В этой статье разберём, как с помощью встроенных хуков WordPress и вебхуков (webhook) настроить надёжное отслеживание изменений в постах и отправку данных на сторонние системы.
Что такое hooks и webhook, и зачем их использовать для отслеживания изменений
Hooks (хуки) — это точки расширения в WordPress, которые позволяют запускать пользовательский код в ответ на определённые события. Например, при сохранении записи срабатывает хук save_post, а при её удалении — delete_post.
Webhook — это HTTP-запрос к внешнему URL при наступлении события, который позволяет автоматически уведомлять сторонние сервисы о произошедших изменениях.
Совмещение хуков и вебхуков позволяет не только отследить изменения на сайте, но и передать данные в реальном времени для дальнейшей обработки, что незаменимо в задачах синхронизации и интеграции.
Основные хуки для отслеживания изменений в постах WordPress
Чтобы корректно отследить все изменения, нужно учитывать несколько ключевых хуков:
save_post— вызывается при создании и обновлении записи.delete_post— срабатывает при удалении записи.transition_post_status— отслеживает смену статуса записи (например, с черновика на опубликованную).
Каждый из них даёт определённый набор данных и позволяет выполнить нужные действия.
Обработка события сохранения записи
Хук save_post передаёт ID записи и позволяет получить все её данные. Пример функции, которая вызывается при сохранении:
function wpsync_save_post_webhook($post_id) {
// Проверяем, чтобы не было автосохранения
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверяем права пользователя
if (!current_user_can('edit_post', $post_id)) {
return;
}
$post = get_post($post_id);
if ($post->post_type !== 'post') {
return;
}
// Формируем данные для webhook
$data = [
'ID' => $post_id,
'title' => $post->post_title,
'content' => $post->post_content,
'status' => $post->post_status,
'date' => $post->post_date,
];
// Отправляем webhook
wpsync_send_webhook($data, 'post_updated');
}
add_action('save_post', 'wpsync_save_post_webhook');
В этой функции важно исключить автосохранение, проверить права и тип записи, чтобы не отправлять лишние запросы.
Отслеживание удаления записи
Для удаления используется хук delete_post:
function wpsync_delete_post_webhook($post_id) {
$post = get_post($post_id);
if (!$post || $post->post_type !== 'post') {
return;
}
$data = [
'ID' => $post_id,
'title' => $post->post_title,
'action' => 'delete',
];
wpsync_send_webhook($data, 'post_deleted');
}
add_action('delete_post', 'wpsync_delete_post_webhook');
Это гарантирует, что внешние сервисы будут уведомлены о удалении записи.
Реализация функции отправки webhook
Для отправки webhook удобно использовать функцию, которая принимает данные и тип события, формирует запрос и отправляет его на заранее заданный URL.
function wpsync_send_webhook($data, $event) {
$webhook_url = 'https://example.com/webhook-receiver'; // Укажите адрес обработчика
$payload = json_encode([
'event' => $event,
'data' => $data,
'timestamp' => time(),
]);
$args = [
'body' => $payload,
'headers' => [
'Content-Type' => 'application/json',
],
'method' => 'POST',
'timeout' => 5,
];
$response = wp_remote_post($webhook_url, $args);
if (is_wp_error($response)) {
error_log('WPSync webhook error: ' . $response->get_error_message());
}
}
Обратите внимание на обработку ошибок — при неудачной отправке это поможет выявить проблемы.
Практические советы по организации синхронизации с помощью webhook
Настройка webhook — только первый шаг. Для надёжной синхронизации следует учесть:
- Идентификаторы записей. Убедитесь, что на всех сайтах используются совпадающие ID или предусмотрена трансформация идентификаторов.
- Паузы и повторные попытки. В случае недоступности внешнего сервера следует реализовать повторные отправки или очередь сообщений.
- Безопасность. Ограничьте доступ к webhook URL, используйте подписи или токены для проверки источника запросов.
- Логирование. Ведение журнала событий и ошибок помогает быстро реагировать на сбои.
Использование плагинов для расширенной работы с webhook
Если хотите избежать ручного кода, рассмотрите плагины, которые упрощают работу с webhook, например:
- Clearfy Pro — оптимизирует работу сайта и поддерживает расширенные инструменты для интеграций.
- WPCommunity — для проектов с сообществом, где синхронизация пользовательского контента особенно важна.
Отслеживание изменений по условию и фильтрация событий
В реальных задачах часто нужно не просто реагировать на любое изменение, а фильтровать изменения по типу или содержанию. Например, отправлять webhook только при публикации поста или изменении определённого поля.
Для этого можно использовать хук transition_post_status:
function wpsync_transition_post_status_webhook($new_status, $old_status, $post) {
if ($post->post_type !== 'post') {
return;
}
// Отправляем webhook только при публикации
if ($old_status !== 'publish' && $new_status === 'publish') {
$data = [
'ID' => $post->ID,
'title' => $post->post_title,
'status' => $new_status,
];
wpsync_send_webhook($data, 'post_published');
}
}
add_action('transition_post_status', 'wpsync_transition_post_status_webhook', 10, 3);
Так вы сможете снизить нагрузку и отправлять уведомления только по важным событиям.
Выводы и рекомендации по интеграции webhook в проекты WordPress
Использование хуков вместе с webhook — мощный инструмент для синхронизации и интеграции WordPress с внешними системами. Не забывайте тщательно тестировать обработчики, использовать проверку прав и исключать автосохранения, чтобы избежать лишних вызовов. Логируйте ошибки и учитывайте особенности инфраструктуры для надёжной работы.
Если у вас проект с большим количеством сайтов, рассмотрите возможность создания собственного плагина для централизованного управления webhook, где можно будет настраивать URL и типы событий через админку.