В процессе работы с WordPress часто возникает задача отслеживать изменения, которые вносятся в записи (посты). Это полезно для ведения истории правок, аудита или интеграции с внешними системами. В этой статье мы подробно разберём, как реализовать отслеживание изменений в постах WordPress с помощью хуков, а также покажем примеры кода и лучшие практики.
Почему важно отслеживать изменения в постах WordPress
Отслеживание изменений помогает контролировать, кто, когда и что изменил в контенте сайта. Это актуально для сайтов с несколькими авторами, корпоративных порталов и проектов, где важна прозрачность и история правок. Стандартный функционал ревизий WordPress хранит только содержимое и метаданные, но не позволяет удобно реагировать на изменения программно.
Реализовав свое собственное решение, можно:
- логировать изменения постов в отдельной таблице или файле,
- отправлять уведомления администраторам или авторам,
- интегрироваться с системами мониторинга и аналитики,
- восстанавливать важные данные в случае ошибок.
Основные хуки для отслеживания изменений в постах
WordPress предоставляет несколько полезных хуков, которые срабатывают при обновлении, создании и удалении постов. Вот самые важные:
save_post— вызывается при создании или обновлении поста;post_updated— вызывается после обновления поста, получает старые и новые данные;wp_insert_post— срабатывает после вставки поста в базу;before_delete_post— перед удалением поста;transition_post_status— отслеживает смену статуса поста (например, из черновика в опубликованный).
Для задачи отслеживания изменений оптимально использовать post_updated, так как он предоставляет как старые, так и новые значения.
Пример реализации функции отслеживания изменений в постах
Рассмотрим пример функции, которая при обновлении поста сравнивает старое и новое содержание, а затем логирует изменения в отдельный файл. Такой подход можно адаптировать под запись в базу или отправку уведомлений.
function wpclass_post_changes_log($post_ID, $post_after, $post_before) {
// Проверяем тип записи, чтобы отслеживать только посты
if ($post_after->post_type !== 'post') {
return;
}
$changes = [];
// Сравниваем заголовок
if ($post_after->post_title !== $post_before->post_title) {
$changes[] = 'Title changed from "' . $post_before->post_title . '" to "' . $post_after->post_title . '"';
}
// Сравниваем содержимое
if ($post_after->post_content !== $post_before->post_content) {
$changes[] = 'Content updated.';
}
// Сравниваем статус
if ($post_after->post_status !== $post_before->post_status) {
$changes[] = 'Status changed from ' . $post_before->post_status . ' to ' . $post_after->post_status;
}
if (!empty($changes)) {
$log_entry = date('Y-m-d H:i:s') . ' | Post ID: ' . $post_ID . ' | Changes: ' . implode('; ', $changes) . "\n";
// Путь к файлу лога, можно менять по необходимости
$log_file = WP_CONTENT_DIR . '/post_changes.log';
file_put_contents($log_file, $log_entry, FILE_APPEND);
}
}
add_action('post_updated', 'wpclass_post_changes_log', 10, 3);В этом коде мы используем хук post_updated, который передает ID поста, новую версию объекта и старую версию. После проверки типа поста мы сравниваем ключевые поля — заголовок, содержимое и статус. Если есть изменения, формируем строку и дописываем её в файл post_changes.log в папке wp-content.
Расширение функционала: логирование метаданных и пользовательских полей
В дополнение к основным полям можно отслеживать изменения в пользовательских полях (метаданных). Для этого потребуется получить старые и новые метаданные и сравнить их.
Пример проверки изменения пользовательского поля _wpclass_custom_field:
function wpclass_post_meta_changes_log($post_ID, $post_after, $post_before) {
$meta_key = '_wpclass_custom_field';
$old_value = get_post_meta($post_before->ID, $meta_key, true);
$new_value = get_post_meta($post_after->ID, $meta_key, true);
if ($old_value !== $new_value) {
$log_entry = date('Y-m-d H:i:s') . ' | Post ID: ' . $post_ID . " | Meta '{$meta_key}' changed from '{$old_value}' to '{$new_value}'\n";
$log_file = WP_CONTENT_DIR . '/post_meta_changes.log';
file_put_contents($log_file, $log_entry, FILE_APPEND);
}
}
add_action('post_updated', 'wpclass_post_meta_changes_log', 15, 3);Такой подход позволит отслеживать любые важные поля, которые вы добавляете к постам, например SEO-параметры или кастомные данные.
Использование плагина Clearfy Pro для управления логами и аудитом
Если не хочется писать собственный код, то можно использовать готовые решения. Плагин Clearfy Pro предлагает расширенный аудит действий пользователей, включая изменения постов, с удобной панелью управления.
Clearfy Pro позволяет:
- отслеживать детальные логи изменений,
- фильтровать события по пользователям и типам постов,
- настраивать уведомления,
- и экспортировать данные для анализа.
Это решение подойдет для тех, кто хочет быстро получить мощный функционал без глубокого программирования.
Советы по оптимизации и безопасности при логировании изменений
При реализации собственного логирования важно учесть несколько аспектов:
- Производительность: запись логов в базу или файлы должна быть оптимальной и не замедлять работу сайта. Используйте асинхронные задачи или отложенные записи, если объем большой.
- Безопасность: файлы логов не должны быть доступны напрямую из интернета. Размещайте их вне публичной директории или защитите с помощью .htaccess.
- Объем данных: контролируйте размер логов и реализуйте ротацию (удаление старых записей), чтобы не занимать слишком много места.
- Проверка прав: учитывайте, что не все изменения должны логироваться (например, для администраторов можно сделать исключения).
Заключение
Отслеживание изменений в постах WordPress — задача, которая помогает лучше контролировать контент и обеспечивать прозрачность работы сайта. Используя хуки, вы можете реализовать гибкие и эффективные механизмы логирования. Приведённые примеры кода легко адаптируются под ваши нужды, а готовые решения, такие как Clearfy Pro, ускорят внедрение в реальных проектах.
Попробуйте внедрить описанные методы на практике — и вы получите мощный инструмент контроля изменений в вашем WordPress-сайте.