wppartner.ru wordpress WP Partner

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

Проблема: накопление неактивных и отказанных заказов в WooCommerce

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

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

Чтобы проверить, есть ли в вашем магазине такие заказы, выполните следующий SQL-запрос в базе данных через phpMyAdmin или WP CLI:

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

Здесь статусы:

  • wc-failed — отказанный платеж;
  • wc-pending — ожидающий оплаты;
  • wc-cancelled — отмененный заказ.

Если таких заказов слишком много, стоит настроить автоматическое удаление.

Пошаговое решение: автоматическое удаление заказов по расписанию с помощью WP-Cron

1. Создаем функцию удаления заказов

Добавьте в файл functions.php вашей темы или в файл кастомного плагина следующий код:

function wppartner_delete_old_orders() {
    global $wpdb;
    $statuses = array('wc-failed', 'wc-pending', 'wc-cancelled');
    $days_old = 30; // удалять заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    foreach ($statuses as $status) {
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status, $date_threshold
        ));

        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // безвозвратно удаляем заказ
        }
    }
}

2. Регистрируем событие WP-Cron

Добавьте регистрацию крон-задачи, если она еще не создана:

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

add_action('wppartner_daily_order_cleanup', 'wppartner_delete_old_orders');

3. Проверяем правильность работы

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

wppartner_delete_old_orders();

Или выполнить через WP-CLI:

wp eval 'wppartner_delete_old_orders();'

Проверьте, что заказы старше 30 дней с указанными статусами удалились.

Как проверить, что решение сработало

  • Запустите SQL-запрос из раздела диагностики повторно — количество заказов с указанными статусами должно уменьшиться.
  • Посмотрите в админке WooCommerce — старые неактивные заказы исчезнут.
  • Проверьте логи сервера или плагинов безопасности, чтобы убедиться, что ошибок при удалении нет.

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

1. WP-Cron не запускается автоматически

Причина: на сайте низкий трафик или отключен WP-Cron.

Решение: настройте системный CRON на сервере для вызова wp-cron.php каждые 15 минут:

wget -q -O - https://ваш_сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

2. Удаляются нужные заказы

Причина: слишком большой период (например, 365 дней) или неправильные статусы в массиве.

Решение: уточните статус и период удаления, обязательно делайте резервные копии базы перед экспериментами.

3. Скрипт занимает много времени и вызывает таймаут

Причина: слишком много заказов для удаления за один раз.

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

$order_ids = array_slice($order_ids, 0, 100);

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

  • Всегда делайте бэкап базы перед внедрением автоматического удаления.
  • Используйте wp_delete_post($order_id, true) для полного удаления, включая метаданные.
  • Не удаляйте заказы с активными статусами (wc-processing, wc-completed) — это может нарушить логику магазина.
  • Проверяйте логи сервера и ошибок WordPress, чтобы отследить возможные сбои.
  • Если база очень большая, рассмотрите удаление заказов пакетами с использованием транзакций MySQL для надежности.

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

МетодПлюсыМинусы
WP-Cron с кастомной функциейГибко, можно настроить под свои статусы и периодыЗависит от работы WP-Cron, может не срабатывать при низком трафике
Плагины очистки базы (например, WP Sweep, Advanced Database Cleaner)Простота использования, готовые интерфейсыМогут удалять лишнее, не всегда гибко по статусам WooCommerce
Скрипты на сервере (bash + WP-CLI)Независимы от WordPress, надежныТребуют доступа к серверу, сложнее в настройке для неопытных
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше