Диагностика проблемы неактивных вариаций в WooCommerce
При управлении ассортиментом в WooCommerce часто возникает ситуация, когда в товарных вариациях остаются неактивные, устаревшие или неиспользуемые варианты. Они загромождают базу данных, замедляют работу магазина и могут вводить покупателей в заблуждение.
Определить наличие таких вариаций можно через административную панель WooCommerce, открыв товар с вариациями и проверив, какие из них помечены как "скрытые" или "неактивные". Однако ручное удаление занимает много времени, особенно при большом ассортименте.
Альтернативный способ — написать скрипт, который автоматически удалит вариации, неактивные по определённым критериям, например, не продававшиеся более месяца или с нулевым остатком длительное время.
Пошаговое решение: автоматическое удаление неактивных вариаций
1. Определяем критерии неактивности вариаций
Для примера возьмём такие условия:
- Вариация не имеет продаж за последние 30 дней.
- Вариация находится в статусе "черновик" или "отключена" (отключена через кастомное поле или мета-данные).
2. Получаем список вариаций по критериям
Используем WP_Query для выборки вариаций с типом product_variation и дополнительными условиями.
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['draft', 'private'],
'meta_query' => [
[
'key' => '_last_sale_date', // кастомное поле с датой последней продажи
'value' => date('Y-m-d', strtotime('-30 days')),
'compare' => '<=',
'type' => 'DATE',
],
],
];
$query = new WP_Query($args);Важно: поле _last_sale_date необходимо поддерживать, например, обновляя его через хук при продаже.
3. Удаляем выбранные вариации
Проходим циклом по результатам и удаляем вариации стандартной функцией wp_delete_post().
foreach ($query->posts as $variation_id) {
wp_delete_post($variation_id, true); // true — безвозвратно
}4. Настраиваем автоматический запуск через WP-Cron
Чтобы регулярно очищать неактивные вариации, создаём задачу по расписанию.
function schedule_variation_cleanup() {
if (! wp_next_scheduled('cleanup_inactive_variations_hook')) {
wp_schedule_event(time(), 'daily', 'cleanup_inactive_variations_hook');
}
}
add_action('wp', 'schedule_variation_cleanup');
add_action('cleanup_inactive_variations_hook', 'cleanup_inactive_variations_function');
function cleanup_inactive_variations_function() {
// Здесь код удаления вариаций (пункты 2-3)
}Проверка результата после внедрения
После запуска скрипта можно проверить базу данных или административную панель:
- Число вариаций должно уменьшиться.
- Отсутствие удалённых вариаций в списке вариаций товаров.
- Логи запуска (если настроены) должны содержать информацию о количестве удалённых записей.
Рекомендуется делать резервную копию базы перед запуском скрипта.
Частые ошибки и как их исправить
- Отсутствие данных о последней продаже: без мета-поля с датой последней продажи невозможно корректно фильтровать. Решение — добавить хук
woocommerce_order_status_completedдля обновления поля_last_sale_dateу вариаций. - Удаление активных вариаций: ошибочный фильтр
post_statusможет затронуть активные варианты. Проверяйте условия запроса перед удалением. - WP-Cron не запускается: если сайт не посещается регулярно, WP-Cron задачи могут не срабатывать. Для надёжности настройте системный cron на вызов
wp-cron.php.
Практические советы по безопасности и производительности
- Всегда создавайте резервные копии базы перед массовыми удалениями.
- Добавляйте в код логирование результатов для мониторинга работы скрипта.
- Используйте
wp_delete_post($id, true)для полного удаления, либоfalseдля перемещения в корзину. - В больших магазинах запускайте удаление партиями, чтобы не перегружать сервер.
- Оптимизируйте запросы, используйте индексы по мета-данным.
Сравнение методов удаления неактивных вариаций
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление через админку | Выбор и удаление вариаций вручную | Простота, контроль | Длительно, не подходит для большого каталога |
| Плагины автоматизации | Готовые решения для очистки товаров/вариаций | Удобно, настройка без кода | Могут быть платными, нагрузка на сайт |
| Код на PHP + WP-Cron | Скрипт удаляет вариации по заданным правилам автоматически | Гибкость, полная кастомизация | Требует навыков программирования |