Почему важно удалять старые черновики в WordPress
Со временем в базе данных WordPress накапливаются неиспользуемые черновики — незавершённые или забытые записи и страницы. Это приводит к росту объёма базы данных, замедлению работы сайта и усложнению навигации в админке. Особенно это актуально для сайтов с большим количеством авторов или редакторов, где черновики создаются постоянно.
Удаление старых черновиков помогает:
- Сократить размер базы данных
- Улучшить производительность сайта
- Облегчить работу редакторов, убрав захламление в списках записей
Рассмотрим, как автоматизировать этот процесс с помощью собственного кода и готовых решений.
Автоматическое удаление старых черновиков с помощью кастомного кода
Создание функции удаления черновиков старше 30 дней
Для автоматического удаления черновиков, которые не редактировались дольше 30 дней, можно использовать WP Cron. Ниже пример функции и её подключения к расписанию.
function wpzoom_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 $draft_id) {
wp_delete_post($draft_id, true); // Полное удаление записи
}
}
}
// Создаём событие, если его ещё нет
if (!wp_next_scheduled('wpzoom_daily_delete_old_drafts')) {
wp_schedule_event(time(), 'daily', 'wpzoom_daily_delete_old_drafts');
}
// Привязываем функцию к событию
add_action('wpzoom_daily_delete_old_drafts', 'wpzoom_delete_old_drafts');Этот код добавляет ежедневное событие, которое запускает удаление всех черновиков старше 30 дней. Обратите внимание, что wp_delete_post с параметром true удаляет запись без возможности восстановления из корзины.
Как отключить задачу и удалить планировщик
Если понадобится отключить автоматическое удаление, используйте следующий код:
function wpzoom_remove_old_drafts_cron() {
$timestamp = wp_next_scheduled('wpzoom_daily_delete_old_drafts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpzoom_daily_delete_old_drafts');
}
}
// Вызовите эту функцию один раз для удаления задачи
// wpzoom_remove_old_drafts_cron();Использование плагинов для управления черновиками и автоматической очистки
Плагин WP Sweep
WP Sweep — мощный плагин для оптимизации базы данных WordPress, позволяющий удалять устаревшие черновики и ревизии. Он предоставляет удобный интерфейс для очистки и не требует программирования.
Для автоматизации удаления старых черновиков можно настроить WP Sweep в связке с WP Crontrol для планирования задач.
Плагин Clearfy Pro
Clearfy Pro включает модуль очистки базы данных, который можно настроить на автоматическое удаление старых черновиков, ревизий и мусорных данных. Это комплексное решение, которое также улучшает безопасность и производительность.
Подробнее о Clearfy Pro и его возможностях можно узнать на официальной странице.
Рекомендации по безопасности и тестированию при автоматическом удалении
Перед внедрением автоматического удаления черновиков обязательно сделайте бэкап базы данных. Удаление происходит безвозвратно, поэтому важно иметь возможность восстановить данные.
Рекомендуется сначала запускать функцию в тестовом режиме, например, выводя список ID черновиков для удаления, а не удаляя их сразу. Это поможет избежать случайного удаления нужных записей.
Пример тестовой функции для вывода черновиков старше 30 дней:
function wpzoom_get_old_drafts() {
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_modified FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_modified < %s",
$date_threshold
));
if (!empty($drafts)) {
foreach ($drafts as $draft) {
echo 'ID: ' . $draft->ID . ', Title: ' . esc_html($draft->post_title) . ', Modified: ' . $draft->post_modified . "<br>";
}
} else {
echo 'Старых черновиков не найдено.';
}
}После проверки можно заменить вызов wpzoom_get_old_drafts() на wpzoom_delete_old_drafts() для удаления.