WordPress Notes WP-1

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

Почему важно удалять незаконченные заказы WooCommerce

Незаконченные (или «висящие») заказы в WooCommerce – это заказы, которые клиенты начали, но не завершили оплату. Они занимают место в базе данных, замедляют работу сайта и могут исказить статистику продаж. Ручное удаление таких заказов неудобно и требует регулярного контроля. Автоматизация через WP-Cron решает эту проблему без дополнительного вмешательства.

Диагностика проблемы: как понять, что незаконченных заказов слишком много

Для начала проверьте количество таких заказов через SQL-запрос к базе данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Значение > 100 – повод задуматься об автоматизации очистки. Также рекомендуем проверить, нет ли влияния на производительность сервера из-за большого количества таких заказов.

Настройка автоматического удаления через WP-Cron

1. Создаем функцию удаления старых незаконченных заказов

В данном примере удаляем все заказы со статусом wc-pending, которым больше 24 часов:

function wp1_delete_old_pending_orders() {
    global $wpdb;
    $interval_hours = 24;
    $threshold = date('Y-m-d H:i:s', strtotime("-{$interval_hours} hours"));

    // Получаем ID заказов со статусом wc-pending старше 24 часов
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < %s",
        $threshold
    ));

    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление заказа
        }
    }
}

2. Регистрируем wp-cron задачу

Добавим событие, чтобы функция запускалась ежедневно:

function wp1_schedule_delete_pending_orders() {
    if (!wp_next_scheduled('wp1_daily_delete_pending_orders')) {
        wp_schedule_event(time(), 'daily', 'wp1_daily_delete_pending_orders');
    }
}
add_action('wp', 'wp1_schedule_delete_pending_orders');

add_action('wp1_daily_delete_pending_orders', 'wp1_delete_old_pending_orders');

3. Очистка при деактивации плагина/темы

Чтобы не оставлять задания в планировщике после удаления кода, добавим очистку:

function wp1_clear_scheduled_delete_pending_orders() {
    $timestamp = wp_next_scheduled('wp1_daily_delete_pending_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp1_daily_delete_pending_orders');
    }
}
register_deactivation_hook(__FILE__, 'wp1_clear_scheduled_delete_pending_orders');

Проверка результата после внедрения

  • Через phpMyAdmin или другой инструмент проверьте количество заказов со статусом wc-pending до и через 24 часа после активации.
  • Логи сервера и журнал ошибок не должны содержать сообщений об ошибках в работе WP-Cron.
  • Функция wp_delete_post удаляет заказы полностью, проверьте это на тестовой среде.

Частые ошибки и их исправление

  • WP-Cron не запускается автоматически: это часто происходит на серверах с низкой посещаемостью. Для проверки вызовите вручную wp-cron.php через браузер или настройте системный cron на сервере.
  • Удаляются не те заказы: проверьте правильность даты и статуса в запросе, убедитесь, что post_type и post_status указаны корректно.
  • Функция не удаляет заказы: проверьте права пользователя, под которым запускается PHP, и наличие ошибок в логах.

Практические советы по безопасности и производительности

  • Ограничивайте период удаления (например, 24 часа), чтобы не удалить текущие активные заказы.
  • Для больших баз данных рекомендуем разбивать удаление на партии по 50-100 заказов за раз.
  • Если на сайте много заказов, вместо WP-Cron лучше настроить системный cron на сервере для регулярного запуска wp-cron.php.
  • Перед удалением сделайте резервную копию базы данных, особенно в продакшене.

Сравнение вариантов реализации очистки незаконченных заказов

МетодПлюсыМинусыПример кода
WP-Cron + PHPПростой, не требует доступа к серверуЗависит от посещаемости сайта, возможны задержкиВ статье выше
Системный cron + WP-CLIНадежный запуск по расписанию, подходит для больших сайтовТребуется доступ к серверу, навыки работы с консолью
wp post delete $(wp post list --post_type=shop_order --post_status=wc-pending --date_query_column=post_date --before="-24 hours" --field=ID) --force
Плагины для очистки заказовГотовые решения, удобный интерфейсМогут нагружать сайт, не всегда гибкие настройкиПлагины типа "WooCommerce Order Cleanup" (проверяйте совместимость)
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙