Диагностика проблемы: зачем удалять товары без наличия на складе
Интернет-магазин на WooCommerce со временем накапливает товары, которых нет в наличии. Они могут занимать место в каталоге, ухудшать пользовательский опыт и влиять на SEO. Удаление таких товаров вручную — рутинная и затратная задача. Автоматизация процесса позволяет поддерживать актуальность ассортимента без лишних усилий.
Как автоматически удалять товары без складских запасов: пошаговое решение
1. Создание пользовательской функции для удаления товаров
Для автоматического удаления всех товаров, у которых количество на складе равно нулю или меньше, можно использовать следующий код. Добавьте его в файл functions.php вашей дочерней темы или в кастомный плагин:
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', // Получаем только ID
'post_status' => 'publish',
);
$out_of_stock_ids = get_posts($args);
if (!empty($out_of_stock_ids)) {
foreach ($out_of_stock_ids as $product_id) {
wp_delete_post($product_id, true); // Полное удаление без перемещения в корзину
}
}
}2. Автоматизация запуска функции по расписанию (WP-Cron)
Чтобы не запускать вручную, добавим задачу, которая будет выполняться, например, раз в неделю.
// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('wpb_delete_oos_products_cron')) {
wp_schedule_event(time(), 'weekly', 'wpb_delete_oos_products_cron');
}
// Хук для запуска нашей функции
add_action('wpb_delete_oos_products_cron', 'wpb_delete_out_of_stock_products');
// Для отмены расписания (при деактивации темы/плагина)
function wpb_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wpb_delete_oos_products_cron');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpb_delete_oos_products_cron');
}
}
// Не забудьте вызвать wpb_deactivate_cleanup() при деактивации
Проверка результата после внедрения
- Перейдите в админку WooCommerce → Товары и отфильтруйте товары по статусу «Нет в наличии».
- После запуска функции (вручную или по расписанию) таких товаров не должно остаться.
- Можно вручную вызвать функцию с помощью
wpb_delete_out_of_stock_products();в админке через плагин типа Code Snippets или напрямую, чтобы проверить работоспособность. - Проверьте логи ошибок и успешных вызовов WP-Cron (через плагин WP Crontrol) для подтверждения запуска задачи.
Частые ошибки и как их исправить
- Функция не удаляет товары: проверьте, что у товаров действительно статус
_stock_statusравенoutofstock. Если используется другое поле или плагин управления запасами, нужно адаптировать meta_query. - Функция не запускается по расписанию: WP-Cron работает только при посещении сайта. Для стабильности настройте системный cron на вызов
wp-cron.phpили воспользуйтесь плагином WP Crontrol. - Удаление происходит не полностью: параметр
wp_delete_postсtrueво втором аргументе гарантирует полное удаление, проверьте, не вызывается ли где-то отмена. - Проблемы с производительностью при большом количестве товаров: разбейте удаление на пакеты, например, по 50 товаров за вызов, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Перед автоматическим удалением обязательно делайте резервное копирование базы данных.
- Добавьте логирование удалённых товаров в отдельный файл или в системный лог для аудита.
- Если магазин большой, реализуйте удаление пакетами с помощью
array_chunkи планируйте повторные WP-Cron задачи. - Перед удалением можно отправлять уведомление администратору с количеством товаров для удаления.
- Проверяйте совместимость с плагинами управления складом, чтобы не удалить нужные товары по ошибке.
Сравнение вариантов автоматического удаления товаров без наличия
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php с WP-Cron | Самостоятельное удаление через WP-Cron и кастомный код | Полный контроль, бесплатно, гибко | Требует навыков, возможны ошибки, нужно тестировать |
| Плагины для управления складом | Используют встроенные функции плагинов для очистки | Простота, поддержка, интеграция с другими функциями | Платные, могут быть избыточными, нагрузка |
| Ручное удаление через админку | Фильтрация и массовое удаление вручную | Простота, без кода | Трудозатратно, не автоматично |