Почему важно автоматически отключать товары без наличия
В интернет-магазинах на WooCommerce товары могут временно отсутствовать на складе. Если такие позиции остаются активными и доступны для покупки, это приводит к недовольству клиентов, отменам заказов и увеличению нагрузки на поддержку. Автоматическое отключение товаров при отсутствии наличия помогает избежать этих проблем и улучшить пользовательский опыт.
Диагностика проблемы: как понять что товар не должен отображаться
Для корректной работы автоматического отключения необходимо убедиться, что у товара корректно настроено управление запасами:
- Включено управление запасами (Inventory management) в карточке товара.
- Поле
Stock quantityсоответствует реальному количеству. - Параметр
Allow backordersотключён, если не планируется продажа товаров в минус.
Если эти условия не соблюдены, WooCommerce не сможет корректно определять отсутствие товара.
Проверка текущих настроек товара
function check_product_stock_settings( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product->managing_stock() ) {
return 'Не включено управление запасами';
}
if ( $product->get_stock_quantity() > 0 ) {
return 'Товар в наличии';
}
if ( $product->backorders_allowed() ) {
return 'Разрешены бэкордеры';
}
return 'Товара нет в наличии и бэкордеры запрещены';
}Выведите результат для тестового товара и проверьте настройки.
Пошаговое решение: автоматическое отключение товаров без наличия
Для автоматического отключения товаров, у которых stock_quantity равен 0 и бэкордеры запрещены, добавим хук, который при проверке видимости товара переводит его в статус draft.
add_action('woocommerce_product_set_stock_status', 'auto_draft_out_of_stock_products', 10, 3);
function auto_draft_out_of_stock_products( $product_id, $stock_status, $product ) {
if ( $stock_status === 'outofstock' && ! $product->backorders_allowed() ) {
// Переводим товар в черновики
if ( get_post_status( $product_id ) !== 'draft' ) {
wp_update_post( [
'ID' => $product_id,
'post_status' => 'draft'
] );
}
}
}Этот код срабатывает при изменении статуса запаса товара. Если товар становится отсутствующим и бэкордеры запрещены, он автоматически скрывается с сайта.
Альтернативный подход: использование WP-Cron для массовой проверки
Если у вас много товаров, можно настроить регулярный WP-Cron, который проверяет запасы и отключает отсутствующие товары раз в сутки.
add_action( 'auto_draft_out_of_stock_cron', 'auto_draft_out_of_stock_products_cron' );
function auto_draft_out_of_stock_products_cron() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock'
]
]
];
$query = new WP_Query( $args );
foreach ( $query->posts as $post ) {
$product = wc_get_product( $post->ID );
if ( ! $product->backorders_allowed() ) {
wp_update_post( [ 'ID' => $post->ID, 'post_status' => 'draft' ] );
}
}
}
// Регистрируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'auto_draft_out_of_stock_cron' ) ) {
wp_schedule_event( time(), 'daily', 'auto_draft_out_of_stock_cron' );
}Проверка результата после внедрения
1. Создайте тестовый товар с включённым управлением запасами, количеством 1 и без разрешения бэкордеров.
2. Уменьшите количество до 0 — товар должен автоматически перейти в статус «черновик».
3. Проверьте, что товар исчез с витрины и не доступен для покупки.
4. Для WP-Cron проверьте, что событие запланировано wp cron event list или с помощью плагина WP Crontrol.
Частые ошибки и как их исправить
- Не включено управление запасами. WooCommerce не будет отслеживать остатки. Проверьте и включите в настройках товара.
- Разрешены backorders. Товар не будет считаться отсутствующим, даже если запас 0.
- Кэширование страницы товара. После изменения статуса товар может оставаться видимым из-за кэша. Очистите кэш и отключите кэширование для проверки.
- Конфликт с другими плагинами. Некоторые плагины могут изменять статус товаров. Проверьте логи и отключайте плагины поочерёдно.
Практические советы по безопасности и производительности
- При использовании WP-Cron для массовых операций добавьте лимиты по количеству товаров за одну итерацию, чтобы избежать таймаутов.
- Используйте транзиенты или кэширование при регулярных проверках для снижения нагрузки.
- Перед массовыми изменениями статуса товаров сделайте резервную копию базы данных.
- Включите логирование действий по изменению статуса для аудита и быстрой диагностики.
Сравнение вариантов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_product_set_stock_status | Автоматическое переключение статуса товара при смене запаса | Работает сразу, не требует дополнительной нагрузки | Не срабатывает для массового обновления без триггера |
| WP-Cron с регулярной проверкой | Периодическая проверка всех товаров и отключение отсутствующих | Обрабатывает все товары, работает при обновлениях вне WooCommerce | Нагрузка на сервер, задержка до выполнения задачи |
| Плагин сторонний | Готовое решение с настройками и интерфейсом | Простота настройки, поддержка | Дополнительная нагрузка, может конфликтовать, цена |