В WordPress с каждой редакцией записи создаются ревизии — это полезно для отката к предыдущим версиям. Однако с течением времени ревизии могут накапливаться и значительно увеличивать размер базы данных, что негативно сказывается на производительности сайта. В этой статье мы рассмотрим, как создать удобную настройку в административной панели WordPress, которая позволит автоматически удалять старые ревизии записей по заданному критерию.
Почему важно удалять старые ревизии записей
Ревизии — это ценный инструмент для восстановления контента, но их чрезмерное накопление приводит к ряду проблем:
- Рост базы данных: тысячи ревизий могут занимать значительный объем и замедлять работу запросов.
- Сложность резервного копирования: бэкапы становятся больше и дольше создаются.
- Повышенная нагрузка на сервер: при выполнении запросов к таблице wp_posts с большим числом ревизий.
Автоматическое управление ревизиями помогает избежать этих проблем без потери функциональности.
Создаем пользовательскую настройку в админке WordPress
Для начала создадим страницу настроек, где администратор сможет задать параметр — количество дней, после которых ревизии будут удаляться автоматически. Это позволит гибко управлять политикой очистки.
Регистрация страницы настроек
Добавим меню в админ-панель с помощью хука admin_menu:
add_action('admin_menu', 'wpaction_add_revision_cleanup_page');
function wpaction_add_revision_cleanup_page() {
add_options_page(
'Автоудаление ревизий',
'Автоудаление ревизий',
'manage_options',
'wpaction_revision_cleanup',
'wpaction_render_revision_cleanup_page'
);
}Вывод формы настроек
Создадим функцию для вывода формы и обработки данных:
function wpaction_render_revision_cleanup_page() {
if (!current_user_can('manage_options')) {
return;
}
if (isset($_POST['wpaction_save_revision_cleanup'])) {
check_admin_referer('wpaction_revision_cleanup_nonce');
$days = intval($_POST['wpaction_revision_days']);
update_option('wpaction_revision_cleanup_days', $days);
echo '<div class="updated">Настройки сохранены.</div>';
}
$days = get_option('wpaction_revision_cleanup_days', 30);
?>
<div class="wrap">
<h1>Настройка автоудаления ревизий</h1>
<form method="post" action="">
<?php wp_nonce_field('wpaction_revision_cleanup_nonce'); ?>
<table class="form-table">
<tr valign="top">
<th scope="row">Удалять ревизии старше, дней:</th>
<td><input type="number" name="wpaction_revision_days" value="<?php echo esc_attr($days); ?>" min="1" /></td>
</tr>
</table>
<input type="submit" name="wpaction_save_revision_cleanup" class="button button-primary" value="Сохранить" />
</form>
</div>
<?php
}Реализация функции удаления ревизий по расписанию
Для автоматического удаления создадим задачу WP-Cron, которая будет запускаться ежедневно и удалять ревизии, старше указанного количества дней.
Регистрация Cron-задачи
Добавим код для регистрации и запуска задачи:
add_action('wpaction_daily_revision_cleanup', 'wpaction_delete_old_revisions');
function wpaction_schedule_revision_cleanup() {
if (!wp_next_scheduled('wpaction_daily_revision_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpaction_daily_revision_cleanup');
}
}
add_action('wp', 'wpaction_schedule_revision_cleanup');Функция удаления ревизий
Реализуем саму логику удаления:
function wpaction_delete_old_revisions() {
global $wpdb;
$days = get_option('wpaction_revision_cleanup_days', 30);
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID ревизий старше порога
$revision_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
$date_threshold
));
if (!empty($revision_ids)) {
foreach ($revision_ids as $revision_id) {
wp_delete_post($revision_id, true); // Удаляем без возможности восстановления
}
}
}Советы по безопасности и производительности
При работе с удалением данных важно учитывать следующие моменты:
- Резервное копирование базы данных: перед активацией автоматического удаления создайте резервную копию, чтобы избежать потери важных данных.
- Отключение WP-Cron на крупных сайтах: если WP-Cron не запускается регулярно, настройте системный cron для запуска
wp-cron.php. - Проверка настроек: предоставьте администратору возможность отключить или изменить период удаления.
Использование плагинов для управления ревизиями
Если вы предпочитаете готовые решения, есть несколько популярных плагинов, которые позволяют управлять ревизиями:
- Clearfy Pro — расширенный набор инструментов оптимизации, включая управление ревизиями.
- WPRemark — плагин для автоматизации задач, который можно настроить для запуска очистки ревизий.
Заключение
Создание пользовательской настройки автоудаления старых ревизий в WordPress позволяет эффективно управлять размером базы данных и поддерживать высокую производительность сайта. Используя простой интерфейс и WP-Cron, вы автоматизируете процесс без ручного вмешательства. Это решение подойдет как новичкам, так и опытным разработчикам, которые хотят контролировать ревизии на своих проектах.