В процессе ведения сайта на WordPress часто накапливаются черновики постов, которые долгое время остаются неиспользованными. Это может привести к загромождению базы данных и усложнению навигации по записи в админке. В этой статье разберёмся, как автоматически удалять черновики старше 30 дней с помощью PHP-кода и плагинов, а также рассмотрим, как сделать это гибко и безопасно.
Почему важно удалять старые черновики в WordPress
Черновики — это записи, которые вы начали создавать, но не опубликовали. Если их не удалять, они накапливаются, особенно на крупных сайтах с большим объёмом контента. Это приводит к нескольким проблемам:
- Увеличение размера базы данных и замедление её работы;
- Загромождение админ-панели, что усложняет поиск актуальных записей;
- Риск случайного публикации устаревшего или неактуального контента.
Регулярное удаление старых черновиков помогает поддерживать порядок и оптимизировать работу сайта.
Автоматическое удаление черновиков с помощью кода в functions.php
Самый простой и гибкий способ — добавить в тему или в собственный плагин код, который будет очищать базу от старых черновиков. Ниже пример функции, которая удаляет все черновики, созданные более 30 дней назад.
function wpabout_delete_old_drafts() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID всех черновиков, созданных раньше пороговой даты
$drafts = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_date < %s",
$date_threshold
));
if (empty($drafts)) {
return; // Черновиков для удаления нет
}
foreach ($drafts as $draft_id) {
wp_delete_post($draft_id, true); // Удаляем без возможности восстановления
}
}
// Запускаем функцию один раз в сутки с помощью WP-Cron
function wpabout_schedule_delete_old_drafts() {
if (! wp_next_scheduled('wpabout_daily_delete_old_drafts')) {
wp_schedule_event(time(), 'daily', 'wpabout_daily_delete_old_drafts');
}
}
add_action('wp', 'wpabout_schedule_delete_old_drafts');
add_action('wpabout_daily_delete_old_drafts', 'wpabout_delete_old_drafts');Этот код использует WP-Cron для ежедневного запуска очистки. Он обращается к базе напрямую, выбирает черновики старше 30 дней и удаляет их безвозвратно.
Настройка периода удаления
В переменной $days вы можете изменить число дней, например, поставить 60, если хотите удалять черновики старше двух месяцев. Это гибкое решение для разных сценариев.
Использование плагинов для удаления старых черновиков
Если вы не хотите добавлять код вручную, можно использовать готовые плагины. Вот несколько вариантов:
- WP Bulk Delete — универсальный плагин для массового удаления постов по различным условиям, включая статус и дату. Позволяет настроить удаление черновиков старше нужного срока и даже автоматизировать процесс.
- Advanced Database Cleaner — плагин для очистки базы данных от мусора, в том числе и старых черновиков. Есть возможность настроить расписание очистки.
Оба плагина доступны на официальном репозитории WordPress. Для удобства можно использовать также WPRemark с сайта WPShop, он помогает управлять комментариями, но также имеет функции очистки, если подключить дополнительные модули.
Как обезопасить процесс удаления черновиков
Автоматическое удаление — мощный инструмент, но важно соблюдать осторожность:
- Перед активацией кода или плагинов сделайте полную резервную копию базы данных.
- Проверяйте, что удаляются только записи со статусом
draft, а не опубликованные или ожидающие ревизии. - Если на сайте работает несколько редакторов, предупредите их о таком изменении, чтобы никто случайно не потерял рабочие материалы.
Также можно добавить фильтр по авторам, чтобы удалять черновики только определённых пользователей. Например, добавим параметр автора в запрос:
function wpabout_delete_old_drafts_by_author($author_id) {
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_date < %s AND post_author = %d",
$date_threshold, $author_id
));
foreach ($drafts as $draft_id) {
wp_delete_post($draft_id, true);
}
}Как проверить, что удаление работает корректно
Для тестирования функции можно временно изменить частоту запуска WP-Cron на несколько минут, чтобы быстро увидеть результат. Для этого используйте плагин WP Crontrol или аналогичный.
Также можно добавить логирование удаленных ID в файл или в системный лог:
function wpabout_delete_old_drafts_with_log() {
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_date < %s",
$date_threshold
));
if (empty($drafts)) {
return;
}
foreach ($drafts as $draft_id) {
if (wp_delete_post($draft_id, true)) {
error_log("[wpabout] Deleted draft post ID: " . $draft_id);
}
}
}Это поможет убедиться, что удаление идёт по плану и без ошибок.
Итоги: зачем и как удалять старые черновики в WordPress
В статье мы рассмотрели, почему стоит контролировать количество черновиков на сайте и как это сделать автоматически. Самый надёжный способ — добавить кастомный код, который запускается раз в день и удаляет все черновики старше 30 дней. Альтернативно можно использовать плагины с похожими функциями.
Такой подход улучшит производительность сайта и упростит управление контентом, особенно на многопользовательских ресурсах.