Диагностика проблемы: почему нужно удалять товары без запаса
В интернет-магазинах на WooCommerce часто накапливаются товары с нулевым запасом, которые не продаются. Это влияет на UX — покупатели видят неактуальные позиции, а также на SEO и производительность сайта из-за лишних записей. Автоматическое удаление таких товаров снижает нагрузку на базу и упрощает управление каталогом.
Как определить товары без запаса в WooCommerce
WooCommerce хранит запасы в метаполе _stock. Товары с запасом <= 0 считаются отсутствующими на складе. Чтобы найти их вручную, можно выполнить SQL запрос:
SELECT post_id FROM wp_postmeta WHERE meta_key = '_stock' AND meta_value <= 0;Но для автоматизации лучше использовать WP_Query с мета-запросом.
Пошаговое решение: автоматическое удаление товаров без запаса
1. Создаем функцию для удаления товаров с нулевым запасом
function wc_delete_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => 0,
'compare' => '<=',
'type' => 'NUMERIC',
],
],
'fields' => 'ids',
'post_status' => 'publish',
];
$products = new WP_Query($args);
if ($products->have_posts()) {
foreach ($products->posts as $product_id) {
wp_delete_post($product_id, true); // true - без перемещения в корзину
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Чтобы не запускать удаление вручную, добавим событие, которое будет срабатывать, например, раз в сутки.
if (!wp_next_scheduled('wc_delete_out_of_stock_daily_event')) {
wp_schedule_event(time(), 'daily', 'wc_delete_out_of_stock_daily_event');
}
add_action('wc_delete_out_of_stock_daily_event', 'wc_delete_out_of_stock_products');3. Добавляем код в functions.php вашей темы или в плагин
Рекомендуется создать дочернюю тему или собственный плагин для поддержки обновлений.
Как проверить, что удаление работает
- Добавьте в магазин несколько товаров с запасом 0 или меньше, они должны быть опубликованы.
- Запустите функцию вручную (через WP-CLI или временно вызвав
wc_delete_out_of_stock_products()). - Проверьте, что эти товары удалены из базы (в админке и через запросы).
- Убедитесь, что WP-Cron работает — можно проверить через плагин WP Crontrol.
Частые ошибки и способы их исправления
Ошибка 1: товары не удаляются, хотя запас 0
- Проверьте, что метаполе
_stockдействительно содержит нули, а не пустые строки. - Добавьте логирование для отладки, например
error_log('Deleting product ID: ' . $product_id);.
Ошибка 2: WP-Cron не срабатывает
- Проверьте, работает ли wp-cron на хостинге (иногда отключен).
- Используйте системный cron с вызовом
wp cron event run.
Ошибка 3: удаляются не те товары
- Убедитесь, что
post_type= 'product'. - Проверьте условия
meta_query.
Практические советы по безопасности и производительности
- Удаление товаров с помощью
wp_delete_post($id, true)— полностью удаляет записи, без возможности восстановления. Для безопасного удаления можно передаватьfalseи перемещать в корзину. - Перед массовым удалением сделайте резервную копию базы данных.
- Для больших магазинов с тысячами товаров добавьте пагинацию в WP_Query, чтобы избежать превышения лимита памяти.
- Регулярно проверяйте логи и состояние WP-Cron.
Сравнение вариантов автоматического удаления товаров без запаса
| Метод | Плюсы | Минусы | Использование |
|---|---|---|---|
| Ручное удаление через админку | Просто, быстро для малого количества товаров | Трудоемко при большом каталоге | Малые магазины |
| Плагины (например, WP All Import + фильтры) | Интерфейс, гибкие настройки | Доп. нагрузка, стоимость, могут конфликтовать | Средние и крупные магазины |
| Код на PHP + WP-Cron (как в статье) | Легковесно, без сторонних зависимостей, гибко | Требует знаний, нужно следить за cron | Разработчики, кастомные решения |