Диагностика проблемы: почему нужно удалять товары без наличия
В интернет-магазинах на WooCommerce часто накапливаются товары, которых нет в наличии. Это затрудняет управление каталогом, ухудшает пользовательский опыт и может негативно влиять на SEO, так как поисковые системы фиксируют большое количество «пустых» страниц товаров.
Проблема особенно актуальна при большом ассортименте и частом обновлении остатков. Ручное удаление неэффективно и подвержено ошибкам.
Как автоматически удалять товары без наличия на складе в WooCommerce
Обязательные условия для реализации
- Включён учёт остатков (Stock Management) в настройках WooCommerce.
- Для вариативных товаров проверка должна учитывать все вариации.
- Бэкап базы данных перед массовым удалением.
Пошаговое решение с примером кода
Добавим в файл functions.php вашей темы (или в собственный плагин) следующий код для удаления товаров без наличия раз в сутки по крону:
function wps_delete_out_of_stock_products() {
if ( ! class_exists('WC_Product_Query') ) {
return;
}
$args = array(
'limit' => -1,
'status' => 'publish',
'stock_status' => 'outofstock',
'return' => 'ids',
);
$query = new WC_Product_Query($args);
$product_ids = $query->get_products();
if (empty($product_ids)) {
return;
}
foreach ($product_ids as $product_id) {
wp_delete_post($product_id, true); // true - безвозвратно
}
}
// Регистрируем cron событие, если оно ещё не зарегистрировано
if ( ! wp_next_scheduled( 'wps_daily_delete_out_of_stock' ) ) {
wp_schedule_event( time(), 'daily', 'wps_daily_delete_out_of_stock' );
}
// Привязываем функцию к событию
add_action('wps_daily_delete_out_of_stock', 'wps_delete_out_of_stock_products');Этот код использует класс WC_Product_Query для выборки всех опубликованных товаров со статусом outofstock и удаляет их безвозвратно.
Особенности работы с вариативными товарами
WooCommerce по умолчанию считает вариативный товар «в наличии», если хотя бы одна вариация есть в наличии. Для удаления вариативных товаров, у которых все вариации отсутствуют, нужен дополнительный код:
function wps_delete_out_of_stock_variable_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
),
),
'fields' => 'ids',
);
$variable_products = get_posts($args);
foreach ($variable_products as $product_id) {
$product = wc_get_product($product_id);
$variations = $product->get_children();
$all_out_of_stock = true;
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation->is_in_stock()) {
$all_out_of_stock = false;
break;
}
}
if ($all_out_of_stock) {
wp_delete_post($product_id, true);
}
}
}
add_action('wps_daily_delete_out_of_stock', 'wps_delete_out_of_stock_variable_products');Проверка результата после внедрения
- Вручную проверьте, что в каталоге не осталось товаров без остатков (через админку или SQL-запрос).
- Принудительно запустите событие cron для теста, например, через плагин WP Crontrol.
- Проверьте логи ошибок и убедитесь, что удаление прошло без сбоев.
- Убедитесь, что в корзине и на фронтенде не показываются удалённые товары.
Частые ошибки и как их исправить
- Не удаляются вариативные товары: не учтён статус всех вариаций. Используйте второй код из статьи.
- Удаление не происходит: cron событие не активировано, проверьте
wp_schedule_eventи работу WP Cron. - Удаляются товары в наличии: ошибка в логике или неверный параметр
stock_status. Проверяйте статус через админку и код. - Потеря данных без восстановления: всегда делайте бэкап базы перед массовыми операциями.
Практические советы по безопасности и производительности
- Для больших магазинов используйте пакетную обработку с лимитом по количеству товаров за один запуск, чтобы избежать таймаутов.
- Добавьте логирование удалённых товаров в файл или базу для аудита.
- Перед удалением можно переместить товары в черновики, чтобы проверить последствия.
- Отключите удаление в периоды пиковых нагрузок.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Компромиссы |
|---|---|---|---|
| Плагин (например, WP All Import Pro с функцией удаления) | Простой интерфейс, поддержка, дополнительные функции | Платно, нагрузка, лишний функционал | Подходит для крупных магазинов с бюджетом |
| Код в functions.php (как в статье) | Бесплатно, точечное решение, гибкость | Требует навыков, возможны ошибки | Для опытных разработчиков и контролируемых условий |
| Внешние скрипты SQL + WP CLI | Максимальная скорость и контроль | Риск повреждения базы, требует навыков SQL | Для продвинутых администраторов с бэкапами |