Диагностика задачи: зачем и когда автоматизировать удаление записей
В ряде проектов нужно регулярно очищать базу от устаревших или ненужных записей: например, удалять тестовые записи, просроченные акции, старые черновики или устаревшие пользовательские данные. Делать это вручную неудобно и рискованно, особенно на больших сайтах. WP-Cron позволяет настроить автоматический запуск таких операций по расписанию.
Настройка WP-Cron для удаления записей
1. Создаем пользовательскую функцию удаления
Необходимо написать функцию, которая будет удалять записи по заданным критериям. Например, удалим посты типа post со статусом draft, старше 30 дней:
function wp3_delete_old_drafts() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$posts_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_status = 'draft' AND post_date < %s",
$date_threshold
));
if (!empty($posts_to_delete)) {
foreach ($posts_to_delete as $post_id) {
wp_delete_post($post_id, true); // true — без помещения в корзину
}
}
}2. Регистрируем пользовательское событие в WP-Cron
Добавим событие, которое будет запускаться ежедневно:
function wp3_schedule_daily_deletion() {
if (!wp_next_scheduled('wp3_daily_delete_old_drafts')) {
wp_schedule_event(time(), 'daily', 'wp3_daily_delete_old_drafts');
}
}
add_action('wp', 'wp3_schedule_daily_deletion');
add_action('wp3_daily_delete_old_drafts', 'wp3_delete_old_drafts');3. Как отменить задачу при необходимости
Если нужно отключить автоматическое удаление, используйте:
function wp3_clear_scheduled_deletion() {
$timestamp = wp_next_scheduled('wp3_daily_delete_old_drafts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp3_daily_delete_old_drafts');
}
}Проверка результата после внедрения
Для проверки:
- Просмотрите базу данных в таблице
wp_postsна наличие старых черновиков до и после запуска скрипта. - Запустите событие вручную через WP-CLI командой
wp cron event run wp3_daily_delete_old_drafts(при наличии доступа к консоли). - Добавьте логирование в функцию удаления, например, через
error_log(), чтобы видеть, когда именно удаление происходит и какие записи удаляются.
Частые ошибки при использовании WP-Cron для удаления записей
- Не запускается расписание: WP-Cron зависит от посещений сайта. Если трафика мало — задачи не выполняются вовремя. Для таких случаев лучше настроить системный cron на сервере.
- Удаляются не те записи: Неправильный SQL-запрос или параметры функции
wp_delete_post(). Всегда тестируйте выборку через отдельный запрос к базе. - Задача дублируется: Неснятые предыдущие расписания создают множественные запуски. Используйте
wp_next_scheduled()перед созданием нового события. - Потеря данных: Используйте второй параметр
wp_delete_post()с осторожностью.falseпоместит запись в корзину,trueудалит навсегда.
Практические советы по безопасности и производительности
- Используйте транзакции и бэкапы: Перед массовым удалением сделайте бэкап базы или используйте транзакции (если поддерживается).
- Оптимизируйте запрос: Убедитесь, что в таблице
wp_postsесть индекс поpost_statusиpost_dateдля ускорения выборки. - Тестируйте на стейджинге: Проверяйте логику удаления на тестовом сайте, чтобы избежать потери нужных данных.
- Логирование: Добавляйте журнал удаления в файл или в таблицу, чтобы отслеживать активность и ошибки.
Сравнение подходов: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php или плагине | Полный контроль, гибкость, нет лишних плагинов | Требует навыков разработки, риски ошибки в логике |
| Плагин для очистки (например, WP-Sweep) | Простота настройки, готовые функции | Может удалять лишнее, меньше контроля, нагрузка |