Зачем нужен автоматический журнал изменений в WordPress
Ведение журнала изменений (лог изменений) — важный аспект управления контентом на сайте, особенно для новостных порталов, журналов и корпоративных сайтов. Это позволяет отслеживать, какие изменения были внесены в статьи, страницы или пользовательские типы записей, кто их внёс и когда. Такой функционал повышает прозрачность и помогает быстро находить ошибки или восстанавливать предыдущие версии.
В WordPress есть стандартная система ревизий, но она не всегда удобна для конечных пользователей и не предоставляет гибких возможностей показа истории изменений на сайте. В этой статье мы разберём, как создать автоматический журнал изменений с помощью плагинов и кастомного кода, который можно адаптировать под любые задачи.
Использование плагинов для ведения журнала изменений
Плагин Simple History
Simple History — популярный и лёгкий в использовании плагин, который ведёт журнал активности пользователей и изменений в контенте. Он отображает последние изменения в админ-панели и может хранить информацию о редактировании записей, загрузках файлов, логинах и многом другом.
Для установки:
- Перейдите в админку WordPress → Плагины → Добавить новый
- Введите в поиске «Simple History»
- Установите и активируйте плагин
После активации журнал доступен в меню Инструменты → Simple History.
Плагин WP Activity Log
WP Activity Log — более мощный инструмент для отслеживания активности пользователей и изменений. Позволяет создавать детальные отчёты, фильтровать события и отправлять уведомления. Имеет бесплатную версию и платные расширения.
Его можно использовать для создания журнала изменений с расширенной функциональностью, например, с возможностью фильтрации по типам изменений или пользователям.
Как создать простой журнал изменений с помощью кода в functions.php
Если не хочется использовать плагин, можно написать собственный код для отслеживания изменений. Ниже пример, как с помощью хуков WordPress фиксировать изменения в постах и сохранять их в отдельной таблице базы данных.
Создание таблицы для хранения изменений
Добавим функцию для создания таблицы при активации темы или плагина:
function journalx_create_changes_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_changes_log';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
post_id BIGINT(20) UNSIGNED NOT NULL,
user_id BIGINT(20) UNSIGNED NOT NULL,
old_content LONGTEXT NOT NULL,
new_content LONGTEXT NOT NULL,
changed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook( __FILE__, 'journalx_create_changes_log_table' );Эта таблица будет хранить ID поста, ID пользователя, старое и новое содержимое, а также время изменения.
Отслеживание изменений контента поста
Используем хук post_updated, который запускается при обновлении записи:
function journalx_log_post_changes( $post_ID, $post_after, $post_before ) {
if ( $post_before->post_content === $post_after->post_content ) {
return; // Если содержимое не изменилось, не логируем
}
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_changes_log';
$user_id = get_current_user_id();
$wpdb->insert(
$table_name,
array(
'post_id' => $post_ID,
'user_id' => $user_id,
'old_content' => $post_before->post_content,
'new_content' => $post_after->post_content,
'changed_at' => current_time( 'mysql' )
),
array( '%d', '%d', '%s', '%s', '%s' )
);
}
add_action( 'post_updated', 'journalx_log_post_changes', 10, 3 );Теперь при каждом изменении содержимого поста будет сохраняться запись в нашей таблице с деталями.
Отображение журнала изменений на сайте
Чтобы пользователи могли видеть историю изменений, создадим шорткод, который выводит список изменений для текущего поста.
function journalx_show_changes_log() {
if ( ! is_singular() ) {
return '';
}
global $wpdb;
$post_id = get_the_ID();
$table_name = $wpdb->prefix . 'journalx_changes_log';
$changes = $wpdb->get_results( $wpdb->prepare(
"SELECT * FROM $table_name WHERE post_id = %d ORDER BY changed_at DESC",
$post_id
) );
if ( empty( $changes ) ) {
return '<p>Журнал изменений отсутствует.</p>';
}
$output = '<div class="journalx-changes-log"><h3>Журнал изменений</h3><ul>';
foreach ( $changes as $change ) {
$user_info = get_userdata( $change->user_id );
$user_name = $user_info ? esc_html( $user_info->display_name ) : 'Неизвестный пользователь';
$changed_at = date_i18n( 'd.m.Y H:i', strtotime( $change->changed_at ) );
$output .= "<li><strong>{$changed_at}</strong> - Изменил: {$user_name}<br>";
$output .= "<details><summary>Смотреть изменения</summary>";
$output .= "<h4>Старое содержимое:</h4><div>" . wp_kses_post( wp_trim_words( $change->old_content, 30 ) ) . "</div>";
$output .= "<h4>Новое содержимое:</h4><div>" . wp_kses_post( wp_trim_words( $change->new_content, 30 ) ) . "</div>";
$output .= "</details></li>";
}
$output .= '</ul></div>';
return $output;
}
add_shortcode( 'journalx_changes_log', 'journalx_show_changes_log' );Добавьте шорткод [journalx_changes_log] в запись или страницу, чтобы отобразить журнал изменений для этой записи.
Интеграция с плагином Expert Review для улучшения журнала
Если ваш сайт использует плагин Expert Review, можно расширить функционал журнала, добавив автоматическое создание отзывов-замечаний при изменении статьи. Это позволит экспертам быстро комментировать и оценивать внесённые правки.
Для этого используйте API плагина Expert Review в хуках сохранения поста, чтобы создавать отзывы автоматически при фиксации изменений.
Советы по оптимизации и безопасности журнала изменений
При реализации собственного журнала изменений важно учитывать нагрузку на базу данных, особенно на больших сайтах с частыми изменениями. Рекомендуется:
- Ограничивать количество хранимых записей, удаляя старые через WP Cron
- Кэшировать вывод журнала для снижения количества запросов
- Обеспечить защиту данных журнала от неавторизованного доступа, например, скрывая журнал от обычных пользователей
Также внимательно проверяйте и фильтруйте выводимый контент, чтобы избежать XSS-уязвимостей.