WP-1

Удаление незаконченных заказов WooCommerce по дате и статусу с помощью кода

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

Незаконченные (или отложенные) заказы в WooCommerce накапливаются, занимая ресурсы базы данных и замедляя работу сайта. Такие заказы создаются, когда клиент начал оформление, но не завершил покупку. Регулярное удаление этих записей помогает поддерживать производительность и упрощает администрирование.
В WooCommerce статус незаконченного заказа обычно pending или failed.

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

Для начала убедитесь, что на вашем сайте есть такие заказы. В админ-панели WooCommerce зайдите в раздел Заказы и отфильтруйте по статусу В ожидании оплаты (pending) и Ошибка оплаты (failed). Если их количество заметно растет, пора автоматизировать очистку.

Также можно проверить количество таких заказов через SQL-запрос:

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

Пошаговое решение: удаление незаконченных заказов по дате и статусу через код

Решение — создать кастомную функцию, которая будет удалять заказы старше определённой даты с нужным статусом. Для автоматизации можно подключить ее к WP-Cron.

1. Функция удаления заказов

function wp1_delete_old_pending_orders( $days = 7 ) {
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);
    if (empty($query->posts)) {
        return 0;
    }

    foreach ($query->posts as $order_id) {
        wp_delete_post($order_id, true);
    }

    return count($query->posts);
}

2. Добавление задачи в WP-Cron для автоматизации

Создадим задачу, которая будет запускаться ежедневно:

// Регистрируем событие при активации темы или плагина
function wp1_schedule_order_cleanup() {
    if (!wp_next_scheduled('wp1_daily_order_cleanup_hook')) {
        wp_schedule_event(time(), 'daily', 'wp1_daily_order_cleanup_hook');
    }
}
add_action('wp', 'wp1_schedule_order_cleanup');

// Обработчик события
add_action('wp1_daily_order_cleanup_hook', function() {
    $deleted = wp1_delete_old_pending_orders(7); // удаляем заказы старше 7 дней
    if ($deleted) {
        error_log("Удалено $deleted незаконченных заказов WooCommerce.");
    }
});

// Очистка cron при деактивации (например, при деактивации плагина)
function wp1_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wp1_daily_order_cleanup_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp1_daily_order_cleanup_hook');
    }
}

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

  • Выполните функцию вручную, вызвав wp1_delete_old_pending_orders(7) через консоль WP-CLI или временно подключив вызов в functions.php, чтобы проверить, что заказы удаляются.
  • Проверьте таблицу заказов в админке, убедитесь, что старые заказы со статусом pending и failed удалены.
  • Просмотрите логи ошибок PHP (если включено), чтобы увидеть запись о количестве удалённых заказов.

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

  • Функция ничего не удаляет: проверьте, что заказы действительно старше указанного количества дней и имеют нужный статус. Убедитесь, что префикс таблиц wp_ совпадает с вашим в базе данных.
  • WP-Cron не срабатывает: проверьте, что на сайте посещения, запускающие WP-Cron, или настройте системный cron для вызова wp-cron.php. Можно протестировать запуск события вручную через WP-CLI.
  • Удаление не полное: функция wp_delete_post($order_id, true) удаляет пост принудительно, но проверьте, что нет плагинов, блокирующих удаление заказов.
  • Ошибки прав доступа: убедитесь, что код запускается с правами администратора или в безопасном контексте.

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

  • Запускайте удаление не чаще одного раза в день, чтобы не создавать нагрузку.
  • Перед массовым удалением делайте резервную копию базы данных.
  • Добавьте проверку nonce или условий запуска, если функция вызывается из админки.
  • Для больших баз используйте пагинацию при выборке заказов, чтобы избежать превышения лимита памяти.
  • Логируйте результат работы для мониторинга и отладки.

Сравнение способов удаления незаконченных заказов

МетодПлюсыМинусы
Ручное удаление в админкеПросто, без кодаТрудозатратно, не автоматизировано
SQL-запросБыстрое массовое удалениеРиск удаления лишнего, нет логики
Код с WP-Cron (описанный)Автоматизация, гибкость, безопасное удалениеТребует настройки и тестирования
×
Прокачай свой сайт WordPress!

WordPress

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

Создай сайт своей мечты ⋙