Почему важно удалять товары с нулевым остатком автоматически?
В больших магазинах на WooCommerce большое количество товаров с нулевым запасом ведет к ухудшению пользовательского опыта и снижению производительности сайта. Ручное удаление занимает много времени, а плагины порой перегружают систему или создают конфликты. Автоматизация процесса через код — оптимальный вариант для разработчиков и владельцев магазинов с базовыми навыками PHP.
Диагностика: как понять, что товары с нулевым остатком не удаляются?
- Проверка наличия товаров с нулевым запасом в каталоге.
- Отсутствие изменений после попыток очистки через админку.
- Накопление таких товаров приводит к замедлению работы сайта.
- Мониторинг cron-задач — если нет настроенного автоматического удаления, то товары остаются.
Пошаговое решение: автоматическое удаление товаров с нулевым остатком
1. Создание функции для удаления товаров с запасом 0
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
function wp_puzzle_delete_zero_stock_products() {
if ( ! class_exists( 'WooCommerce' ) ) {
return;
}
$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',
);
$products = get_posts( $args );
foreach ( $products as $product_id ) {
wp_delete_post( $product_id, true ); // true = безвозвратное удаление
}
}2. Запуск функции по расписанию (WP-Cron)
Для автоматизации создадим cron-задачу, которая будет запускать функцию раз в сутки.
if ( ! wp_next_scheduled( 'wp_puzzle_daily_zero_stock_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wp_puzzle_daily_zero_stock_cleanup' );
}
add_action( 'wp_puzzle_daily_zero_stock_cleanup', 'wp_puzzle_delete_zero_stock_products' );3. Ручной запуск для первичной очистки
Чтобы сразу проверить работу, вызовите функцию вручную в functions.php или через WP-CLI:
wp eval 'wp_puzzle_delete_zero_stock_products();'Проверка результата после внедрения
- Перейдите в раздел «Товары» в админке WooCommerce и убедитесь, что товары с нулевым запасом удалены.
- Проверьте таблицу
wp_postsв базе данных — записи товаров должны отсутствовать. - Посмотрите лог cron-задач с помощью плагина WP Crontrol или через серверный cron, чтобы убедиться, что задача выполняется.
Частые ошибки и как их исправить
- Не запускается cron-задача: Проверьте, что на сайте есть посетители — WP-Cron зависит от посещаемости. Для стабильности настройте системный cron на сервере.
- Функция не удаляет товары: Убедитесь, что мета поля
_stockи_stock_statusсуществуют и верны. В некоторых версиях WooCommerce может использоваться другое хранение данных о запасах. - Удаляются нужные товары: Проверьте условия в
meta_query— они должны строго фильтровать только товары с запасом 0 и статусом «outofstock».
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед применением массовых удалений.
- Не выполняйте функцию удаления на сайтах с большим количеством товаров без ограничения запросов — это может привести к таймаутам. Разбейте удаление на партии по 50-100 товаров с помощью
posts_per_page. - Используйте системный cron для запуска WP-Cron, чтобы задачи выполнялись вовремя без зависимости от посещаемости.
- Добавьте логирование удалений, чтобы отслеживать удаленные товары и избежать случайных ошибок.
Сравнение вариантов удаления товаров с нулевым остатком
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Простой интерфейс, много опций, подходит новичкам | Дополнительная нагрузка, возможны конфликты | Маленькие и средние магазины без навыков кодинга |
| Код с WP-Cron (описано в статье) | Легковесно, кастомизация под проект, без сторонних плагинов | Требует навыков PHP, настройка cron | Средние и крупные проекты, разработчики |
| Ручное удаление через админку | Просто, без кода | Трудоемко, не подходит для большого каталога | Маленькие магазины с небольшим ассортиментом |