В процессе ведения сайта на WordPress часто накапливается большое количество черновиков записей, которые остались незавершёнными или забытыми. Такие записи занимают место в базе данных, могут замедлять работу административной панели и создавать бардак в списке записей. В этой статье мы подробно разберём, как автоматизировать удаление черновиков старше определённого срока, используя собственный плагин или небольшой сниппет кода, а также рассмотрим полезные плагины для этой задачи.
Почему важно удалять старые черновики WordPress
Черновики — это записи, которые вы начали создавать, но не опубликовали. Со временем на сайте может накопиться сотни и даже тысячи таких записей:
- Увеличивается размер базы данных, что влияет на скорость резервного копирования и работу сайта.
- Административная панель становится менее удобной — сложно ориентироваться в списке записей.
- Если используется плагин для экспорта или анализа контента, черновики могут мешать.
Удаление старых черновиков помогает поддерживать порядок и улучшает производительность.
Автоматизация удаления: как это сделать через код
Для автоматического удаления черновиков, старше, например, 30 дней, можно написать функцию, которая будет запускаться по расписанию с помощью WP-Cron.
Создание функции удаления старых черновиков
Вот пример функции, которую мы назовём wpinc_delete_old_drafts. Она удалит все черновики, созданные более 30 дней назад:
function wpinc_delete_old_drafts() {
global $wpdb;
$days = 30; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID черновиков старше $days дней
$draft_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_type = 'post' AND post_date < %s",
$date_threshold
));
if (!empty($draft_ids)) {
foreach ($draft_ids as $id) {
wp_delete_post($id, true); // true - удалять без возможности восстановления
}
}
}
Запуск функции с помощью WP-Cron
Чтобы функция выполнялась автоматически, добавим задание в расписание WordPress. Для этого добавим планировщик и событие:
function wpinc_schedule_delete_old_drafts() {
if (!wp_next_scheduled('wpinc_daily_delete_old_drafts')) {
wp_schedule_event(time(), 'daily', 'wpinc_daily_delete_old_drafts');
}
}
add_action('wp', 'wpinc_schedule_delete_old_drafts');
add_action('wpinc_daily_delete_old_drafts', 'wpinc_delete_old_drafts');
Этот код добавит ежедневное задание, которое будет запускать удаление старых черновиков.
Удаление задания при деактивации плагина
Если код будет в плагине, важно очистить планировщик при деактивации:
function wpinc_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wpinc_daily_delete_old_drafts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpinc_daily_delete_old_drafts');
}
}
register_deactivation_hook(__FILE__, 'wpinc_deactivate_cleanup');
Использование готовых плагинов для удаления старых черновиков
Если вы не хотите писать код, можно использовать готовые плагины. Вот несколько, которые помогут:
- WP Bulk Delete — позволяет массово удалять записи по разным параметрам, включая статус и дату создания. Удобный интерфейс для настройки.
- Advanced Database Cleaner — не только удаляет старые черновики, но и оптимизирует базу данных, удаляет ревизии, спам и прочее.
- Clearfy — популярный плагин для оптимизации WordPress с функцией удаления ненужных данных, в том числе старых черновиков. Подробнее на wpshop.ru.
Как настроить удаление черновиков для кастомных типов записей
Если на вашем сайте есть кастомные типы записей, например, product или event, и вы хотите удалять старые черновики и там, нужно немного изменить запрос:
function wpinc_delete_old_drafts_custom_post_types() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$post_types = array('post', 'product', 'event'); // укажите нужные типы
$placeholders = implode(',', array_fill(0, count($post_types), '%s'));
$query = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_type IN ($placeholders) AND post_date < %s",
...array_merge($post_types, array($date_threshold))
);
$draft_ids = $wpdb->get_col($query);
if (!empty($draft_ids)) {
foreach ($draft_ids as $id) {
wp_delete_post($id, true);
}
}
}
Это расширит удаление и на другие типы записей.
Как визуально контролировать удаление черновиков
Если хочется видеть результаты, можно добавить логирование или уведомления по email:
function wpinc_delete_old_drafts_with_log() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$draft_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_type = 'post' AND post_date < %s",
$date_threshold
));
if (!empty($draft_ids)) {
foreach ($draft_ids as $id) {
wp_delete_post($id, true);
}
// Отправляем уведомление
wp_mail(
get_option('admin_email'),
'Удаление старых черновиков WPINC',
count($draft_ids) . ' черновиков удалено.'
);
}
}
Так вы будете получать отчёт о проделанной работе.
Резюме и рекомендации
Автоматизация удаления старых черновиков — простой способ поддерживать чистоту и оптимизировать работу WordPress. Используйте предложенный код для создания собственного плагина или добавьте в functions.php темы. Если предпочитаете готовые решения, обратите внимание на плагины Clearfy и WP Bulk Delete.
Также регулярно проверяйте базу данных и удаляйте ненужные записи, чтобы сайт работал быстро и без сбоев.