В WordPress часто возникает необходимость отслеживать изменения в записях — будь то для аудита, контроля редакторов или возврата к предыдущим версиям контента. В этой статье мы рассмотрим, как можно реализовать автоматическое отслеживание изменений в записях WordPress с помощью плагинов и собственных решений на PHP.
Почему важно отслеживать изменения в записях WordPress
Отслеживание изменений помогает:
- Зафиксировать, кто и когда изменил контент;
- Восстановить предыдущие версии записи;
- Улучшить контроль качества и безопасность;
- Автоматизировать уведомления об изменениях для редакторов или администраторов.
Несмотря на встроенную систему ревизий WordPress, она не всегда удобна для анализа или уведомлений, поэтому полезны дополнительные инструменты и кастомные решения.
Использование плагинов для отслеживания изменений
Для большинства задач достаточно готовых плагинов. Вот несколько популярных вариантов:
1. WP Activity Log
Очень мощный плагин для детального аудита действий пользователей. Позволяет отслеживать изменения записей, страниц, пользователей и других элементов.
- Легко настраивается;
- Отправляет уведомления по email;
- Поддерживает фильтры и экспорт логов.
Можно загрузить с официального репозитория WordPress или с wpshop.ru.
2. Simple History
Простой и легкий плагин для просмотра истории изменений сайта прямо в админке.
- Показывает кто и когда изменял записи, страницы и настройки;
- Поддерживает расширения для кастомных типов записи;
- Бесплатный и с открытым исходным кодом.
3. Stream
Плагин для отслеживания активности пользователей и изменений контента с возможностью фильтрации и экспорта.
- Поддерживает мультисайты;
- Интеграция с внешними сервисами;
- Расширяемый через API.
Кастомное решение для отслеживания изменений с помощью хука save_post
Если нужно легкое и гибкое решение без установки плагинов, можно реализовать простое логирование изменений с помощью хука save_post.
Пример функции, которая сохраняет лог изменений в отдельную таблицу базы данных:
function wpmanual_save_post_changes($post_id, $post, $update) {
// Игнорируем автосохранения и ревизии
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return;
}
global $wpdb;
$table_name = $wpdb->prefix . 'wpmanual_post_changes';
// Получаем пользователя
$user_id = get_current_user_id();
// Логируем дату и время
$time = current_time('mysql');
// Получаем заголовок и содержимое
$title = $post->post_title;
$content = $post->post_content;
// Вставляем запись в таблицу
$wpdb->insert(
$table_name,
[
'post_id' => $post_id,
'user_id' => $user_id,
'changed_at' => $time,
'post_title' => $title,
'post_content' => $content
]
);
}
add_action('save_post', 'wpmanual_save_post_changes', 10, 3);Для работы этого кода необходимо создать таблицу wp_wpmanual_post_changes в базе данных. Пример SQL-запроса для создания:
CREATE TABLE wp_wpmanual_post_changes (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
post_id BIGINT(20) UNSIGNED NOT NULL,
user_id BIGINT(20) UNSIGNED NOT NULL,
changed_at DATETIME NOT NULL,
post_title TEXT NOT NULL,
post_content LONGTEXT NOT NULL,
PRIMARY KEY (id)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Как вывести историю изменений в админке WordPress
Чтобы быстро просмотреть изменения в админке, можно добавить свой раздел меню и страницу с таблицей изменений.
Пример добавления страницы меню и вывода последних изменений:
function wpmanual_register_changes_menu() {
add_menu_page(
'История изменений',
'История изменений',
'manage_options',
'wpmanual-changes',
'wpmanual_display_changes'
);
}
add_action('admin_menu', 'wpmanual_register_changes_menu');
function wpmanual_display_changes() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpmanual_post_changes';
$results = $wpdb->get_results("SELECT * FROM $table_name ORDER BY changed_at DESC LIMIT 50");
echo '<div class="wrap"><h1>История изменений</h1><table class="widefat fixed">';
echo '<thead><tr><th>ID поста</th><th>Пользователь</th><th>Дата</th><th>Заголовок</th></tr></thead><tbody>';
foreach ($results as $row) {
$user_info = get_userdata($row->user_id);
$user_name = $user_info ? $user_info->user_login : 'Неизвестен';
echo "<tr><td>{$row->post_id}</td><td>{$user_name}</td><td>{$row->changed_at}</td><td>" . esc_html(mb_strimwidth($row->post_title, 0, 50, '...')) . "</td></tr>";
}
echo '</tbody></table></div>';
}Дополнительные советы по отслеживанию изменений в WordPress
Ограничение количества логов
Со временем таблица с логами может сильно вырасти. Рекомендуется настроить регулярное удаление старых записей с помощью CRON-задачи, чтобы не перегружать базу данных.
Интеграция с плагином Clearfy Pro
Если вы используете Clearfy Pro, там есть возможности по управлению ревизиями и оптимизации базы данных, что поможет контролировать историю изменений и улучшить производительность сайта. Подробнее о плагине смотрите на wpshop.ru.
Отправка уведомлений об изменениях
Для информирования команды можно добавить отправку email или интеграцию с Telegram при изменении важных записей. Например, через wp_mail или сторонние сервисы уведомлений.
Пример отправки простого уведомления:
function wpmanual_notify_on_post_change($post_id, $post, $update) {
if (!$update) return; // Только обновления
$author = get_userdata($post->post_author);
$subject = 'Изменена запись: ' . $post->post_title;
$message = 'Пользователь ' . $author->user_login . ' изменил запись с ID ' . $post_id . '.';
wp_mail('admin@example.com', $subject, $message);
}
add_action('save_post', 'wpmanual_notify_on_post_change', 20, 3);Итоги
Автоматическое отслеживание изменений в записях WordPress — важная задача для большинства сайтов с несколькими авторами или для проектов с повышенными требованиями к аудиту. Использование готовых плагинов значительно упрощает работу, но если нужен полный контроль, можно реализовать кастомные решения с помощью хуков и собственной базы данных.
Не забывайте про оптимизацию и очистку логов, а также возможность отправки уведомлений для оперативного контроля.