wppartner.ru wordpress WP Partner

WooCommerce: как автоматически удалять заказы со статусом «Отказанный платеж»

Диагностика проблемы: зачем удалять заказы с отказанным платежом

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

Как определить заказы для удаления: проверка статуса и времени создания

Чтобы не удалить актуальные заказы, важно устанавливать фильтр по статусу failed (или вашему пользовательскому статусу) и времени создания заказа. Например, удалять только те заказы, которые старше 7 дней.

Для проверки можно использовать SQL-запрос или WP_Query с параметрами:

$args = [
    'post_type' => 'shop_order',
    'post_status' => 'wc-failed', // или 'wc-otkazannyj-platezh' если кастомный
    'date_query' => [
        [
            'column' => 'post_date',
            'before' => '7 days ago'
        ]
    ],
    'fields' => 'ids',
    'posts_per_page' => -1
];
$orders = get_posts($args);

Пошаговое решение: автоматическое удаление заказов через WP-CRON

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

function wppartner_delete_failed_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-failed', // замените, если у вас другой статус
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '7 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];
    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — удаление без корзины
        }
    }
}

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

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

add_action('wppartner_cron_delete_failed_orders', 'wppartner_delete_failed_orders');

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

function wppartner_deactivate_cleanup() {
    wp_clear_scheduled_hook('wppartner_cron_delete_failed_orders');
}
register_deactivation_hook(__FILE__, 'wppartner_deactivate_cleanup');

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

  • В админке WooCommerce перейти в заказы и убедиться, что старые заказы со статусом failed отсутствуют.
  • Для теста можно вручную создать заказ со статусом failed с датой более 7 дней назад (через базу или программно) и запустить функцию вручную:
wppartner_delete_failed_orders();
  • Проверить, что заказ удалился.
  • Логи сервера или отладчик помогут отследить выполнение WP-Cron.

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

  • Неправильный статус заказа: WooCommerce использует префикс wc- для статусов. Обязательно указывайте статус как wc-failed, а не просто failed.
  • WP-Cron не запускается: На некоторых серверах WP-Cron работает только при посещении сайта. Для теста вызовите функцию вручную или настройте системный cron для wp-cron.php.
  • Заказы не удаляются: Проверьте права пользователя, от имени которого выполняется код, и наличие функции wp_delete_post с параметром true для окончательного удаления.
  • Удаление нужных заказов: Будьте аккуратны с датой и статусом, чтобы не удалить активные заказы.

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

  • Запускайте удаление заказов не чаще раза в день, чтобы не нагружать базу.
  • Добавьте логирование в функцию для отслеживания удаленных заказов:
function wppartner_delete_failed_orders() {
    $args = [ /* как выше */ ];
    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
            error_log('Удален заказ ID: ' . $order_id);
        }
    }
}
  • Используйте объектные методы WooCommerce wc_get_order($order_id) если нужно расширить логику.
  • Для больших магазинов с тысячами заказов используйте пакетное удаление по 50-100 заказов, чтобы избежать таймаута.

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

МетодПреимуществаНедостатки
WP-Cron + код в functions.phpПростой запуск, не требует плагиновЗависит от посещений, может не сработать вовремя
Системный cron + WP-CLI скриптНадежно и быстро, подходит для больших магазиновТребует доступа к серверу и знаний командной строки
Плагины для очистки заказов (например, Advanced Database Cleaner)Интерфейс, дополнительные функции очисткиМожет быть избыточным, уменьшает контроль
×

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

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

пишет статьи

готовит SEO

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

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