Диагностика задачи: зачем автоматизировать купоны в WooCommerce
В интернет-магазинах на WooCommerce часто возникают задачи по временным акциям и скидкам, для которых нужно создавать купоны на ограниченный период. Если делать это вручную, можно забыть удалить устаревшие купоны, что приводит к ошибкам в учёте и потенциальным потерям. Автоматизация создания и удаления купонов по расписанию решает эти проблемы.
Как создать купон программно в WooCommerce
В WooCommerce купон — это специальный тип записи (shop_coupon). Для создания купона через код используется стандартный класс WC_Coupon. Пример создания купона с фиксированной скидкой:
function wc_create_scheduled_coupon( $code, $amount, $discount_type = 'fixed_cart', $expiry_date = '' ) {
if ( ! class_exists( 'WC_Coupon' ) ) {
return new WP_Error( 'woocommerce_not_active', 'WooCommerce не активен' );
}
// Проверяем, существует ли купон с таким кодом
if ( coupon_exists( $code ) ) {
return new WP_Error( 'coupon_exists', 'Купон с таким кодом уже существует' );
}
$coupon = new WC_Coupon();
$coupon->set_code( $code );
$coupon->set_discount_type( $discount_type ); // fixed_cart, percent, fixed_product, percent_product
$coupon->set_amount( $amount );
if ( $expiry_date ) {
$coupon->set_date_expires( new WC_DateTime( $expiry_date ) );
}
$coupon->save();
return $coupon->get_id();
}
function coupon_exists( $code ) {
$coupon = get_page_by_title( $code, OBJECT, 'shop_coupon' );
return $coupon ? true : false;
}Как удалить купон программно
Удаление купона — это удаление поста типа shop_coupon. Чтобы удалять только купоны по определённому признаку (например, с префиксом в коде), используйте следующий код:
function wc_delete_coupon_by_code( $code ) {
$coupon_post = get_page_by_title( $code, OBJECT, 'shop_coupon' );
if ( $coupon_post ) {
wp_delete_post( $coupon_post->ID, true ); // true — удаление без перемещения в корзину
return true;
}
return false;
}
function wc_delete_coupons_by_prefix( $prefix ) {
$args = [
'post_type' => 'shop_coupon',
'posts_per_page' => -1,
'title_like' => $prefix // Кастомный параметр, потребует фильтра
];
// Альтернативно получаем все купоны и фильтруем вручную
$coupons = get_posts( [ 'post_type' => 'shop_coupon', 'numberposts' => -1 ] );
foreach ( $coupons as $coupon ) {
if ( strpos( $coupon->post_title, $prefix ) === 0 ) {
wp_delete_post( $coupon->ID, true );
}
}
}Автоматизация с WP-Cron: создание и удаление купонов по расписанию
WP-Cron позволяет запускать задачи по расписанию. Для автоматизации создадим две задачи:
- Создание купона на завтра (или другое время)
- Удаление купона после окончания акции
Пример регистрации и запуска задач:
// Хук для создания купона
add_action( 'wc_create_coupon_event', 'wc_cron_create_coupon' );
function wc_cron_create_coupon() {
$code = 'promo_' . date( 'Ymd' );
$amount = 10; // скидка 10 единиц
$expiry_date = date( 'Y-m-d', strtotime( '+2 days' ) );
wc_create_scheduled_coupon( $code, $amount, 'fixed_cart', $expiry_date );
}
// Хук для удаления устаревших купонов
add_action( 'wc_delete_expired_coupons_event', 'wc_cron_delete_expired_coupons' );
function wc_cron_delete_expired_coupons() {
$coupons = get_posts( [
'post_type' => 'shop_coupon',
'numberposts' => -1,
] );
foreach ( $coupons as $coupon ) {
$expiry = get_post_meta( $coupon->ID, 'date_expires', true );
if ( $expiry && strtotime( $expiry ) < time() ) {
wp_delete_post( $coupon->ID, true );
}
}
}
// Запланировать задачи, если они не запланированы
if ( ! wp_next_scheduled( 'wc_create_coupon_event' ) ) {
wp_schedule_event( strtotime( 'tomorrow 00:01' ), 'daily', 'wc_create_coupon_event' );
}
if ( ! wp_next_scheduled( 'wc_delete_expired_coupons_event' ) ) {
wp_schedule_event( strtotime( 'tomorrow 01:00' ), 'daily', 'wc_delete_expired_coupons_event' );
}Проверка результата после внедрения
- После запуска cron-заданий проверьте в админке WooCommerce -> Купоны, появился ли новый купон с кодом
promo_YYYYMMDD. - Убедитесь, что у купона стоит дата истечения скидки.
- Через несколько дней проверьте, что устаревшие купоны автоматически удаляются.
- Для отладки используйте плагин WP Crontrol (https://ru.wordpress.org/plugins/wp-crontrol/) — он показывает запланированные задачи.
Частые ошибки и как их исправить
- Купон не создаётся из-за дублирования кода
Проверьте функциюcoupon_exists(), чтобы избежать дубликатов. - WP-Cron не запускается автоматически
WP-Cron зависит от посещений сайта. Для точных расписаний настройте системный cron на сервере или вручную запускайте задачи через WP Crontrol. - Купоны не удаляются
Проверьте, что в метаполеdate_expiresхранится корректная дата и сравнение времени работает корректно. - Удаление не тех купонов
Используйте уникальные префиксы в кодах купонов или дополнительные метаданные для точной фильтрации.
Практические советы по безопасности и производительности
- Не создавайте слишком много купонов — большие объёмы замедляют админку и поиск.
- Для массового удаления используйте WP-CLI, если доступен серверный терминал.
- Храните даты истечения купонов в формате
Y-m-dдля удобства сравнения. - Ограничьте права доступа к созданию и удалению купонов только администраторам.
- Регулярно проверяйте cron-задачи и логи ошибок, чтобы избежать сбоев в автоматизации.
Обзор вариантов реализации автоматизации купонов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагины для автоматизации купонов | Простота внедрения, интерфейс | Могут быть тяжёлыми, ограничены в кастомизации |
| Код с WP-Cron (как в статье) | Гибкость, полное управление, без лишних плагинов | Требует навыков разработки, зависит от cron WP |
| Внешний cron и WP-CLI | Надёжность, подходит для больших магазинов | Нужен доступ к серверу, сложнее в настройке |