Диагностика проблемы: почему товары без запаса остаются в каталоге
Магазины на WooCommerce часто сталкиваются с проблемой: товары, которые закончились на складе (stock = 0), продолжают отображаться в каталоге. Это может приводить к снижению конверсии, негативному опыту пользователей и увеличению административной нагрузки на менеджеров, которым приходится вручную удалять или скрывать такие товары.
Основные причины:
- Отсутствие настроек автоматического управления запасами.
- Плагины кэширования не обновляют данные вовремя.
- Отсутствие логики удаления или скрытия товаров при достижении нуля на складе.
Пошаговое решение: создание автоматического удаления товаров с нулевым запасом
1. Включение управления запасами WooCommerce
Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что опция Включить управление запасами активирована. Это позволит WooCommerce отслеживать количество товара.
2. Написание функции для удаления товаров с нулевым запасом
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин. Код будет запускать WP-Cron, который ежедневно удаляет товары с нулевым запасом.
function wpmeta_delete_out_of_stock_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
),
),
'fields' => 'ids',
);
$query = new WP_Query($args);
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - без перемещения в корзину
}
}
// Планируем событие при активации темы
function wpmeta_schedule_stock_cleanup() {
if (! wp_next_scheduled('wpmeta_daily_stock_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpmeta_daily_stock_cleanup');
}
}
add_action('wp', 'wpmeta_schedule_stock_cleanup');
// Хук для очистки
add_action('wpmeta_daily_stock_cleanup', 'wpmeta_delete_out_of_stock_products');3. Ручной запуск для проверки
Для тестирования можно запустить функцию вручную, вызвав wpmeta_delete_out_of_stock_products(); через админ-панель с помощью плагина Code Snippets или WP-CLI.
Проверка результата после внедрения
- В админке WooCommerce в разделе «Товары» убедитесь, что товары со статусом
outofstockудалены. - Проверьте фронтенд сайта — таких товаров не должно отображаться в каталоге.
- Для проверки работы WP-Cron можно использовать плагин WP Crontrol и просмотреть запланированные задачи.
Частые ошибки и как их исправить
Ошибка 1: Товары не удаляются, хотя статус «нет в наличии»
Причина: возможно, товары не имеют мета-поля _stock_status со значением outofstock. Проверьте с помощью запроса в базе или плагина «Query Monitor».
Ошибка 2: Удаляются товары, которые не должны быть удалены
Причина: если у товара несколько вариаций, мета-поле может не отражать реальное количество на складе. В этом случае нужно адаптировать функцию для вариативных товаров, проверяя запасы каждой вариации.
Ошибка 3: WP-Cron не запускается автоматически
Причина: на некоторых хостингах WP-Cron работает только при посещении сайта. Для надежной работы настройте системный cron или запускайте вручную.
Практические советы по безопасности и производительности
- Перед удалением товаров делайте резервные копии базы данных.
- Для больших магазинов используйте пагинацию в запросе, чтобы не перегружать память.
- Если хотите не удалять, а скрывать товары, замените
wp_delete_postна изменение статуса товара'draft'или'private'. - Оптимизируйте кэширование, чтобы изменения сразу отражались на сайте.
Сравнение вариантов решения задачи
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Просто, без кода | Трудозатратно, ошибка человека |
| Автоматическое удаление через WP-Cron (код) | Автоматизация, масштабируемость | Необходимы навыки, возможны ошибки в логике |
| Скрытие товаров с помощью статуса | Безопасно, можно быстро восстановить | Товары остаются в базе, увеличивается размер каталога |