Как использовать WP-Cron для автоматического удаления записей в WordPress

Диагностика задачи: зачем и когда автоматизировать удаление записей

В ряде проектов нужно регулярно очищать базу от устаревших или ненужных записей: например, удалять тестовые записи, просроченные акции, старые черновики или устаревшие пользовательские данные. Делать это вручную неудобно и рискованно, особенно на больших сайтах. 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)Простота настройки, готовые функцииМожет удалять лишнее, меньше контроля, нагрузка
Как избежать проблем с отображением WooCommerce после обновления темы
02.07.2026
Как использовать метод $wpdb->prepare() для безопасных запросов к базе данных WordPress
12.05.2026
Как отключить автообновление корзины в WooCommerce без потери функционала
09.06.2026
Оптимизация базы данных WordPress: практические советы и примеры кода
05.11.2025
Как использовать хук 'comment_post' для управления комментариями в WordPress
15.12.2025