wpload.ru wordpress WPLoad.ru

WooCommerce: как автоматически удалять заказы после возврата с помощью кода

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

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

Как определить заказы, подходящие для удаления

Для автоматизации удаления нужно чётко понимать, по какому признаку заказы считаются возвращёнными и готовы к удалению. Чаще всего это:

  • Статус заказа – например, refunded или кастомный статус, указывающий на возврат.
  • Возраст заказа – удаляем только заказы старше X дней, чтобы избежать удаления активных.

Убедитесь, что ваш магазин использует правильный статус возврата. Если стандартного нет, его нужно добавить или использовать метаполе.

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

1. Добавьте хук для запуска очистки по расписанию

Используем WP-Cron для запуска функции удаления раз в сутки:

if (! wp_next_scheduled('wpload_delete_refunded_orders_daily')) {
    wp_schedule_event(time(), 'daily', 'wpload_delete_refunded_orders_daily');
}

2. Напишите функцию удаления заказов

Функция выбирает заказы со статусом refunded старше 7 дней и удаляет их:

function wpload_delete_refunded_orders() {
    $args = [
        'status' => 'refunded',
        'date_created' => '<' . (new WC_DateTime('-7 days'))->getTimestamp(),
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление заказа
    }
}

add_action('wpload_delete_refunded_orders_daily', 'wpload_delete_refunded_orders');

3. Проверка работы WP-Cron

Убедитесь, что WP-Cron работает корректно, иначе задача не запустится:

  • Включите логирование событий WP-Cron или используйте плагин WP Crontrol для проверки запланированных задач.
  • Можно временно вызвать функцию вручную:
    wpload_delete_refunded_orders(); через консоль WP-CLI или в функции темы.

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

  • Создайте тестовый заказ, выставьте статус refunded, подождите несколько секунд или измените дату создания на более раннюю в базе.
  • Запустите вручную функцию удаления (через WP-CLI или временно вызовите функцию в коде).
  • Проверьте, что заказ удалён из админки WooCommerce и базы данных.
  • Следите за логами ошибок PHP и WP-Cron.

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

  • Заказы не удаляются: проверьте, что статус заказа совпадает с используемым в функции. Иногда статус возврата нестандартный или кастомный.
  • WP-Cron не запускается: на некоторых хостингах WP-Cron отключён. Запланируйте системный cron или вызов альтернативного механизма.
  • Удаление не полное: обязательно используйте wp_delete_post($order_id, true) для полной очистки, иначе останутся метаданные и записи.

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

  • Всегда делайте резервную копию базы перед внедрением автоматического удаления.
  • Используйте ограничение по дате и статусу, чтобы не удалять активные заказы.
  • Для больших магазинов реализуйте удаление частями (пагинация), чтобы избежать превышения памяти и таймаута.
  • Можно добавить дополнительную проверку на наличие возвратных платежей в метаданных заказа.

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

МетодПлюсыМинусыПример
Плагин для очистки заказовПросто, без кодаМогут быть платными, не всегда гибкиеWP Bulk Delete
Кастомный код с WP-CronТочная настройка, бесплатныйТребует навыков, WP-Cron может не работатьПример из статьи
Ручное удаление в админкеБезопасно, контрольТрудозатратно, не подходит для больших объёмовАдминка WooCommerce
×

AI-плагин

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

SEO и мета-теги

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

Изображения

Комментарии

Подробнее