При работе с WordPress со временем в базе данных накапливаются устаревшие записи, ревизии, автосохранения и избыточные метаданные. Это негативно влияет на производительность сайта и увеличивает размер базы. В этой статье мы рассмотрим, как автоматизировать удаление таких данных по расписанию с помощью WP-Cron и кастомных функций, а также как это сделать максимально эффективно и без плагинов.
Почему важно регулярно очищать базу данных WordPress
С каждым обновлением записей и страниц WordPress создает ревизии, а также сохраняет автосохранения. Помимо этого, в базе накапливаются транзиенты, метаданные, связанные с удаленными постами, и другие данные, которые уже не нужны.
Без регулярной очистки база разрастается, что замедляет запросы, увеличивает нагрузку на сервер и может привести к ошибкам при резервном копировании или восстановлении. Особенно это критично для крупных проектов с большим количеством контента.
Удаление устаревших элементов вручную занимает время и требует знаний SQL. Автоматизация позволяет поддерживать базу в оптимальном состоянии без лишних усилий.
Основные объекты для удаления и оптимизации
- Ревизии постов — старые версии записей, которые не нужны после публикации.
- Автосохранения — временные черновики, которые уже устарели.
- Удалённые записи и метаданные — данные, связанные с удаленными постами, страницами и комментариями.
- Транзиенты — временные кэшированные данные, которые иногда остаются в базе дольше необходимого.
Все эти элементы занимают место и требуют периодической очистки.
Как создать функцию для удаления ревизий и метаданных в WordPress
Давайте напишем функцию wpall_delete_old_revisions(), которая удалит все ревизии и связанные метаданные, а также автосохранения старше 30 дней.
function wpall_delete_old_revisions() {
global $wpdb;
$days = 30; // Возраст в днях
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Удаляем ревизии старше указанного срока
$revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
$date_threshold
));
if (!empty($revisions)) {
foreach ($revisions as $revision_id) {
wp_delete_post($revision_id, true);
}
}
// Удаляем автосохранения старше срока
$autosaves = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'autosave' AND post_modified < %s",
$date_threshold
));
if (!empty($autosaves)) {
foreach ($autosaves as $autosave_id) {
wp_delete_post($autosave_id, true);
}
}
// Оптимизируем таблицу после удаления
$wpdb->query("OPTIMIZE TABLE {$wpdb->posts}");
$wpdb->query("OPTIMIZE TABLE {$wpdb->postmeta}");
}
Эта функция удалит ревизии и автосохранения старше 30 дней с полной очисткой записей и метаданных. Оптимизация таблиц поможет уменьшить фрагментацию.
Настройка автоматического запуска функции через WP-Cron
Для автоматизации добавим событие в WP-Cron, которое будет запускать функцию раз в неделю.
function wpall_schedule_revision_cleanup() {
if (!wp_next_scheduled('wpall_weekly_revision_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpall_weekly_revision_cleanup');
}
}
add_action('wp', 'wpall_schedule_revision_cleanup');
add_action('wpall_weekly_revision_cleanup', 'wpall_delete_old_revisions');
Эти хуки создадут задачу, которая будет запускать очистку каждую неделю. Если хотите изменить интервал, можно добавить кастомный расписание с помощью фильтра cron_schedules.
Удаление устаревших транзиентов
Транзиенты — это временные данные, которые иногда не удаляются автоматически. Для их очистки используйте функцию:
function wpall_delete_expired_transients() {
global $wpdb;
$time = current_time('mysql');
$transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%'");
foreach ($transients as $transient) {
$key = str_replace('_transient_', '', $transient);
if (get_transient($key) === false) {
delete_option($transient);
delete_option('_transient_timeout_' . $key);
}
}
}
Добавьте вызов этой функции в вашу задачу WP-Cron или запустите вручную для очистки базы от устаревших кэшированных данных.
Использование готовых плагинов для автоматической очистки базы
Если не хотите писать код, можно использовать плагины с похожей функциональностью:
- Clearfy Pro — мощный инструмент для оптимизации и очистки базы данных с автоматическим расписанием.
- WPRemark — содержит функции очистки базы и управления ревизиями.
Эти плагины имеют удобный интерфейс и дополнительные возможности для оптимизации сайта.
Советы по безопасной очистке базы данных
Перед автоматической очисткой всегда делайте резервные копии базы данных. Некорректное удаление может привести к потере важных данных. Тестируйте функции на локальной копии сайта.
Не удаляйте ревизии слишком часто, они могут пригодиться для восстановления контента. Обычно достаточно хранить их 30-60 дней.
Используйте wp_delete_post() с параметром true для полного удаления записи и связанных метаданных.
Как проверить работу очистки и отладить
Для отладки можно добавить логирование в функцию очистки:
function wpall_delete_old_revisions() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
error_log('WPAll: Запуск очистки ревизий и автосохранений');
$revisions = $wpdb->get_col($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s", $date_threshold));
foreach ($revisions as $revision_id) {
wp_delete_post($revision_id, true);
error_log("WPAll: Удалена ревизия ID $revision_id");
}
// Аналогично для автосохранений и оптимизации
}
Это позволит увидеть в логах, что и когда удаляется, что помогает избежать ошибок в продакшене.
Используя описанные методы, вы сможете поддерживать вашу базу WordPress в чистоте и порядке, что повысит производительность сайта и упростит дальнейшее сопровождение.