Диагностика задачи: зачем и когда нужно удалять заказы с определёнными купонами
В WooCommerce может возникнуть ситуация, когда требуется автоматически удалять заказы, которые были созданы с использованием конкретных купонов. Например, для очистки базы от тестовых заказов, либо в случае использования промокодов на бесплатные товары или услуги, которые не должны оставаться в заказах магазина.
Ручное удаление таких заказов неудобно, особенно при большом их количестве. Автоматизация на уровне кода позволяет экономить время и держать базу данных чистой.
Как проверить, что заказ использует нужный купон
Заказы в WooCommerce хранятся как тип записи shop_order, а применённые купоны — в метаданных заказа и связанной с ним информации.
Для получения списка купонов заказа используется метод $order->get_used_coupons(), который возвращает массив строк с кодами купонов.
Пример проверки купонов в заказе
function has_specific_coupon( $order, $target_coupon_code ) {
$used_coupons = $order->get_used_coupons();
foreach ( $used_coupons as $coupon_code ) {
if ( strtolower($coupon_code) === strtolower($target_coupon_code) ) {
return true;
}
}
return false;
}
Пошаговое решение: автоматическое удаление заказов по купону
Ниже приведён пример функции, которую можно добавить в файл functions.php вашей темы или в кастомный плагин. Она удаляет все заказы, где использовался указанный купон.
function wc_delete_orders_by_coupon( $coupon_code ) {
$args = [
'limit' => -1,
'status' => 'any',
'return' => 'ids',
];
$orders = wc_get_orders($args);
$deleted_count = 0;
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
if ( has_specific_coupon( $order, $coupon_code ) ) {
wp_trash_post( $order_id ); // Можно заменить на wp_delete_post для полного удаления
$deleted_count++;
}
}
return $deleted_count;
}
// Пример вызова
// echo 'Удалено заказов: ' . wc_delete_orders_by_coupon('TESTCOUPON');
Опция wp_trash_post помещает заказ в корзину, что безопаснее на случай ошибки. Для полного удаления используйте wp_delete_post( $order_id, true ).
Добавление автоматического запуска по расписанию
Чтобы регулярно удалять такие заказы, создадим WP-Cron задачу:
if ( ! wp_next_scheduled( 'wc_delete_orders_by_coupon_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_orders_by_coupon_cron' );
}
add_action( 'wc_delete_orders_by_coupon_cron', function() {
$deleted = wc_delete_orders_by_coupon('TESTCOUPON');
error_log('Заказы с купоном TESTCOUPON удалены: ' . $deleted);
});
Проверка результата после внедрения
- Перейдите в WooCommerce → Заказы и отфильтруйте заказы по статусам, чтобы убедиться, что заказы с нужным купоном отсутствуют.
- Для контроля можно временно включить логирование в функцию удаления (как в примере с
error_log), чтобы проверить количество удалённых заказов. - Запустите функцию вручную из консоли или через вызов в теме для тестирования.
Частые ошибки и как исправить
- Функция не удаляет заказы: проверьте, что код купона передаётся в том же регистре, либо используйте
strtolowerдля сравнения. - Удаление не происходит из-за отсутствия прав: убедитесь, что код запускается с правами администратора и что WP-Cron работает корректно.
- Заказы не удаляются полностью:
wp_trash_postкладёт заказ в корзину — для полного удаления используйтеwp_delete_post($order_id, true). - Большое количество заказов вызывает таймаут: реализуйте удаление партиями с помощью пагинации или WP-CLI.
- WP-Cron не запускается по расписанию: проверяйте состояние WP-Cron и убедитесь, что сайт получает трафик или используйте системный cron для wp-cron.php.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Для больших магазинов удаляйте заказы партиями, чтобы избежать превышения лимита памяти или времени выполнения.
- Используйте WP-CLI для массовых операций в командной строке — это быстрее и стабильнее.
- Если используете WP-Cron, контролируйте его выполнение через плагины типа WP Crontrol.
- Ограничьте права запуска такого кода только администраторам.
Сравнение вариантов удаления заказов с купонами
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Неэффективно при большом количестве заказов | Малое число заказов для удаления |
| Автоматический PHP-скрипт с WP-Cron | Автоматизация, гибкость | Потенциальные таймауты, требует контроля | Средние и большие магазины, регулярное удаление |
| WP-CLI команды | Быстро, стабильно, без нагрузок на веб | Требует доступа к серверу | Большие магазины, системные администраторы |