Диагностика проблемы: зачем автоматически удалять товары без наличия
В интернет-магазинах на WooCommerce нередко возникает ситуация, когда товары заканчиваются на складе, но остаются видимыми в каталоге. Это сбивает с толку покупателей и снижает конверсию. Автоматическое удаление или скрытие таких товаров помогает поддерживать актуальность ассортимента и улучшает пользовательский опыт.
Как определить, что товар отсутствует на складе
WooCommerce хранит данные о наличии товара в метаполях, связанных с управляющими запасами:
_stock_status— статус наличия, обычноinstock,outofstockилиonbackorder;_manage_stock— включено ли управление запасами (значениеyesилиno);_stock— остаток запасов (число).
Для простого продукта статус outofstock означает отсутствие товара.
Пошаговое решение: автоматическое удаление товаров без наличия
1. Настроить функцию для очистки каталога
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpa_auto_delete_outofstock_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
),
),
'fields' => 'ids',
);
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
wp_trash_post($product_id); // отправляем в корзину, можно заменить на wp_delete_post для полного удаления
}
}
}
2. Запустить очистку по расписанию
Чтобы запускать функцию регулярно, используйте WP-Cron:
if (!wp_next_scheduled('wpa_daily_outofstock_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpa_daily_outofstock_cleanup');
}
add_action('wpa_daily_outofstock_cleanup', 'wpa_auto_delete_outofstock_products');
3. Запуск вручную для тестирования
Для отладки вызовите функцию напрямую:
add_action('admin_init', function() {
if (current_user_can('manage_options') && isset($_GET['run_outofstock_cleanup'])) {
wpa_auto_delete_outofstock_products();
echo 'Очистка выполнена';
exit;
}
});
После добавления этого кода в админке перейдите по адресу yourdomain.com/wp-admin/?run_outofstock_cleanup=1 для теста.
Проверка результата после внедрения
- В админке WooCommerce перейдите в "Товары" и убедитесь, что товары с состоянием
outofstockперемещены в корзину или удалены. - Проверьте фронтенд — они должны исчезнуть из каталога.
- Ручной запуск функции через URL (как описано выше) должен показывать сообщение об успешном выполнении.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, что в базе действительно есть товары со статусом
outofstock. Иногда статус не обновляется автоматически. Можно временно включить управление запасами для теста. - Функция не запускается по расписанию: WP-Cron зависит от посещений сайта. Для надежности настройте системный cron или используйте плагин WP Crontrol для диагностики.
- Удаление слишком радикально: вместо
wp_trash_postможно использоватьwp_delete_post($product_id, false)для полного удаления или изменить логику на скрытие (смена статуса на черновик).
Практические советы по безопасности и производительности
- Не удаляйте товары без резервного копирования — используйте корзину WordPress (
wp_trash_post) для безопасности. - Если товаров много, разбивайте запросы на пачки (например, по 50 товаров), чтобы избежать перегрузки сервера.
- Используйте WP-CLI для запуска очистки при больших объемах данных — это ускорит процесс и снизит нагрузку.
- Проверяйте, что ваша тема и плагины корректно обновляют статусы товаров при изменении запасов.
Сравнение вариантов удаления товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| wp_trash_post | Перемещение товара в корзину | Безопасно, можно восстановить | Товары остаются в базе, занимают место |
| wp_delete_post (полное удаление) | Полное удаление товара из базы | Освобождает место, нет мусора | Невозможно восстановить без резервной копии |
| Изменение статуса на 'черновик' | Скрывает товар из каталога | Не удаляет данные, можно быстро вернуть | Товар все еще в базе, могут быть видны в админке |