Диагностика проблемы: зачем и когда нужны автоматические удаления вариантов товаров
В магазинах на WooCommerce с большим ассортиментом часто накапливаются неактивные варианты товаров, которые уже не продаются или устарели (например, закончились цвета или размеры, которые больше не выпускаются). Их наличие мешает управлению, замедляет работу сайта и может вводить покупателей в заблуждение. Ручное удаление вариантов — трудоемкий процесс, особенно если вариантов сотни и более.
Задача — настроить автоматическое удаление неактивных (например, с нулевым остатком или отмеченных специальным флагом) вариантов товаров по расписанию, без установки дополнительных плагинов. Это позволит поддерживать базу в актуальном состоянии и снизит нагрузку.
Как определить, какие варианты считать неактивными
Чаще всего под неактивными понимаются варианты, у которых:
- Сток равен нулю и нет возможности предзаказа;
- Активность отключена вручную (статус варианта или мета-поле);
- Определенная метка или пользовательское поле, указывающее на устаревание.
Для простоты примера будем удалять варианты с нулевым остатком и отключенным запасом под предзаказ.
Пошаговое решение: удаление неактивных вариантов с WP-Cron
1. Создаем функцию удаления неактивных вариантов
function wpb_delete_inactive_product_variations() {
$args = array(
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC',
),
array(
'key' => '_backorders',
'value' => 'no',
'compare' => '=',
),
),
'fields' => 'ids',
);
$variations = get_posts($args);
if (empty($variations)) {
return;
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // Удаляем вариант без возможности восстановления
}
}2. Регистрируем событие WP-Cron для ежедневного запуска
function wpb_register_daily_deletion_event() {
if (!wp_next_scheduled('wpb_daily_inactive_variation_deletion')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_inactive_variation_deletion');
}
}
add_action('wp', 'wpb_register_daily_deletion_event');
add_action('wpb_daily_inactive_variation_deletion', 'wpb_delete_inactive_product_variations');3. Добавляем возможность очистки cron-события при деактивации темы или плагина
function wpb_clear_scheduled_deletion() {
$timestamp = wp_next_scheduled('wpb_daily_inactive_variation_deletion');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpb_daily_inactive_variation_deletion');
}
}
register_deactivation_hook(__FILE__, 'wpb_clear_scheduled_deletion');Проверка результата после внедрения
Для проверки, что решение работает:
- Создайте вариант товара с запасом 0 и без разрешения предзаказа;
- Запустите вручную функцию
wpb_delete_inactive_product_variations()через консоль WP-CLI или временно добавьте вызов этой функции в шаблон; - Проверьте, что вариант удалился (его нет в админке, ID отсутствует);
- Дождитесь однодневной работы WP-Cron или запустите его вручную (
wp cron event run wpb_daily_inactive_variation_deletionесли есть WP-CLI); - Просмотрите логи ошибок и убедитесь, что удаление прошло без проблем.
Частые ошибки и как их исправить
- Варианты не удаляются: проверьте, что WP-Cron запущен, и событие активировано. Для локальной разработки WP-Cron может не работать без посещения сайта.
- Удаляются не те варианты: проверьте условия meta_query. Возможно, в вашем магазине используются другие поля для учета запасов или предзаказа.
- Ошибка прав доступа: убедитесь, что пользователь с правами администратора или скрипт имеет права удалять посты типа product_variation.
- Потеря данных: wp_delete_post с параметром true удаляет вариант без возможности восстановления. Сделайте резервную копию базы перед внедрением.
Практические советы по безопасности и производительности
- Функция удаления выполняет запрос с
posts_per_page = -1. Для магазинов с тысячами вариантов лучше реализовать пакетную обработку по 100–200 штук за раз, чтобы избежать таймаутов. - Запускайте WP-Cron на сервере через системный cron (например, через crontab) для надежности и предсказуемого расписания.
- Добавьте логирование удаляемых вариантов для аудита и отката при необходимости.
- Перед удалением можно отправлять уведомления администратору с перечнем удаляемых вариантов.
Сравнение подходов к автоматическому удалению неактивных вариантов
| Метод | Плюсы | Минусы |
|---|---|---|
| Собственный код с WP-Cron | Без плагинов, гибко, контролируем процесс | Требует навыков разработки, поддержка кода на вас |
| Плагины очистки WooCommerce | Простота установки, поддержка и обновления | Могут быть ресурсоёмкими, не всегда подходят под точные требования |
| Ручное удаление | Максимальный контроль | Трудозатратно и риск ошибок при большом каталоге |