Диагностика проблемы с просроченными купонами в WooCommerce
В WooCommerce купоны с установленной датой окончания срока действия не удаляются автоматически, а остаются в базе. Это приводит к захламлению базы данных, ухудшению производительности и неудобству при администрировании. Особенно актуально для магазинов с большим количеством акций и временных скидок.
Чтобы убедиться, что в вашей базе есть просроченные купоны, выполните SQL-запрос в phpMyAdmin или через WP CLI:
SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'shop_coupon' AND ID IN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'expiry_date' AND meta_value < UNIX_TIMESTAMP());Если запрос возвращает записи, значит в вашей базе есть купоны с датой окончания меньше текущей.
Пошаговое решение: автоматическое удаление просроченных купонов
1. Создаем функцию удаления просроченных купонов
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
function wpdownload_remove_expired_coupons() {
$current_time = current_time( 'timestamp' );
$args = array(
'post_type' => 'shop_coupon',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'expiry_date',
'value' => $current_time,
'compare' => '<',
'type' => 'NUMERIC',
),
),
'fields' => 'ids',
);
$expired_coupons = get_posts( $args );
if ( ! empty( $expired_coupons ) ) {
foreach ( $expired_coupons as $coupon_id ) {
wp_delete_post( $coupon_id, true );
}
}
}2. Запускаем функцию по расписанию (cron)
Добавьте хук для запуска очистки ежедневно:
// Регистрируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wpdownload_daily_remove_expired_coupons' ) ) {
wp_schedule_event( time(), 'daily', 'wpdownload_daily_remove_expired_coupons' );
}
// Добавляем обработчик
add_action( 'wpdownload_daily_remove_expired_coupons', 'wpdownload_remove_expired_coupons' );
// При деактивации нужно очистить крон
function wpdownload_deactivate_cron() {
$timestamp = wp_next_scheduled( 'wpdownload_daily_remove_expired_coupons' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpdownload_daily_remove_expired_coupons' );
}
}
register_deactivation_hook( __FILE__, 'wpdownload_deactivate_cron' );Проверка результата после внедрения
Чтобы проверить, что удаление работает, можно:
- Вручную создать купон с датой окончания, например, вчерашним числом.
- Выполнить функцию
wpdownload_remove_expired_coupons()вручную, вызвав ее в админке через временный сниппет или wp-cli. - Проверить, что купон исчез из списка купонов в WooCommerce.
- После запуска по расписанию проверяйте список купонов через несколько дней — просроченные купоны должны автоматически удаляться.
Частые ошибки и их исправление
- Купоны не удаляются: проверьте, что мета-ключ
expiry_dateхранит UNIX timestamp. Иногда дата хранится в формате YYYY-MM-DD — тогда запрос и сравнение нужно адаптировать. - Крон не запускается: убедитесь, что у вас активирован WP Cron и сайт получает трафик. Можно настроить системный cron для вызова
wp-cron.php. - Удаление купонов не желательное: замените
wp_delete_post( $coupon_id, true )наwp_trash_post( $coupon_id )для перемещения в корзину, а не полного удаления.
Практические советы по безопасности и производительности
- Не запускайте удаление при каждом запросе, используйте WP Cron для оптимизации нагрузки.
- Перед удалением создайте резервную копию базы данных на случай ошибок.
- Для магазинов с огромным количеством купонов добавьте постраничную обработку, чтобы не превышать лимит памяти и времени выполнения.
Сравнение вариантов удаления просроченных купонов
| Способ | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Неэффективно при большом количестве купонов |
| Автоматический WP Cron с кодом | Полная автоматизация, гибкость | Требует навыков программирования |
| Плагины для управления купонами | Графический интерфейс, дополнительные функции | Могут замедлять сайт, не всегда бесплатны |