Проблема: накопление неактивных купонов в WooCommerce
В интернет-магазине на WooCommerce со временем может накапливаться большое количество купонов, которые уже не используются: истек срок их действия, достигнут лимит использования или они просто неактивны. Это создает беспорядок в админке, усложняет управление и может негативно влиять на производительность базы данных при большом объеме.
Диагностика проблемы
Чтобы понять, сколько купонов неактивны, можно выполнить SQL-запрос напрямую к базе данных:
SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'shop_coupon' AND post_status != 'publish';Здесь post_status != 'publish' означает, что купон неактивен. Также неактивные купоны могут иметь статус draft, trash или другие.
Для проверки истекших купонов, можно посмотреть мета-данные expiry_date в wp_postmeta и сравнить с текущей датой.
Как автоматически удалять неактивные купоны
Шаг 1. Добавляем функцию для удаления купонов с истекшим сроком действия или неактивных
В файл functions.php вашей дочерней темы или в собственный плагин добавьте следующий код:
function wc_delete_inactive_coupons() {
$args = array(
'post_type' => 'shop_coupon',
'posts_per_page' => -1,
'post_status' => array('draft', 'trash'),
'fields' => 'ids',
);
$inactive_coupons = get_posts($args);
// Удаляем купоны со статусом draft и trash
foreach ($inactive_coupons as $coupon_id) {
wp_delete_post($coupon_id, true); // true - удаление без корзины
}
// Дополнительно удаляем купоны с истекшим сроком действия
$expired_coupons = get_posts(array(
'post_type' => 'shop_coupon',
'numberposts' => -1,
'fields' => 'ids',
'meta_query' => array(
array(
'key' => 'expiry_date',
'value' => date('Y-m-d'),
'compare' => '<',
'type' => 'DATE',
),
),
));
foreach ($expired_coupons as $coupon_id) {
wp_delete_post($coupon_id, true);
}
}
// Запускаем очистку по крону или вручную
add_action('wp_loaded', 'wc_delete_inactive_coupons');Шаг 2. Автоматизация удаления через WP-Cron
Чтобы не запускать удаление вручную при каждом запросе, настроим задачу по расписанию:
function wc_schedule_coupon_cleanup() {
if (!wp_next_scheduled('wc_coupon_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wc_coupon_cleanup_hook');
}
}
add_action('wp', 'wc_schedule_coupon_cleanup');
add_action('wc_coupon_cleanup_hook', 'wc_delete_inactive_coupons');Это будет запускать удаление неактивных и просроченных купонов один раз в день.
Проверка результата после внедрения
- В админке WooCommerce перейдите в раздел «Купоны» и проверьте количество купонов со статусом
draft,trashи просроченных. - Запустите функцию вручную (например, временно вызвав
wc_delete_inactive_coupons()через консоль или по хуку) и посмотрите, что купоны удаляются. - Проверьте логи сервера на ошибки при выполнении cron-задачи.
Частые ошибки и как их исправить
- Удаляются нужные купоны: Проверьте фильтры в
get_posts, чтобы не захватывать активные купоны. Можно добавить проверку по дате окончания и статусуpublish. - Крон-задача не запускается: Проверьте, активирован ли WP-Cron на сайте, и нет ли конфликтов с плагинами безопасности или хостингом, которые блокируют WP-Cron.
- Купоны не удаляются: Убедитесь, что у пользователя, под которым запускается скрипт, есть права на удаление постов. Также проверьте, не блокирует ли безопасность запросы на удаление.
Практические советы по безопасности и производительности
- Удаление купонов напрямую через
wp_delete_postс параметромtrueисключает помещение в корзину, что экономит место в базе. - Настройте резервное копирование базы данных перед автоматическим удалением, чтобы избежать потери данных при ошибках.
- Используйте WP-CLI для массового удаления купонов при больших объемах данных — это быстрее и менее нагружает сайт.
Сравнение подходов удаления неактивных купонов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php + WP-Cron | Автоматическое удаление через планировщик WordPress | Полный контроль, не требует плагинов | Зависит от работы WP-Cron, нагрузка при большом количестве купонов |
| Ручное удаление через админку | Удаление купонов вручную в панели управления | Простой способ, не требует кода | Трудоемко при большом количестве, риск пропустить купоны |
| Использование WP-CLI | Командная строка для массового удаления купонов | Быстро, эффективно при большом объеме | Требует доступа к серверу и навыков работы с CLI |