Диагностика проблемы: почему нужно удалять товары при нулевом остатке
В WooCommerce нет встроенной функции для автоматического удаления или скрытия товаров, когда их складской запас достигает нуля. Это приводит к тому, что в каталоге остаются недоступные к покупке товары, что ухудшает пользовательский опыт и может негативно повлиять на SEO.
Пользователи часто сталкиваются с необходимостью либо вручную отключать такие товары, либо искать плагины, которые не всегда подходят под их задачи. В этой статье мы рассмотрим, как настроить автоматическое удаление товаров с помощью кода, без сторонних плагинов.
Пошаговое решение: как автоматически удалять товары при 0 остатке
1. Создание функции для проверки остатков и удаления товара
Для начала создадим функцию, которая будет запускаться при сохранении товара и проверять его складской запас. Если запас равен нулю, товар будет удаляться.
function wpcatalog_delete_product_if_out_of_stock( $post_id ) {
// Проверяем, что это продукт WooCommerce
if ( get_post_type( $post_id ) !== 'product' ) {
return;
}
// Получаем объект товара
$product = wc_get_product( $post_id );
if ( ! $product ) {
return;
}
// Проверяем, управляется ли складом
if ( ! $product->managing_stock() ) {
return;
}
// Получаем остаток на складе
$stock_quantity = $product->get_stock_quantity();
// Если остаток равен 0 или меньше, удаляем товар
if ( $stock_quantity <= 0 ) {
// Удаление товара без возможности восстановления
wp_delete_post( $post_id, true );
}
}
add_action( 'save_post', 'wpcatalog_delete_product_if_out_of_stock' );2. Обработка вариативных товаров
Для вариативных товаров нужно проверять остаток каждой вариации. Если у всех вариаций запас 0, удаляем родительский товар.
function wpcatalog_delete_variable_product_if_all_variations_out_of_stock( $post_id ) {
if ( get_post_type( $post_id ) !== 'product' ) {
return;
}
$product = wc_get_product( $post_id );
if ( ! $product || $product->get_type() !== 'variable' ) {
return;
}
$variations = $product->get_children();
$all_out_of_stock = true;
foreach ( $variations as $variation_id ) {
$variation = wc_get_product( $variation_id );
if ( $variation && $variation->managing_stock() ) {
if ( $variation->get_stock_quantity() > 0 ) {
$all_out_of_stock = false;
break;
}
} else {
// Если вариация не управляет складом, считаем ее в наличии
$all_out_of_stock = false;
break;
}
}
if ( $all_out_of_stock ) {
wp_delete_post( $post_id, true );
}
}
add_action( 'save_post', 'wpcatalog_delete_variable_product_if_all_variations_out_of_stock' );Проверка результата после внедрения
- Создайте или обновите товар с управлением складом и установите количество равным 0. После сохранения товар должен автоматически удалиться.
- Для вариативного товара установите у всех вариаций запас 0 и сохраните родительский товар — он должен быть удалён.
- Проверьте, что товары с положительным остатком не удаляются.
- Для удобства можно добавить логирование или уведомления о удалении товаров.
Частые ошибки и как их исправить
- Удаление не происходит после обновления товара. Проверьте, что функция подключена и хук
save_postсрабатывает. В админке включите WP_DEBUG и проверьте ошибки. - Удаляются товары без управления складом. Убедитесь, что проверка
$product->managing_stock()реализована, чтобы не удалять товары без остатков. - Вариативные товары не удаляются при обнулении всех вариаций. Проверьте правильность цикла по вариациям и что передаются корректные ID.
- Удаление товара приводит к потере данных. Если хотите временно скрывать товары, вместо удаления используйте смену статуса на 'trash' или 'private'.
Практические советы по безопасности и производительности
- Для избежания случайных удалений рекомендуем делать резервные копии базы данных перед внедрением такого кода.
- Если на сайте много товаров, лучше запускать проверку в фоне через WP-Cron или отдельный скрипт, чтобы не замедлять сохранение товара.
- Для логирования удалений можно использовать стандартные функции
error_logили специальные плагины для аудита действий. - Если не хотите полностью удалять товар, замените
wp_delete_post( $post_id, true )наwp_trash_post( $post_id )для перемещения в корзину.
Сравнение вариантов: код vs плагины
| Способ | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код (как в статье) | Быстрое внедрение, нет нагрузки на сайт, полный контроль | Требует навыков, риски при ошибке, нет интерфейса | Добавить логирование и уведомления |
| Плагины для управления запасами | Интерфейс, поддержка, дополнительные функции | Может замедлить сайт, платные, не всегда гибкие | Выбирать проверенные и легковесные |