В процессе ведения сайта на WordPress часто накапливается большое количество устаревших записей, страниц и других типов контента, которые уже неактуальны и занимают место в базе данных. Автоматизация удаления такого контента поможет поддерживать сайт в чистоте, улучшит производительность и облегчит администрирование. В этой статье мы подробно разберем, как настроить автоматическое удаление старых записей по дате публикации и другие критерии, используя как код, так и готовые решения.
Почему важно удалять старый контент автоматически
С течением времени на сайте накапливаются устаревшие материалы, которые не несут ценности для посетителей и поисковых систем. Это может привести к нескольким проблемам:
- Загромождение базы данных, что снижает скорость работы сайта.
- Рост времени резервного копирования и восстановления.
- Усложнение навигации и администрирования.
- Потеря актуальности информации на сайте.
Ручное удаление — неэффективный способ, особенно для крупных ресурсов. Автоматизация позволяет настроить регулярное удаление по заданным правилам без вашего участия.
Автоматическое удаление старых записей с помощью WP-Cron
WordPress имеет встроенную систему планировщика задач — WP-Cron, которая позволяет запускать ваши функции по расписанию.
Создание функции удаления
Напишем функцию wphost_delete_old_posts(), которая удаляет записи старше заданного количества дней. В этом примере удалим записи старше 180 дней.
function wphost_delete_old_posts() {
global $wpdb;
$days = 180; // количество дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID постов старше $days дней
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_date < %s",
$date
));
if (!empty($post_ids)) {
foreach ($post_ids as $post_id) {
wp_delete_post($post_id, true); // true — принудительное удаление без помещения в корзину
}
}
}
Регистрация задачи в WP-Cron
Добавим событие, которое будет запускать функцию ежедневно.
function wphost_schedule_old_post_deletion() {
if (!wp_next_scheduled('wphost_daily_old_post_deletion')) {
wp_schedule_event(time(), 'daily', 'wphost_daily_old_post_deletion');
}
}
add_action('wp', 'wphost_schedule_old_post_deletion');
add_action('wphost_daily_old_post_deletion', 'wphost_delete_old_posts');
Удаление задачи при деактивации плагина
Если вы добавляете данный код в плагин, не забудьте очистить расписание при деактивации:
function wphost_deactivate_plugin() {
$timestamp = wp_next_scheduled('wphost_daily_old_post_deletion');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wphost_daily_old_post_deletion');
}
}
register_deactivation_hook(__FILE__, 'wphost_deactivate_plugin');
Использование плагинов для автоматизации удаления
Если вы предпочитаете не писать код, есть несколько плагинов, которые помогут с удалением старого контента:
- Clearfy Pro — плагин для оптимизации и очистки WordPress, включая удаление старых постов и ревизий.
- Auto Delete Posts — бесплатный плагин, позволяющий настроить удаление постов по времени.
Clearfy Pro особенно удобен, если вы хотите комплексное решение для оптимизации сайта — он умеет не только удалять старый контент, но и решать множество других задач (оптимизация базы, отключение ненужных функций, ускорение).
Удаление старых записей по кастомным типам постов
Если на вашем сайте используются кастомные типы постов (например, «продукты», «кейсы» или «мероприятия»), можно модифицировать функцию для удаления именно их.
function wphost_delete_old_custom_posts($post_type = 'product', $days = 90) {
global $wpdb;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'publish' AND post_date < %s",
$post_type,
$date
));
if (!empty($post_ids)) {
foreach ($post_ids as $post_id) {
wp_delete_post($post_id, true);
}
}
}
Эту функцию можно вызвать внутри вашего планировщика задач, передавая нужный тип постов и срок хранения.
Как избежать случайного удаления и проверить перед удалением
Удаление контента — ответственная операция. Рекомендуется добавить дополнительную проверку или логи.
- Вместо прямого удаления можно сначала менять статус постов на черновики или в корзину.
- Логировать ID удаляемых записей в отдельный файл или таблицу.
- Добавить проверку на наличие важных метаданных или категорий, чтобы не удалить нужный материал.
Резервное копирование перед удалением
Прежде чем автоматизировать удаление, обязательно настройте регулярное резервное копирование сайта. Для этого вы можете использовать надежные плагины, например, WP Backup от WPGPT или аналогичные инструменты. Это позволит быстро восстановить данные в случае ошибки.
Выводы и рекомендации
Автоматизация удаления старого контента в WordPress — эффективный способ поддерживать сайт в актуальном состоянии и оптимизировать работу базы данных. Используйте WP-Cron для запуска регулярных задач или готовые плагины для упрощения задачи. Обязательно тестируйте скрипты на тестовом сайте и делайте резервные копии.