Диагностика проблемы: зачем удалять товары с нулевым остатком
В интернет-магазинах на WooCommerce часто накапливаются товары, у которых закончился запас (stock = 0). Это может запутать менеджеров, ухудшить навигацию для клиентов и замедлить работу сайта, особенно если таких товаров много. Встроенного механизма автоматического удаления таких товаров WooCommerce не предоставляет. Задача — реализовать автоматическое удаление товаров с нулевым остатком, используя собственный код, без установки дополнительных плагинов.
Пошаговое решение: реализация автоматического удаления товаров с нулевым остатком
1. Создаем функцию для удаления товаров с нулевым запасом
Функция должна искать все товары, у которых количество на складе равно нулю, и удалять их программно.
function wpdir_delete_zero_stock_products() {
// Параметры запроса по товарам с нулевым остатком
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock',
'value' => '0',
'compare' => '='
),
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '='
)
),
'fields' => 'ids',
'post_status' => 'publish'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - удаление без возможности восстановления
}
}
}2. Запускаем функцию через WP-Cron для автоматизации
Чтобы не запускать функцию вручную, подключаем её к WP-Cron. Например, раз в сутки.
if (!wp_next_scheduled('wpdir_daily_delete_zero_stock')) {
wp_schedule_event(time(), 'daily', 'wpdir_daily_delete_zero_stock');
}
add_action('wpdir_daily_delete_zero_stock', 'wpdir_delete_zero_stock_products');3. Добавляем возможность ручного запуска в админке (опционально)
Это удобно для тестирования и экстренного удаления.
add_action('admin_menu', function() {
add_submenu_page('tools.php', 'Удалить товары с 0 остатком', 'Удалить 0 остаток', 'manage_options', 'delete-zero-stock', function() {
if (isset($_POST['delete_zero_stock'])) {
wpdir_delete_zero_stock_products();
echo '<div class="notice notice-success is-dismissible">Товары с нулевым остатком удалены.</div>';
}
echo '<form method="post"><input type="submit" name="delete_zero_stock" value="Удалить товары с 0 остатком" class="button button-primary" /></form>';
});
});Проверка результата после внедрения
- Проверьте, что товары с остатком 0 действительно удалены после запуска функции (через WP-Cron или вручную).
- Откройте раздел «Продукты» в админке WooCommerce и убедитесь, что таких товаров нет.
- Просмотрите логи ошибок и убедитесь, что не возникло фатальных ошибок при удалении.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, правильно ли срабатывает WP-Cron, и что функция подключена к хуку.
- Удаляются не все товары с нулевым остатком: убедитесь, что в базе у товаров корректно установлен мета-ключ
_stockи_stock_status. Иногда остаток может бытьnullили отсутствовать. - Удаление товаров вызывает сбои: возможно, есть зависимости — заказы, связанные с товарами. Удаляйте только товары, которые не используются в заказах или настройте обработку ошибок.
Практические советы по безопасности и производительности
- Перед удалением товаров сделайте резервную копию базы данных.
- Для больших магазинов с тысячами товаров делайте удаление партиями — по 50-100 товаров за один запуск, чтобы не перегружать сервер.
- Логируйте результаты работы функции в отдельный файл или в системный лог, чтобы отслеживать, когда и сколько товаров было удалено.
- Если магазин использует кэширование, очистите кэш после удаления товаров, чтобы изменения отобразились на сайте.
Таблица сравнения способов удаления товаров с нулевым остатком
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Простота, не требует кода | Трудоемко, риск пропуска товаров |
| Плагины авточистки (например, WP Bulk Delete) | Удобство, графический интерфейс | Дополнительная нагрузка, возможность конфликтов |
| Собственный код + WP-Cron | Гибкость, отсутствие плагинов, контроль процесса | Требует навыков программирования, настройка |