В процессе ведения сайта на WordPress часто накапливаются черновики — незавершённые или забытые записи, которые уже не нужны. Такие черновики занимают место в базе данных и могут замедлять работу сайта. В этой статье мы подробно рассмотрим, как автоматически удалять старые черновики в WordPress с помощью кода и плагинов, чтобы поддерживать базу данных в чистоте.
Почему важно удалять старые черновики WordPress
Черновики — это записи с типом post_status = 'draft'. Они не публикуются, но сохраняются в базе данных. Если вы регулярно не очищаете их, со временем количество таких записей может достигать сотен и даже тысяч, особенно на крупных сайтах с несколькими авторами. Это приводит к нескольким проблемам:
- Увеличение размера базы данных и замедление запросов;
- Загромождение административной панели и сложности с поиском нужного контента;
- Потенциальные проблемы с бэкапами и миграциями из-за лишних данных.
Решение — автоматизация удаления черновиков, которым больше определённого времени.
Как определить, какие черновики удалять
В большинстве случаев разумно удалять черновики, которые не редактировались и не обновлялись более 30-60 дней назад. Можно ориентироваться на дату последнего изменения записи — поле post_modified в базе данных.
Такой подход позволяет не потерять недавно начатые записи, которые авторы продолжают редактировать, но избавляет от старого мусора.
Дополнительные критерии для удаления
- Удалять черновики только определённых типов записей, например,
postилиpage. - Исключать из удаления черновики, созданные определёнными пользователями или с определёнными метками.
В зависимости от специфики сайта эти фильтры можно добавить в скрипт.
Автоматическое удаление черновиков с помощью кода
Добавим в файл functions.php вашей темы или в кастомный плагин следующий код. Он будет запускаться по расписанию и удалять черновики старше 30 дней:
function cyrtolat_delete_old_drafts() {
global $wpdb;
$days = 30; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$drafts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_modified < %s",
$date_threshold
));
if (!empty($drafts)) {
foreach ($drafts as $post_id) {
wp_delete_post($post_id, true); // true - удалять без возможности восстановления
}
}
}
// Регистрируем событие при активации темы/плагина
if (!wp_next_scheduled('cyrtolat_daily_delete_old_drafts')) {
wp_schedule_event(time(), 'daily', 'cyrtolat_daily_delete_old_drafts');
}
// Хук для запуска удаления
add_action('cyrtolat_daily_delete_old_drafts', 'cyrtolat_delete_old_drafts');Этот код:
- Определяет дату, старше которой черновики будут удаляться;
- Получает список ID черновиков по дате изменения;
- Удаляет их безвозвратно;
- Создаёт ежедневное событие для автоматического запуска.
Такой подход не требует установки дополнительных плагинов и работает эффективно.
Использование плагинов для удаления старых черновиков
Если вы предпочитаете решение без кода, можно использовать плагины для автоматической очистки базы данных и удаления старых черновиков.
1. WP-Optimize
Популярный плагин для оптимизации базы данных, который умеет удалять старые ревизии, спам-комментарии и черновики. В настройках можно задать удаление черновиков старше определённого времени.
Преимущества:
- Простой интерфейс;
- Дополнительные функции оптимизации;
- Регулярное обновление.
2. Advanced Database Cleaner
Инструмент для глубокой очистки базы данных, в том числе черновиков, старых ревизий и транзиентов. Позволяет планировать очистку и выбирать типы записей.
3. Clearfy Pro
Плагин из категории WPShop с расширенными возможностями оптимизации и безопасности. Включает опции для автоматического удаления старых черновиков и других мусорных данных.
Подробнее о Clearfy Pro на wpshop.ru.
Советы по безопасному удалению черновиков
Прежде чем настраивать автоматическое удаление, учтите следующие рекомендации:
- Резервное копирование базы данных — обязательно. Если удаление прошло не так, вы сможете восстановить данные.
- Внимательно выбирайте порог по времени. Если выставить слишком короткий срок, можно потерять начатые записи.
- Если на сайте много авторов, предупредите их о политике удаления черновиков.
- Тестируйте скрипт или плагин на тестовой среде перед применением на живом сайте.
Расширенное удаление с фильтрами и логированием
Для более сложных проектов можно добавить логирование удалённых постов и фильтрацию по типу записи или автору. Например, расширим предыдущий код:
function cyrtolat_delete_old_drafts_advanced() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$drafts = $wpdb->get_results($wpdb->prepare(
"SELECT ID, post_title, post_author FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_modified < %s AND post_type = 'post'",
$date_threshold
));
foreach ($drafts as $draft) {
// Например, исключаем автора с ID 1
if ($draft->post_author == 1) {
continue;
}
wp_delete_post($draft->ID, true);
error_log("[cyrtolat] Deleted draft ID: {$draft->ID}, Title: {$draft->post_title}");
}
}
add_action('cyrtolat_daily_delete_old_drafts', 'cyrtolat_delete_old_drafts_advanced');Логирование в error_log поможет контролировать процесс удаления.
Выводы
Автоматическое удаление старых черновиков — важный инструмент для поддержания чистоты и производительности сайта WordPress. Вы можете реализовать его через простой код с использованием стандартных функций WP или воспользоваться проверенными плагинами. Главное — соблюдать осторожность, делать бэкапы и тестировать все изменения.