wpcontrol.ru wordpress WPControl.ru

WooCommerce: автоматическое удаление отменённых и возвращённых заказов

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

Магазины на WooCommerce часто сталкиваются с проблемой чрезмерного роста количества заказов со статусами cancelled и refunded. Это приводит к раздуванию базы данных, замедлению админ-панели и усложнению управления заказами. Автоматизация удаления таких заказов помогает поддерживать базу в чистоте и улучшает производительность.

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

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

SELECT COUNT(ID) AS total_cancelled FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';
SELECT COUNT(ID) AS total_refunded FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-refunded';

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

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

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

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

function wpcontrol_delete_old_orders() {
    $days_to_keep = 30; // Количество дней для хранения заказов
    $statuses_to_delete = array('wc-cancelled', 'wc-refunded');
    
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => $status,
            'date_query'     => array(
                array(
                    'column' => 'post_date',
                    'before' => $date_threshold,
                ),
            ),
            'posts_per_page' => -1,
            'fields'         => 'ids',
        );
        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_trash_post($order_id);
            }
        }
    }
}

2. Запуск функции по расписанию с помощью WP-Cron

Добавьте в тот же файл код для регистрации и запуска планировщика задач:

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

// Хук для запуска функции
add_action('wpcontrol_delete_old_orders_event', 'wpcontrol_delete_old_orders');

// Очистка планировщика при деактивации
function wpcontrol_deactivate_cleanup() {
    wp_clear_scheduled_hook('wpcontrol_delete_old_orders_event');
}
register_deactivation_hook(__FILE__, 'wpcontrol_deactivate_cleanup');

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

1. Проверьте, что события запланированы через плагин WP Crontrol или через запрос SQL:

SELECT * FROM wp_options WHERE option_name LIKE '%cron%';

2. После выполнения задачи (или запуска вручную через WP Crontrol) убедитесь, что количество заказов со статусами wc-cancelled и wc-refunded уменьшилось.

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

  • Ошибка: Заказы не удаляются.
    Причина: Неправильные статусы или крон-события не запускаются.
    Решение: Проверьте, что статусы указаны с префиксом wc-, и активен WP-Cron (проверьте wp-config.php на наличие DISABLE_WP_CRON).
  • Ошибка: Функция удаляет заказы слишком рано.
    Причина: Неправильно установлено количество дней хранения.
    Решение: Используйте константу или настройку для изменения $days_to_keep.
  • Ошибка: Память PHP заканчивается при удалении большого количества заказов.
    Решение: Ограничьте количество заказов на один запуск, например, добавьте 'posts_per_page' => 100 и запустите функцию несколько раз.

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

  • Перед удалением заказов используйте функцию wp_trash_post(), которая отправляет заказ в корзину, а не удаляет сразу. Это позволит восстановить данные при ошибке.
  • Для окончательного удаления из корзины можно настроить отдельный скрипт, который удалит заказы, находящиеся в корзине более 7 дней.
  • Не увеличивайте частоту задачи чаще раза в сутки, чтобы не перегружать сайт.
  • Для магазинов с большой базой данных рассмотрите использование WP CLI для пакетного удаления заказов.

Сравнение вариантов решения

МетодПлюсыМинусы
Код в functions.php + WP-CronПолный контроль, без сторонних плагиновТребует навыков программирования и контроля крон задач
Плагины для очистки заказов (например, WP Bulk Delete)Простота использования, интерфейсДоп. нагрузка на сайт, ограниченный функционал под конкретные задачи
WP CLIВысокая производительность, пакетная очисткаТребует SSH доступа и командной строки
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее