Диагностика проблемы отсутствия товаров в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товар заканчивается на складе, но он продолжает отображаться в каталоге и позволяет оформить заказ. Это приводит к недовольству покупателей и лишним административным операциям по возвратам и отменам заказов.
Типичные признаки проблемы:
- Товары со статусом "в наличии" показываются в магазине, хотя физически их нет.
- Клиенты оформляют заказы на отсутствующий товар.
- Администраторы вынуждены вручную менять статус товара или отменять заказы.
Для решения задачи необходимо автоматически менять статус товара (например, на "нет в наличии" или "скрыт"), а также предусмотреть возможность возврата товара, если он появился снова на складе.
Пошаговое решение: автоматическое отключение товаров при отсутствии на складе
1. Включение управления запасами WooCommerce
Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что опция Включить управление запасами активирована. Без этого WooCommerce не сможет отслеживать наличие товара.
2. Настройка статусов товара в зависимости от остатков
WooCommerce автоматически меняет статус товара на "нет в наличии", если количество на складе достигает нуля, но это поведение можно расширить для автоматического скрытия товара из каталога или даже смены статуса публикации.
3. Автоматическое скрытие товаров без наличия через код
Добавьте следующий код в файл functions.php вашей темы (лучше дочерней) или в отдельный плагин:
add_action('woocommerce_product_set_stock_status', 'auto_hide_out_of_stock_products', 10, 3);function auto_hide_out_of_stock_products($product_id, $stock_status, $product) { // Проверяем, если товар нет в наличии if ($stock_status === 'outofstock') { // Меняем статус публикации товара на черновик (скрываем из каталога) $post = array( 'ID' => $product_id, 'post_status' => 'draft' ); wp_update_post($post); } elseif ($stock_status === 'instock') { // Если товар снова в наличии, возвращаем статус публикации в 'publish' $post = array( 'ID' => $product_id, 'post_status' => 'publish' ); wp_update_post($post); }}Этот код слушает изменение статуса наличия и меняет публикацию товара, чтобы скрыть его из магазина при отсутствии на складе и вернуть обратно при появлении.
4. Обработка возврата товара
Если товар появился на складе, код автоматически вернёт статус публикации, делая товар видимым для покупателей.
Проверка результата после внедрения
Чтобы проверить, что решение работает:
- Уменьшите количество товара до 0 в админке WooCommerce (редактирование продукта).
- Обновите страницу каталога магазина — товар должен исчезнуть.
- Увеличьте количество товара до значения больше 0.
- Обновите страницу каталога — товар должен снова появиться.
Для более точной проверки можно использовать запросы к базе или WP CLI:
wp post status get <product_id>Статус должен меняться между draft и publish.
Частые ошибки и как их исправить
- Код не работает после обновления товара: проверьте, что включено управление запасами в настройках WooCommerce.
- Товар не скрывается из каталога: возможно, тема или кэш сайта игнорируют статус публикации. Очистите кэш и проверьте шаблоны вывода.
- Появляется ошибка при вызове
wp_update_post: убедитесь, что нет конфликтующих плагинов, и что у пользователя есть права на редактирование постов.
Практические советы по безопасности и производительности
- Вместо изменения статуса публикации можно использовать фильтр
pre_get_postsдля скрытия товаров без смены статуса — это безопаснее, если не хотите менять публикацию. - Для больших магазинов с тысячами товаров автоматизация через хук
woocommerce_product_set_stock_statusне создаст нагрузку, но регулярное массовое обновление статусов лучше делать через WP CLI или планировщик задач. - Следите за правами доступа на изменение постов, чтобы избежать проблем с безопасностью.
Сравнение вариантов решения
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Изменение статуса публикации (draft/publish) | Автоматически скрывает/показывает товар | Простота реализации, товар полностью скрыт | Меняет статус поста, может повлиять на SEO и индексацию |
Использование фильтра pre_get_posts | Фильтрация товаров в запросах без изменения поста | Не влияет на статус публикации, безопасно для SEO | Товар остается опубликованным, видим в админке |
| Плагины для управления наличием | Использование готовых решений (например, WooCommerce Out of Stock Manager) | Готовый функционал, поддержка обновлений | Могут быть избыточны, влиять на производительность |