Диагностика проблемы с неактивными купонами в WooCommerce
В WooCommerce купоны могут оставаться в активном состоянии даже если давно не используются. Это ведёт к нежелательным скидкам, снижению прибыли и путанице при аналитике. Часто возникает задача — автоматически отключать купоны, которые не применялись к заказам за определённый период.
Проверить проблему можно так:
- Зайдите в админку WooCommerce → Купоны.
- Отсортируйте купоны по дате последнего использования (если доступно) или посмотрите метаданные купона.
- Проверьте, есть ли купоны, которые не применялись к заказам более 3-6 месяцев.
Если таких купонов много — имеет смысл автоматизировать процесс их отключения.
Как автоматически отключать неактивные купоны в WooCommerce
Общая идея решения
WooCommerce не хранит напрямую дату последнего использования купона. Нужно проанализировать заказы с применёнными купонами и определить дату последнего применения для каждого купона. Затем отключить купоны, которые не использовались заданное время.
Пошаговое решение с кодом
Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:
function disable_inactive_coupons() {
if ( ! current_user_can( 'manage_woocommerce' ) ) {
return;
}
global $wpdb;
$months_inactive = 6; // Период неактивности в месяцах
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$months_inactive} months" ) );
// Получаем все активные купоны
$args = array(
'posts_per_page' => -1,
'post_type' => 'shop_coupon',
'post_status' => 'publish',
);
$coupons = get_posts( $args );
foreach ( $coupons as $coupon_post ) {
$coupon_code = $coupon_post->post_title;
// Запрос даты последнего использования купона
$last_used = $wpdb->get_var( $wpdb->prepare(
"SELECT MAX(p.post_date) FROM {$wpdb->prefix}posts p
INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_order'
AND pm.meta_key = '_used_coupons'
AND pm.meta_value LIKE %s
AND p.post_status IN ('wc-completed', 'wc-processing')",
'%' . $wpdb->esc_like( $coupon_code ) . '%'
) );
// Если купон не использовался или не использовался долго
if ( ! $last_used || $last_used < $date_threshold ) {
// Отключаем купон
wp_update_post( array(
'ID' => $coupon_post->ID,
'post_status' => 'draft',
) );
}
}
}
// Запускаем функцию раз в день через WP-Cron
if ( ! wp_next_scheduled( 'disable_inactive_coupons_hook' ) ) {
wp_schedule_event( time(), 'daily', 'disable_inactive_coupons_hook' );
}
add_action( 'disable_inactive_coupons_hook', 'disable_inactive_coupons' );Этот код проверяет все активные купоны, ищет дату их последнего применения в заказах со статусом wc-completed и wc-processing и переводит купоны в статус draft, если они не использовались более 6 месяцев. Запуск происходит автоматически раз в день.
Проверка результата после внедрения
- Зайдите в WooCommerce → Купоны и убедитесь, что купоны, не применявшиеся долгое время, имеют статус "Черновик".
- Создайте тестовый заказ с купоном, который должен остаться активным — он должен работать.
- Проверьте Cron задачи через плагин WP Crontrol, чтобы убедиться, что задача
disable_inactive_coupons_hookвыполняется.
Частые ошибки и как исправить
- Купоны не отключаются
Проверьте, выполняется ли cron задача. Если нет, запустите вручнуюdisable_inactive_coupons(). - Неправильный поиск использования купона
Купоны могут храниться в мета _used_coupons как сериализованный массив. Запрос с LIKE может не работать корректно на всех сайтах. В этом случае сделайте дополнительную проверку через PHP, перебрав заказы. - Статус купона не меняется
Убедитесь, что у пользователя, под которым работает cron, есть права на редактирование купонов.
Практические советы по безопасности и производительности
- Запускать проверку не чаще раза в сутки, чтобы избежать нагрузки.
- Используйте транзиенты для кеширования дат последнего использования, если на сайте много заказов.
- Добавьте логирование изменений статуса купонов для аудита.
- Перед массовым отключением сделайте бэкап базы данных.
Альтернативные варианты решения
| Метод | Плюсы | Минусы |
|---|---|---|
| Код на functions.php с WP-Cron | Бесплатно, гибко | Нужны знания PHP, может нагружать БД |
| Плагин автоматизации (например, Advanced Coupons) | Простота, готовый интерфейс | Платно, ограничена кастомизация |
| Ручное отключение купонов | Безопасно, полный контроль | Затратно по времени, риск ошибок |