Диагностика проблемы с неактивными вариациями в WooCommerce
В магазинах на WooCommerce часто накапливаются вариации товаров, которые больше не актуальны: например, определённые размеры или цвета, которые не продаются или не доступны. Эти вариации продолжают отображаться в админке, замусоривают базу данных и могут влиять на производительность и пользовательский опыт.
Проверить наличие неактивных вариаций можно через SQL-запрос к базе данных или используя фильтры в админке:
SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product_variation' AND post_status = 'publish';Если вариация имеет статус publish, но не продаётся (например, отсутствует на складе и не продаётся), её стоит отключить, изменив статус на private или draft.
Как автоматически отключать неактивные вариации в WooCommerce
Критерии неактивности вариации
Для автоматизации важно определить, когда вариация считается неактивной. Обычно это:
- Отсутствие на складе (
stock_quantity = 0) - Отсутствие продаж за последний период (например, 6 месяцев)
- Статус вариации —
publish(активна)
Реализация на PHP с использованием WP-Cron
Пример кода, который проверяет вариации и переводит неактивные в статус draft:
add_action('wp', 'register_deactivate_inactive_variations_cron');
function register_deactivate_inactive_variations_cron() {
if (!wp_next_scheduled('deactivate_inactive_variations_event')) {
wp_schedule_event(time(), 'daily', 'deactivate_inactive_variations_event');
}
}
add_action('deactivate_inactive_variations_event', 'deactivate_inactive_variations_function');
function deactivate_inactive_variations_function() {
$args = [
'post_type' => 'product_variation',
'post_status' => 'publish',
'numberposts' => -1
];
$variations = get_posts($args);
foreach ($variations as $variation_post) {
$variation = wc_get_product($variation_post->ID);
if (!$variation) continue;
// Проверяем наличие на складе
if ($variation->managing_stock() && $variation->get_stock_quantity() === 0) {
// Дополнительно можно добавить проверку продаж, если есть мета
wp_update_post([
'ID' => $variation_post->ID,
'post_status' => 'draft'
]);
}
}
}Этот код регистрирует ежедневное событие, которое проверяет все опубликованные вариации и переводит в черновики те, у которых запас равен нулю.
Расширение: проверка продаж за период
Чтобы учитывать продажи, можно использовать запрос к таблице заказов WooCommerce wp_woocommerce_order_items и wp_woocommerce_order_itemmeta, проверяя наличие заказов вариации за последние 6 месяцев. Это усложняет код и требует дополнительной оптимизации.
Проверка результата после внедрения
Чтобы убедиться, что автоматическое отключение работает:
- Создайте тестовую вариацию с запасом 0 и статусом
publish. - Запустите вручную функцию из кода (например, временно вызвав
deactivate_inactive_variations_function()из админки или в шаблоне). - Проверьте, что статус вариации изменился на
draft. - В админке WooCommerce -> Товары -> Вариации убедитесь, что вариация стала невидимой для покупателей.
Частые ошибки и их исправление
- Крон не запускается: Убедитесь, что на сайте есть трафик для запуска WP-Cron или настройте системный cronjob для запуска
wp-cron.php. - Вариации не меняют статус: Проверьте правильность ID вариаций и права пользователя, под которым выполняется код.
- Удаление активации происходит для нужных вариаций: Проверьте логику проверки запасов, возможно, стоит добавить дополнительные условия.
Практические советы по безопасности и производительности
- Не запускайте массовое обновление постов на каждом заходе пользователя — используйте WP-Cron или внешнее расписание.
- Кэшируйте результаты запросов, особенно если расширяете проверку продаж.
- Используйте транзиенты для ограничения частоты запуска тяжелых операций.
- Резервное копирование базы перед массовыми изменениями статусов.
Сравнение вариантов решения
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| Отключение вариаций | WooCommerce Bulk Edit | WP-Cron + PHP код | Плагин удобен, но не автоматизирует по условию; код гибче, требует поддержки |
| Проверка продаж | Плагины аналитики | SQL-запросы + PHP | Плагины дают аналитику, но не отключают; код сложнее, но можно адаптировать |