В процессе активной работы с сайтом на WordPress часто накапливается большое количество черновиков. Особенно это касается крупных проектов с множеством авторов и постоянным редактированием контента. Черновики, которые долго не обновлялись, занимают место в базе данных и могут замедлять работу сайта. В этой статье мы разберем, как автоматически удалять старые черновики в WordPress, чтобы поддерживать базу данных в чистоте и оптимизировать производительность.
Почему важно удалять старые черновики в WordPress
Черновики — это записи, которые не были опубликованы и находятся в статусе draft. Они могут содержать незавершенный контент, тестовые материалы или устаревшие идеи. Если их слишком много, это:
- Увеличивает размер базы данных, что негативно сказывается на скорости запросов.
- Мешает управлению контентом, усложняя поиск нужных записей.
- Создает путаницу для редакторов и авторов.
Поэтому важно периодически очищать черновики, которые не изменялись длительное время.
Как определить старые черновики для удаления
Логично удалять те черновики, которые не редактировались, например, больше 30 или 60 дней. Это можно сделать с помощью SQL-запроса, PHP-кода или плагина, который автоматизирует этот процесс.
В таблице wp_posts статус черновика обозначается как draft, а дата последнего изменения хранится в поле post_modified.
Пример запроса для выбора черновиков старше 30 дней
SELECT ID, post_title, post_modified FROM wp_posts WHERE post_status = 'draft' AND post_modified < DATE_SUB(NOW(), INTERVAL 30 DAY);Этот запрос покажет все черновики, которые не редактировались более 30 дней.
Автоматическое удаление старых черновиков с помощью PHP-функции
Для регулярного удаления старых черновиков можно использовать функцию, которая запускается по расписанию через WP-Cron.
Ниже пример функции с префиксом cyrtolat_ для вашего сайта cyrtolat.ru:
function cyrtolat_delete_old_drafts() {
global $wpdb;
$days = 30; // количество дней для старых черновиков
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$old_drafts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = %s AND post_modified < %s",
'draft', $date_limit
));
if (!empty($old_drafts)) {
foreach ($old_drafts as $post_id) {
wp_delete_post($post_id, true); // true - без перемещения в корзину
}
}
}
// Регистрируем событие в WP-Cron, если еще не зарегистрировано
if (!wp_next_scheduled('cyrtolat_daily_draft_cleanup')) {
wp_schedule_event(time(), 'daily', 'cyrtolat_daily_draft_cleanup');
}
// Привязываем функцию к событию
add_action('cyrtolat_daily_draft_cleanup', 'cyrtolat_delete_old_drafts');Этот код удалит все черновики, которые не редактировались в течение 30 дней. Он запускается ежедневно с помощью WP-Cron. Вы можете изменить период, указав другое значение в переменной $days.
Где разместить код
Лучше всего добавить этот код в файл functions.php вашей дочерней темы или оформить в виде мини-плагина, чтобы не потерять при обновлении.
Использование плагинов для автоматического удаления черновиков
Если вы не хотите писать код самостоятельно, можно использовать готовые плагины. Например:
- WP Bulk Delete — позволяет массово удалять посты, черновики и ревизии по различным условиям, включая дату.
- Auto Delete Posts — плагин с возможностью настроить автоматическое удаление постов и черновиков по времени.
Оба плагина имеют удобный интерфейс для настройки, что удобно для пользователей без навыков программирования. Вот ссылка на WP Bulk Delete на wpshop.ru.
Советы по безопасности и резервному копированию
Перед автоматическим удалением черновиков рекомендуем:
- Настроить регулярное резервное копирование сайта и базы данных.
- Тестировать функцию на тестовом сайте или в staging-среде.
- Добавить уведомления в админку о проведенных очистках (можно расширить функцию).
Это поможет избежать случайной потери важного контента.
Расширение функционала: удаление черновиков с определенными метками
Если у вас много черновиков, и вы хотите удалять только специфичные, например, с определенной меткой (тегом), можно использовать дополнительный SQL-запрос с JOIN по таблице wp_term_relationships. Ниже пример расширенного запроса и функции:
function cyrtolat_delete_old_drafts_by_tag($tag_slug) {
global $wpdb;
$days = 30;
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->terms} t ON tt.term_id = t.term_id
WHERE p.post_status = %s
AND p.post_modified < %s
AND t.slug = %s",
'draft', $date_limit, $tag_slug
));
if (!empty($post_ids)) {
foreach ($post_ids as $post_id) {
wp_delete_post($post_id, true);
}
}
}Эту функцию можно запускать аналогично первой, передавая нужный тег для фильтрации.
Выводы
Автоматическое удаление старых черновиков — простая, но эффективная мера для оптимизации WordPress-сайта. Она снижает нагрузку на базу данных, упрощает управление контентом и помогает поддерживать порядок в админке. Выбор между собственным кодом и готовыми плагинами зависит от ваших навыков и предпочтений. Главное — не забывать регулярно проводить такие очистки.