wpcontrol.ru wordpress WPControl.ru

WooCommerce: автоматическое отключение вариаций товаров при их отсутствии на складе

Проблема: вариации товаров WooCommerce остаются активными при отсутствии на складе

В интернет-магазинах на WooCommerce часто возникает ситуация, когда вариации товаров остаются доступными для выбора даже при отсутствии их на складе. Это приводит к ошибкам оформления заказа, негативному опыту пользователей и дополнительной нагрузке на службу поддержки.

Стандартные настройки WooCommerce позволяют только скрывать отсутствующие товары в каталоге глобально, но не управляют видимостью конкретных вариаций внутри товара. В результате, клиенты могут увидеть варианты, которые нельзя заказать.

Как диагностировать проблему

  • Проверьте настройки отображения отсутствующих товаров в WooCommerce (WooCommerce > Настройки > Товары > Запасы).
  • Откройте страницу товара с вариациями и посмотрите, активны ли вариации с нулевым запасом.
  • Попробуйте добавить такую вариацию в корзину — если это возможно, значит проблема действительно есть.

Пошаговое решение: автоматическое отключение вариаций без запаса

Для реализации автоматического отключения вариаций, у которых на складе ноль или меньше, достаточно добавить кастомный код в файл functions.php вашей темы или создать небольшой плагин.

Основная логика — программно менять статус вариаций на 'private' или 'draft', либо скрывать их из списка вариаций на фронтенде.

Пример кода для скрытия вариаций без наличия

add_filter('woocommerce_variation_is_active', 'disable_variation_if_out_of_stock', 10, 2); function disable_variation_if_out_of_stock($is_active, $variation) {     $stock_quantity = $variation->get_stock_quantity();     $manage_stock = $variation->managing_stock();     $is_in_stock = $variation->is_in_stock();      if ($manage_stock && (!$is_in_stock || $stock_quantity <= 0)) {         return false; // скрыть вариацию         }     return $is_active; }

Этот фильтр проверяет наличие каждой вариации при загрузке страницы и скрывает те, что нет в наличии.

Автоматическое обновление статуса вариаций в админке

Чтобы обновлять статусы вариаций автоматически без ручной проверки, можно использовать WP-CLI или CRON-задачу, которая будет менять статус вариаций:

function update_variation_status_by_stock() {     $args = [         'post_type' => 'product_variation',         'posts_per_page' => -1,         'post_status' => ['publish', 'private', 'draft'],     ];      $variations = get_posts($args);      foreach ($variations as $variation_post) {         $variation = wc_get_product($variation_post->ID);         if (!$variation) continue;          $stock = $variation->get_stock_quantity();         $manage_stock = $variation->managing_stock();         $status = $variation_post->post_status;          if ($manage_stock && ($stock === null || $stock <= 0)) {             if ($status === 'publish') {                 wp_update_post(['ID' => $variation_post->ID, 'post_status' => 'private']);             }         } elseif ($status !== 'publish') {             wp_update_post(['ID' => $variation_post->ID, 'post_status' => 'publish']);         }     } } add_action('wp_scheduled_stock_update', 'update_variation_status_by_stock');

Дальше создайте CRON-задачу в WordPress для регулярного вызова wp_scheduled_stock_update.

Проверка результата после внедрения

  • Очистите кэш сайта и браузера.
  • Откройте страницу товара с вариациями, у которых запас равен нулю — они должны быть скрыты.
  • Попробуйте оформить заказ с такими вариациями — кнопка «В корзину» должна быть недоступна.
  • Проверьте статус вариаций в админке — отсутствующие должны иметь статус private или draft.

Частые ошибки и их исправление

  • Вариации не скрываются на фронтенде. Проверьте, активен ли фильтр woocommerce_variation_is_active и нет ли конфликтов с плагинами кэширования.
  • Автоматическое обновление статусов не работает. Убедитесь, что CRON-задача зарегистрирована и выполняется. Для отладки можно вызвать функцию вручную.
  • Пользователи видят вариации, но кнопка «В корзину» отключена. Это может запутать клиентов. Лучше полностью скрыть такие вариации.

Практические советы по безопасности и производительности

  • Добавляйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
  • Оптимизируйте функцию обновления статусов вариаций, добавив обработку только изменённых товаров, если есть возможность.
  • Регулярно проверяйте логи ошибок и корректность работы CRON-задач.
  • Не используйте изменение статуса вариаций для скрытия товара, если используете сторонние плагины, которые могут некорректно реагировать на смену статуса.

Сравнение способов скрытия вариаций без запаса

Метод Преимущества Недостатки
Фильтр woocommerce_variation_is_active Просто в реализации, не меняет статусы в базе Вариации всё ещё видны в админке, возможны конфликты с плагинами
Изменение статуса вариаций (publish/private) Чистое скрытие в админке и на сайте Требует регулярного обновления, возможно влияние на другие процессы
Использование плагинов (например, WooCommerce Out of Stock Visibility) Готовое решение, поддержка Потенциально нагружает сайт, дополнительный софт
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙