Обслуживание базы данных WordPress — важный аспект, который помогает поддерживать сайт быстрым и устойчивым. Со временем накапливается множество старых записей, ревизий и черновиков, которые занимают место и могут замедлять работу сайта. В этой статье разберём, как с помощью WP-Cron можно настроить автоматическое удаление устаревших записей и ревизий, что позволит сэкономить место и оптимизировать производительность.
Что такое WP-Cron и почему он важен для автоматизации задач в WordPress
WP-Cron — это встроенный механизм планировщика заданий в WordPress, который позволяет запускать определённые задачи по расписанию. В отличие от системных cron-задач на сервере, WP-Cron запускается при посещении сайта, что делает его удобным, но требует понимания особенностей.
Для автоматического удаления старых постов и ревизий нам нужно создать собственное задание, которое периодически будет вызываться и выполнять очистку базы данных.
Преимущества использования WP-Cron:
- Не требует доступа к системному cron;
- Легко интегрируется с кодом WordPress;
- Позволяет гибко настраивать периодичность запусков.
Как настроить автоматическое удаление старых записей в WordPress
Определяем критерии удаления
Для начала нужно определить, какие записи считаются устаревшими и подлежат удалению. Обычно это:
- Публикации, созданные более определённого количества дней назад (например, 180 дней);
- Ревизии, старше определённого срока;
- Черновики и записи в корзине (Trash), которые не используются.
Можно настроить логику под свои нужды, чтобы избежать случайного удаления важных данных.
Регистрация задачи WP-Cron
Добавьте в functions.php вашей темы или в кастомный плагин следующий код, который регистрирует задачу и её выполнение:
function wpall_schedule_cleanup() {
if ( ! wp_next_scheduled( 'wpall_cleanup_old_posts' ) ) {
wp_schedule_event( time(), 'daily', 'wpall_cleanup_old_posts' );
}
}
add_action( 'wp', 'wpall_schedule_cleanup' );
// Хук для выполнения задачи
add_action( 'wpall_cleanup_old_posts', 'wpall_do_cleanup_old_posts' );
function wpall_do_cleanup_old_posts() {
global $wpdb;
$days = 180; // количество дней для устаревших записей
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Удаляем посты статуса 'trash' старше $days дней
$wpdb->query( $wpdb->prepare(
"DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'trash' AND p.post_date < %s",
$date
) );
// Удаляем ревизии старше $days дней
$wpdb->query( $wpdb->prepare(
"DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_type = 'revision' AND p.post_date < %s",
$date
) );
// Удаляем черновики (draft) старше $days дней
$wpdb->query( $wpdb->prepare(
"DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'draft' AND p.post_date < %s",
$date
) );
}В этом коде:
- Регистрируется ежедневная задача
wpall_cleanup_old_posts; - В функции
wpall_do_cleanup_old_postsпроисходит удаление записей из таблицpostsи связанных с ними метаданных изpostmeta; - Используется параметр времени — удаляются данные старше 180 дней.
Автоматическое удаление ревизий с помощью плагинов
Если вы предпочитаете не писать код, существуют плагины, которые помогают управлять ревизиями и старым контентом. Например:
- WP-Optimize — мощный плагин для очистки базы данных и оптимизации.
- Advanced Database Cleaner — позволяет гибко настраивать удаление ревизий, черновиков, спама.
Эти решения просты в установке и настройке, поддерживают планирование и помогают поддерживать базу данных в чистоте.
Особенности и рекомендации по безопасности
При удалении записей важно:
- Всегда делать резервную копию базы данных перед изменениями;
- Проверять логику удаления на тестовом сайте;
- Избегать удаления свежих данных, чтобы не потерять важный контент;
- Следить за нагрузкой на сервер при выполнении WP-Cron задач;
- При необходимости использовать системный cron для более надёжного запуска задач.
Для системного cron можно добавить вызов wp-cron.php, например:
*/30 * * * * wget -q -O - https://ваш_сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Дополнительные советы: как контролировать и логировать процесс удаления
Чтобы отслеживать работу автоматической очистки, можно добавить логирование в файл. Например, расширьте функцию wpall_do_cleanup_old_posts так:
function wpall_do_cleanup_old_posts() {
global $wpdb;
$days = 180;
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$log_file = WP_CONTENT_DIR . '/wpall_cleanup.log';
$deleted_trash = $wpdb->query( $wpdb->prepare(
"DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'trash' AND p.post_date < %s",
$date
) );
$deleted_revisions = $wpdb->query( $wpdb->prepare(
"DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_type = 'revision' AND p.post_date < %s",
$date
) );
$deleted_drafts = $wpdb->query( $wpdb->prepare(
"DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'draft' AND p.post_date < %s",
$date
) );
$log = sprintf( "%s - Удалено: корзина=%d, ревизии=%d, черновики=%d\n", date('Y-m-d H:i:s'), $deleted_trash, $deleted_revisions, $deleted_drafts );
file_put_contents( $log_file, $log, FILE_APPEND );
}Так вы сможете видеть, когда и сколько записей удалялось, что помогает контролировать процесс.