Диагностика проблемы: зачем нужно удалять товары без остатка
В магазинах на WooCommerce часто накапливаются товары со складским остатком 0, которые уже не доступны для продажи. Это мешает навигации покупателей, ухудшает SEO и может замедлять загрузку страниц каталога. Особенно актуально, если товаров много и обновление склада происходит часто.
Для диагностики: зайдите в админку WooCommerce - Товары, добавьте фильтр по запасам "нет в наличии". Если таких товаров много и они не удаляются автоматически, стоит автоматизировать процесс.
Пошаговое решение: автоматическое удаление товаров без остатка
1. Создаем PHP-функцию и подключаем к крону WordPress
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function cyrtolat_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',
);
$products = get_posts($args);
if (empty($products)) {
return;
}
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // удаление без возможности восстановления
}
}
// Регистрируем событие в крон
if (!wp_next_scheduled('cyrtolat_daily_delete_out_of_stock')) {
wp_schedule_event(time(), 'daily', 'cyrtolat_daily_delete_out_of_stock');
}
add_action('cyrtolat_daily_delete_out_of_stock', 'cyrtolat_delete_out_of_stock_products');2. Как запустить вручную для проверки
Для проверки работы функции без ожидания крон-события вставьте в functions.php временно:
add_action('init', function() {
if (isset($_GET['run_delete_outofstock']) && current_user_can('manage_woocommerce')) {
cyrtolat_delete_out_of_stock_products();
exit('Удаление завершено');
}
});После этого вызовите в браузере https://ваш-сайт.ru/?run_delete_outofstock=1 под админом. Убедитесь, что товары с нулевым остатком удалились.
Проверка результата после внедрения
- Перейдите в админку WooCommerce » Товары, примените фильтр "нет в наличии". Там не должно быть удалённых товаров.
- Проверьте логи крон-задач (если есть плагин WP Crontrol), что задача выполняется ежедневно.
- Проверьте на сайте, что товары с 0 остатком не отображаются в каталоге.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, активен ли WP-Cron. Для теста вызовите функцию вручную, как описано выше.
- Удаляются не все товары: убедитесь, что у товаров статус "outofstock" установлен правильно, иногда нужно дополнительно проверять
_stockили другие кастомные мета-поля. - Удаление вызывает ошибки: проверьте права пользователя и ограничения хостинга на выполнение скриптов.
- Потеря SEO позиций: подумайте о редиректах или создании страницы с сообщением о снятии товара, прежде чем удалять.
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами товаров используйте пакетную обработку, например, удаляйте по 50 товаров за один запуск, чтобы избежать таймаута.
- Создайте резервную копию базы данных перед автоматическим удалением.
- Используйте хук
wp_schedule_eventс интервалом "daily" или настройте на менее частое выполнение, если обновления склада редкие. - Не удаляйте товары с активными заказами – для этого можно расширить запрос, исключая товары с заказами в статусах обработки или завершен.
Сравнение способов удаления товаров без остатка
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Трудоемко при большом ассортименте | Маленькие магазины |
| Код с WP-Cron (как в статье) | Автоматизация, гибкость | Требует навыков, возможен таймаут при большом объеме | Средние и крупные магазины |
| Плагины для управления складом | Расширенный функционал | Может влиять на производительность, требуются настройки | Сложные сценарии, интеграция с ERP |