Диагностика задачи: зачем и когда нужно автоматизировать удаление старого контента
Автоматическое удаление старых записей или кастомных типов записей помогает поддерживать актуальность контента, снижать нагрузку на базу данных и улучшать производительность сайта. Особенно важно для сайтов с большим объемом данных — новостных порталов, интернет-магазинов на WooCommerce, блогов с регулярным обновлением.
Перед настройкой автоматического удаления стоит ответить на вопросы:
- Какой тип записей нужно удалять (записи, страницы, кастомные типы)?
- По какому критерию — дата создания, дата обновления, статус записи?
- Нужно ли удалять записи полностью или переводить в черновики/архив?
Как работает WP-Cron и почему он подходит для удаления контента
WP-Cron — встроенный механизм планировщика задач в WordPress, который запускается при загрузке страниц. Позволяет создавать повторяющиеся задания. Для удаления старого контента удобно использовать WP-Cron, так как не нужен доступ к серверному cron, и настройка проводится полностью в рамках WordPress.
Ограничения WP-Cron
- Запускается только при посещении сайта (может срабатывать с задержками при низком трафике)
- Для критичных задач лучше использовать системный cron с вызовом wp-cron.php
Пошаговое решение: настройка автоматического удаления старых записей
1. Создаем функцию удаления записей старше определенной даты
Пример удаления записей типа post, опубликованных более 30 дней назад:
function wpreset_delete_old_posts() {
global $wpdb;
$days = 30;
$date = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
// Получаем ID записей старше $days
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish' AND post_date < %s",
'post',
$date
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удалить без возможности восстановления
}
}
}2. Регистрируем событие WP-Cron для ежедневного запуска
function wpreset_schedule_delete_old_posts() {
if (!wp_next_scheduled('wpreset_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpreset_daily_delete_old_posts');
}
}
add_action('wp', 'wpreset_schedule_delete_old_posts');
add_action('wpreset_daily_delete_old_posts', 'wpreset_delete_old_posts');3. Очистка расписания при деактивации темы или плагина
function wpreset_clear_schedule() {
$timestamp = wp_next_scheduled('wpreset_daily_delete_old_posts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpreset_daily_delete_old_posts');
}
}
register_deactivation_hook(__FILE__, 'wpreset_clear_schedule');Проверка результата после внедрения
- Проверьте наличие записей старше 30 дней в админке WordPress (Записи - Все записи).
- Принудительно вызовите функцию удаления, выполнив в функции wpreset_delete_old_posts() вызов вручную или через панель инструментов (например, через WP-CLI).
- Проверьте базу данных в таблице
wp_posts— записи, удовлетворяющие условию, должны быть удалены. - Для отладки можно добавить логирование в функцию удаления, например, через
error_log().
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически
Причина: низкий трафик сайта или отключен wp-cron.php.
Решение: настроить системный cron или добавить постоянный вызов wp-cron.php через сервер. - Удаляются не те записи или записи не удаляются
Причина: неправильный тип записи, статус или условие даты.
Решение: проверьте параметры в запросеSELECT, используйте фильтрацию поpost_statusиpost_type. - Удаление не учитывает пользовательские типы записей
Решение: измените параметрpost_typeв запросе на нужный. - Удаление не происходит из-за прав доступа
Причина: функция вызывается в контексте, где нет прав.
Решение: убедитесь, что скрипт запускается от имени администратора или cron.
Практические советы по безопасности и производительности
- Используйте пакетное удаление (например, по 50 записей за один запуск), чтобы избежать тайм-аутов PHP.
- Не удаляйте записи без резервного копирования базы данных.
- Перед удалением проверяйте зависимости: медиафайлы, кастомные поля, связанные записи.
- Для WooCommerce учитывайте, что удаление продуктов может влиять на заказы — лучше сначала переводить товары в статус "черновик".
Варианты реализации: плагин vs. код в functions.php
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Полный контроль, нет дополнительного ПО | Требует навыков, риск ошибок, нужно тестировать |
| Плагин (например, WP Crontrol) | Удобный интерфейс, управление задачами | Дополнительная нагрузка, не всегда гибкий |