Диагностика проблемы с товарами на нулевом остатке
Если в вашем интернет-магазине на WooCommerce появляются товары с нулевым остатком, которые продолжат отображаться в каталоге и доступны для просмотра, это может негативно повлиять на пользовательский опыт и конверсию. Важно понять, почему товары не скрываются автоматически при отсутствии запасов.
- Проверьте в настройках WooCommerce, включена ли опция «Скрывать товары без наличия» (
WooCommerce > Настройки > Товары > Запасы). - Убедитесь, что для каждого товара корректно установлено управление запасами и количество товара обновлено.
- Проверьте, не используются ли кастомные коды или плагины, которые влияют на отображение товаров без запасов.
Пошаговое решение: автоматическое удаление товаров с нулевым остатком
По умолчанию WooCommerce скрывает товары без запасов, но не удаляет их. Для автоматического удаления рекомендуем использовать WP-Cron и кастомный PHP-скрипт, который будет запускаться регулярно и удалять такие товары.
1. Добавление функции удаления товаров с нулевым остатком
function wpb_delete_out_of_stock_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '='
)
),
'fields' => 'ids',
'post_status' => 'publish'
);
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
wp_trash_post($product_id); // Перемещаем товар в корзину
}
}
}
2. Регистрация задачи в WP-Cron для ежедневного запуска
// Добавляем событие в расписание при активации темы или плагина
function wpb_schedule_daily_delete() {
if (!wp_next_scheduled('wpb_daily_delete_hook')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_delete_hook');
}
}
add_action('wp', 'wpb_schedule_daily_delete');
// Хук для вызова функции удаления
add_action('wpb_daily_delete_hook', 'wpb_delete_out_of_stock_products');
// Очистка расписания при деактивации
function wpb_clear_schedule() {
$timestamp = wp_next_scheduled('wpb_daily_delete_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpb_daily_delete_hook');
}
}
register_deactivation_hook(__FILE__, 'wpb_clear_schedule');
Как проверить, что удаление работает
- Создайте тестовый товар с нулевым остатком и активным статусом.
- Запустите вручную функцию
wpb_delete_out_of_stock_productsчерез WP-CLI или временно вызовите в шаблоне. - Проверьте, что товар переместился в корзину (Trash) в админке WooCommerce.
- Убедитесь, что товары с запасами не затрагиваются.
- Мониторьте логи cron-задач, если используете плагин WP Crontrol.
Частые ошибки и способы их исправления
- Не срабатывает cron-задача: WP-Cron зависит от трафика сайта. Для надежности настройте системный cron или используйте плагин WP Crontrol для теста.
- Товары не удаляются, а только скрываются: Проверьте, что в функции используется
wp_trash_post, а не просто изменение статуса. - Ошибка прав доступа: Убедитесь, что пользователь, под которым запускается код (обычно админ), имеет права на удаление товаров.
- Удаление вариативных товаров: Если в каталоге есть вариативные продукты, их дочерние товары тоже могут иметь статус outofstock. Включите проверку дочерних товаров для полного удаления.
Практические советы по безопасности и производительности
- Перед удалением лучше перемещать товары в корзину, чтобы была возможность восстановления.
- Не ставьте слишком частый запуск cron-задачи — достаточно один раз в сутки.
- Для крупных магазинов сделайте пагинацию выборки, чтобы избежать перегрузки памяти и таймаутов.
- Рекомендуется тестировать скрипт на копии сайта перед запуском в продакшене.
- Для дополнительной безопасности добавьте логирование удалённых товаров в отдельный файл.
Сравнение решений: плагин vs собственный код
| Решение | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WooCommerce Out of Stock Manager) | Простота установки, готовый интерфейс, опции настройки | Может быть тяжеловесным, не всегда гибкий, лишние функции |
| Собственный код (как в статье) | Лёгкий, точечный, легко адаптируемый, не нагружает систему | Требует технических навыков, нет интерфейса управления |