В процессе разработки и сопровождения сайтов на WordPress часто возникает необходимость отслеживать изменения в записях (постах): создание, обновление или удаление. Это особенно важно для сайтов с большим количеством авторов, мультисайтовых установок и проектов, где требуется синхронизация данных или интеграция с внешними сервисами.
Использование хуков WordPress для отслеживания изменений в записях
WordPress предоставляет мощный набор хуков (actions и filters), которые позволяют реагировать на различные события в системе. Для отслеживания изменений в постах подходят такие хуки, как save_post, wp_insert_post, delete_post.
Например, хук save_post срабатывает при создании и обновлении записи. Это позволяет определить момент, когда пост изменился, и выполнить нужные действия.
Рассмотрим пример функции для отслеживания и логирования изменений постов с префиксом wpsync_ в названии, чтобы избежать конфликтов:
function wpsync_track_post_changes($post_id, $post, $update) {
// Игнорируем автосохранения и ревизии
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return;
}
$action = $update ? 'updated' : 'created';
error_log("Post ID $post_id has been $action.");
// Здесь можно добавить дополнительную логику, например, отправку webhook
}
add_action('save_post', 'wpsync_track_post_changes', 10, 3);В этом коде при каждом сохранении поста в лог записывается информация о том, был ли пост создан или обновлен.
Отправка уведомлений через webhook при изменениях в постах
Часто необходимо не просто регистрировать изменения, но и уведомлять внешние сервисы, например, CRM, аналитические платформы или собственные серверы. Для этого удобно использовать вебхуки — HTTP-запросы, которые отправляются при наступлении события.
Для отправки webhook можно использовать стандартную функцию wp_remote_post(). Добавим в нашу функцию отправку данных о посте на внешний URL:
function wpsync_send_post_update_webhook($post_id, $post, $update) {
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return;
}
$url = 'https://example.com/webhook-url'; // Замените на ваш URL
$payload = [
'post_id' => $post_id,
'post_title' => $post->post_title,
'post_status' => $post->post_status,
'action' => $update ? 'updated' : 'created',
'post_author' => $post->post_author,
'post_date' => $post->post_date,
];
$args = [
'body' => json_encode($payload),
'headers' => [
'Content-Type' => 'application/json',
],
'timeout' => 5,
];
$response = wp_remote_post($url, $args);
if (is_wp_error($response)) {
error_log('Webhook error: ' . $response->get_error_message());
}
}
add_action('save_post', 'wpsync_send_post_update_webhook', 10, 3);Этот код отправляет JSON с базовой информацией о посте на внешний сервер при каждом создании или обновлении записи.
Обработка удаления постов
Для отслеживания удаления постов можно использовать хук before_delete_post:
function wpsync_track_post_deletion($post_id) {
error_log("Post ID $post_id will be deleted.");
// Можно добавить отправку webhook, аналогично примеру выше
}
add_action('before_delete_post', 'wpsync_track_post_deletion');Практические плагины для мониторинга изменений и интеграции webhook
Если вы не хотите писать код самостоятельно, существуют плагины, которые помогут отслеживать изменения и отправлять уведомления:
- WP Webhooks — мощный плагин для создания и обработки вебхуков в WordPress, позволяет настраивать события для постов и отправлять данные на внешние сервисы.
- Activity Log — плагин для ведения журнала активности пользователей, включая создание и редактирование постов.
- Clearfy Pro — оптимизационный плагин, который среди прочего имеет функции для контроля и управления событиями в WordPress.
Для интеграции с WP Webhooks пример настройки:
- Установите и активируйте плагин WP Webhooks.
- В настройках плагина создайте событие на создание/обновление поста.
- Укажите URL внешнего сервиса, куда нужно отправлять данные.
- Настройте формат и фильтры данных по необходимости.
Советы и рекомендации по производительности и безопасности
При использовании хуков для отправки webhook важно учитывать производительность сайта. Если внешний сервер работает медленно или недоступен, функция wp_remote_post() может замедлить сохранение поста. Чтобы избежать этого, рекомендуем:
- Использовать асинхронные запросы — например, запускать отправку webhook в фоновом режиме через WP-Cron или очередь задач.
- Добавлять обработку ошибок и логирование, чтобы отслеживать сбои.
- Ограничивать количество отправляемых данных, передавая только важную информацию.
Кроме того, обязательно проверяйте права пользователя, чтобы избежать нежелательных вызовов функций и утечек данных.
Пример асинхронной отправки webhook с использованием WP-Cron
function wpsync_schedule_webhook_send($post_id, $post, $update) {
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return;
}
$args = [
'post_id' => $post_id,
'update' => $update,
];
wp_schedule_single_event(time() + 10, 'wpsync_send_webhook_event', [$args]);
}
add_action('save_post', 'wpsync_schedule_webhook_send', 10, 3);
function wpsync_handle_webhook_event($args) {
$post = get_post($args['post_id']);
if (!$post) {
return;
}
$url = 'https://example.com/webhook-url';
$payload = [
'post_id' => $post->ID,
'post_title' => $post->post_title,
'action' => $args['update'] ? 'updated' : 'created',
];
wp_remote_post($url, [
'body' => json_encode($payload),
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 5,
]);
}
add_action('wpsync_send_webhook_event', 'wpsync_handle_webhook_event');Этот код планирует отправку webhook через 10 секунд после сохранения поста, что разгружает основной поток.