Диагностика проблемы с неактивными вариантами товаров в WooCommerce
В WooCommerce на сайтах с большим ассортиментом часто накапливаются вариации товаров, которые больше не актуальны: устаревшие цвета, размеры или комплектации, которые не продаются и не нужны в каталоге. Они создают нагрузку на базу данных, ухудшают юзабилити и SEO. Ручное удаление каждой вариации занимает много времени, а стандартных функций для массового удаления по фильтрам в админке нет.
Типичная диагностика включает:
- Проверку наличия вариаций без остатков на складе.
- Поиск вариаций, которые не продаются длительное время (например, без заказов за 6 месяцев).
- Выявление вариаций с меткой «неактивный» или статусом, отличным от "publish".
Для анализа можно использовать SQL-запросы к базе данных, например, чтобы найти варианты без остатков:
SELECT posts.ID, posts.post_title, pm.meta_value as stock_qty FROM wp_posts posts JOIN wp_postmeta pm ON posts.ID = pm.post_id WHERE posts.post_type = 'product_variation' AND pm.meta_key = '_stock' AND pm.meta_value = '0';Пошаговое решение: автоматическое удаление неактивных вариантов по расписанию
1. Критерии отбора неактивных вариантов
Для автоматического удаления нужно определить четкие критерии. Например:
- Вариации с остатком на складе 0.
- Вариации, которые не продавались в последние 180 дней.
- Вариации со статусом "publish".
2. Создание WP-Cron задачи
Добавим в файл functions.php активной темы или в отдельный плагин следующий код:
if (! wp_next_scheduled('delete_inactive_variations_daily')) {
wp_schedule_event(time(), 'daily', 'delete_inactive_variations_daily');
}
add_action('delete_inactive_variations_daily', 'delete_inactive_variations');
function delete_inactive_variations() {
global $wpdb;
// Получаем вариации с нулевым остатком
$variations = $wpdb->get_results(
"SELECT p.ID FROM {$wpdb->posts} p
JOIN {$wpdb->postmeta} pm_stock ON p.ID = pm_stock.post_id AND pm_stock.meta_key = '_stock'
WHERE p.post_type = 'product_variation'
AND pm_stock.meta_value = '0'"
);
if (empty($variations)) {
return;
}
foreach ($variations as $variation) {
// Проверяем дату последней продажи
$last_order_date = get_post_meta($variation->ID, '_last_order_date', true);
if (!$last_order_date) {
// Если нет данных о продажах, считаем вариацию кандидатной на удаление
wp_delete_post($variation->ID, true);
continue;
}
$days_since_last_order = (time() - strtotime($last_order_date)) / DAY_IN_SECONDS;
if ($days_since_last_order > 180) {
wp_delete_post($variation->ID, true);
}
}
}Важно: для работы условия с датой последней продажи должен быть механизм записи даты последнего заказа вариации. Если его нет, можно упростить логику, удаляя все вариации с остатком 0.
3. Обновление даты последней продажи вариации
Добавим хук для обновления метаданных при заказе:
add_action('woocommerce_order_status_completed', 'update_variation_last_order_date');
function update_variation_last_order_date($order_id) {
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_id = $item->get_variation_id();
if ($product_id) {
update_post_meta($product_id, '_last_order_date', current_time('mysql'));
}
}
}Проверка результата после внедрения
Чтобы убедиться, что задача работает корректно:
- Запустите WP-Cron вручную через плагин WP Crontrol или временно замените расписание на раз в минуту.
- Проверьте, что вариации с нулевым остатком, у которых дата последней продажи старше 180 дней, удалились из базы (через админку или SQL-запрос).
- Просмотрите логи ошибок сервера и WordPress для выявления сбоев.
Частые ошибки и как их исправить
- Задача WP-Cron не выполняется: часто на хостинге нет реального cron, поэтому задачи не запускаются автоматически. Решение — настроить системный cron на вызов wp-cron.php или запускать вручную.
- Удаление вариаций, которые нужны: если критерии отбора слишком широкие, можно потерять нужные варианты. Обязательно тестируйте на тестовом сайте и используйте резервные копии.
- Отсутствие данных о дате последней продажи: без правильной записи этой даты скрипт не сможет корректно фильтровать варианты. Добавьте обработку в хуки заказа, как указано выше.
- Ошибка прав доступа при удалении: убедитесь, что код выполняется с правами администратора и в правильном контексте WordPress.
Практические советы по безопасности и производительности
- Выполняйте удаление партиями, если много вариаций — это снизит нагрузку. Например, ограничьте запрос 50 вариантами за раз.
- Добавьте логирование удалений в отдельный файл для аудита и восстановления.
- Перед удалением делайте резервное копирование базы данных.
- Используйте транзиенты или кэш для хранения результатов сложных запросов, чтобы не перегружать базу.
Сравнение вариантов реализации удаления неактивных вариаций
| Метод | Плюсы | Минусы | Пример кода/плагина |
|---|---|---|---|
| Ручное удаление через админку | Простота, полный контроль | Долго, неудобно при большом количестве | — |
| Использование WP-Cron и пользовательского кода | Автоматизация, гибкость | Нужны навыки программирования, риск ошибок | Код из статьи |
| Плагины для очистки WooCommerce | Готовое решение, интерфейс | Зависимость от стороннего кода, возможные конфликты | WPShop Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpbuy.ru&utm_medium=article&utm_campaign=woocommerce-udalit-neaktivnye-varianti-tovarov-po-raspisaniyu-bez-plaginov) |