Проблема: почему нужно автоматически удалять товары с нулевым остатком
В интернет-магазинах на WooCommerce наличие товаров с нулевым остатком может создавать путаницу для покупателей, а также загромождать каталог. Автоматическое удаление таких товаров помогает поддерживать актуальность ассортимента без лишних усилий. Многие решают эту задачу с помощью плагинов, но если их количество велико или необходим тонкий контроль, лучше использовать собственные скрипты.
Диагностика: как проверить наличие товаров с нулевым остатком
Для начала убедимся, что на сайте есть товары с нулевым остатком. В админке WooCommerce перейдите в «Товары» и примените фильтр по запасам:
- В колонке «Остаток» найдите товары со значением 0
- Проверьте, что товары действительно не доступны для продажи
Для программной проверки можно использовать WP-CLI:
wp post list --post_type=product --meta_key=_stock --meta_value=0 --fields=ID,post_title,_stockЕсли запрос возвращает список товаров, значит задача актуальна.
Шаги решения: автоматическое удаление товаров с нулевым остатком через Cron и PHP
1. Создаем функцию для удаления товаров с нулевым остатком
function wpexperts_delete_zero_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => 0,
'compare' => '=',
'type' => 'NUMERIC',
],
],
'post_status' => ['publish', 'draft', 'private'],
'fields' => 'ids',
];
$products = get_posts($args);
if (empty($products)) {
return;
}
foreach ($products as $product_id) {
wp_trash_post($product_id); // Перемещаем в корзину
// Можно заменить на wp_delete_post($product_id, true); чтобы удалить сразу
}
}2. Регистрируем Cron задачу для регулярного запуска
add_action('wpexperts_delete_zero_stock_event', 'wpexperts_delete_zero_stock_products');
if (!wp_next_scheduled('wpexperts_delete_zero_stock_event')) {
wp_schedule_event(time(), 'daily', 'wpexperts_delete_zero_stock_event');
}3. Очистка Cron задачи при деактивации темы или плагина
function wpexperts_clear_delete_zero_stock_cron() {
$timestamp = wp_next_scheduled('wpexperts_delete_zero_stock_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpexperts_delete_zero_stock_event');
}
}
register_deactivation_hook(__FILE__, 'wpexperts_clear_delete_zero_stock_cron');Проверка результата после внедрения
После добавления кода в functions.php вашей темы или в кастомный плагин:
- Запустите задачу вручную для теста, вызвав функцию
wpexperts_delete_zero_stock_products()через WP-CLI или временно добавив вызов в файл. - Проверьте, что товары с нулевым остатком переместились в корзину или удалились полностью.
- Убедитесь, что Cron событие запланировано (через плагин WP Crontrol или WP-CLI
wp cron event list).
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, что мета-ключ
_stockреально хранит количество, а не другой параметр (например,_stock_status). - Функция не вызывается по Cron: убедитесь, что WP Cron работает (на некоторых серверах нужно настроить системный CRON для вызова wp-cron.php).
- Удаляются нужные товары: добавьте дополнительную проверку статуса товара или категории, чтобы не удалить важные позиции.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()вместо удаления, чтобы иметь возможность восстановить товары при ошибке. - Ограничьте количество товаров, обрабатываемых за один запуск, чтобы не перегружать сервер. Например, добавьте параметр
'posts_per_page' => 50и запускайте несколько раз. - Добавьте логирование удалений в файл через
error_log()или отдельный лог для отладки. - В целях безопасности разместите код в кастомном плагине, а не в теме, чтобы не потерять при смене шаблона.
Сравнение вариантов реализации удаления товаров с нулевым остатком
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Плагины (например, WP All Import, автоматизация складов) | Простота настройки, часто с поддержкой уведомлений | Нагрузка на сайт, лишние зависимости | Использовать для больших магазинов с интеграциями |
| Кастомный код с Cron | Полный контроль, минимальные зависимости, оптимизация под задачи | Требует навыков PHP и отладки | Подходит для разработчиков и небольших/средних магазинов |
| Ручное удаление | Нет риска автоматических ошибок | Ручной труд, высокая вероятность забыть | Использовать как временное решение |