wppartner.ru wordpress WP Partner

WooCommerce: как автоматически отключить неактивные заказы

Диагностика проблемы с неактивными заказами в WooCommerce

Неактивные заказы — это заказы, которые были созданы, но не завершены покупателем, например, не оплачены или не подтверждены в течение длительного времени. Они занимают место в базе данных и могут замедлять работу магазина, а также мешать аналитике. Чтобы выявить такие заказы, нужно понять, какие статусы считать неактивными и за какой период их стоит удалять или отключать.

Определение неактивных заказов

В WooCommerce стандартные статусы заказов:

  • pending — ожидает оплаты;
  • failed — неудачная попытка оплаты;
  • on-hold — на удержании;
  • processing — обрабатывается;
  • completed — выполнен;
  • cancelled — отменен;
  • refunded — возвращен.

Чаще всего неактивными считаются pending и failed. Для анализа используйте SQL-запрос:

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') ORDER BY post_date ASC;

Этот запрос покажет все заказы с этими статусами и датой создания. По дате можно понять, какие заказы не обновлялись длительное время.

Пошаговое решение: автоматическое отключение неактивных заказов

1. Добавление Cron-задачи для регулярной проверки

Лучше всего использовать WP-Cron для регулярного запуска функции, отключающей неактивные заказы старше заданного срока (например, 7 дней).

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

2. Функция отключения неактивных заказов

Функция будет искать заказы со статусами pending и failed, которые старше 7 дней, и менять их статус на cancelled.

function wppartner_cleanup_inactive_orders() {
    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . ( time() - WEEK_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        $order->update_status( 'cancelled', 'Заказ автоматически отменен из-за неактивности.' );
    }
}
add_action( 'wppartner_cleanup_inactive_orders', 'wppartner_cleanup_inactive_orders' );

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

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

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

  • Зайдите в админку WooCommerce → Заказы и отфильтруйте заказы по статусам pending и failed.
  • Проверьте дату создания заказов: заказы старше 7 дней должны автоматически сменить статус на cancelled.
  • Для теста можно временно установить меньший срок (например, 1 день) и создать тестовые заказы с нужным статусом.
  • Проверьте логи активности, если включено ведение комментариев к заказам — вы увидите записи об автоматической отмене.

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

  • WP-Cron не срабатывает: Проверьте, что на сервере разрешен запуск WP-Cron, или настройте реальный системный cron для вызова wp-cron.php.
  • Заказы не меняют статус: Проверьте правильность статусов в фильтре 'status' => array('pending', 'failed'). В WooCommerce статусы должны быть без префикса wc- при использовании wc_get_orders.
  • Высокая нагрузка при большом числе заказов: Добавьте лимит на партию обрабатываемых заказов за один запуск или запускайте задачу чаще с меньшим объемом.
  • Отсутствие уведомлений клиенту: По умолчанию смена статуса на cancelled не отправляет уведомления. Если нужно уведомлять, добавьте вызов WC_Emails или используйте соответствующие хуки.

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

  • Не удаляйте заказы без необходимости, используйте смену статуса, чтобы сохранить данные для аналитики и отчетности.
  • Для больших магазинов с тысячами заказов оптимизируйте запросы, добавляя пагинацию или обрабатывая партии по 100-200 заказов.
  • Используйте транзакции и проверку ошибок при обновлении заказов, если добавляете дополнительные операции.
  • Регулярно проверяйте журнал cron-задач с помощью плагинов типа WP Crontrol.

Сравнение вариантов автоматического отключения заказов

МетодПлюсыМинусы
WP-Cron с пользовательской функциейГибко, можно кастомизировать логику и срокиЗависит от активности сайта, возможны пропуски при низком трафике
Реальный системный cron + WP-CLIНадежно, не зависит от трафикаТребует доступа к серверу и дополнительных настроек
Плагины для очистки заказовПростота настройки, готовые решенияМогут быть избыточными, ограничены функционалом

Итог

Автоматическое отключение неактивных заказов в WooCommerce — простой способ поддерживать базу данных в порядке и улучшить производительность магазина. Использование WP-Cron и стандартных функций WooCommerce позволяет реализовать это быстро и надежно, избегая лишних нагрузок и сохраняя важные данные.

×
Делай сайт лучше!!

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

Использовать скидку ⋙