Диагностика проблемы: почему товары остаются в каталоге без наличия
В стандартной настройке WooCommerce товар со значением "нет в наличии" по умолчанию не удаляется из каталога, а просто отображается как отсутствующий. Это может приводить к путанице пользователей и снижению конверсии, так как товары, которых нет в продаже, занимают место в каталоге и снижают удобство навигации. Чтобы решить эту задачу, необходимо автоматически удалять или скрывать такие товары.
Варианты решения: удалить или скрыть товары без наличия
Перед тем как реализовать удаление, рассмотрим 3 варианта действий с отсутствующими товарами:
- Автоматическое удаление товара из каталога — полностью удаляет товар (вместе с метаданными и изображениями).
- Автоматическое скрытие товара — меняет статус товара на черновик или скрытый, чтобы исключить из каталога, но сохранить данные.
- Отключение отображения товаров без наличия стандартными средствами WooCommerce — настройка фильтров отображения.
Каждый вариант имеет свои плюсы и минусы, которые стоит учитывать:
| Вариант | Плюсы | Минусы |
|---|---|---|
| Удаление товара | Полное удаление, освобождение базы данных и улучшение удобства | Потеря данных, если нет резервных копий; восстановление возможно только через импорт/резерв |
| Скрытие товара | Сохраняет историю и данные, легко вернуть товар в каталог | Занимает место в базе, требуется дополнительный фильтр для исключения из каталога |
| Фильтрация отображения | Самый простой метод, без удаления и изменения статуса | Товар остается доступен по прямой ссылке, не освобождает базу |
Пошаговое решение: автоматическое удаление товаров без наличия при обновлении запасов
1. Создаем функцию для удаления товаров без наличия
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpaction_delete_out_of_stock_products() {
// Параметры запроса для получения всех товаров без наличия
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
],
'fields' => 'ids',
];
$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
Добавьте расписание, чтобы функция запускалась, например, ежедневно:
if (! wp_next_scheduled('wpaction_daily_delete_outofstock')) {
wp_schedule_event(time(), 'daily', 'wpaction_daily_delete_outofstock');
}
add_action('wpaction_daily_delete_outofstock', 'wpaction_delete_out_of_stock_products');3. Запуск функции вручную для проверки
Во время разработки или тестирования можно вызвать функцию вручную, например, через админку или wp-cli:
wpaction_delete_out_of_stock_products();Как проверить, что решение сработало
- Перейдите в админку WooCommerce > Товары и отфильтруйте по статусу "нет в наличии". После выполнения скрипта таких товаров не должно остаться.
- Проверьте на сайте каталог — отсутствующие товары должны исчезнуть.
- Для проверки cron-заданий используйте плагин
WP Crontrolили командуwp cron event listчерез wp-cli.
Частые ошибки и как их исправить
- Функция не удаляет товары — проверьте правильность ключа метаполя: WooCommerce использует
_stock_statusсо значениямиinstock,outofstock. - Удаляются товары с наличием — убедитесь, что сравнение сделано строго на
outofstock, без лишних условий. - Проблемы с WP-Cron — на некоторых серверах cron не работает без посещения сайта. Проверьте работу через wp-cli или настройте системный cron для вызова wp-cron.php.
- Удаление без возможности восстановления — используйте вторую копию сайта или тестовую базу для отладки. Для безопасности лучше сначала реализовать скрытие, а не удаление.
Практические советы по безопасности и производительности
- Перед автоматическим удалением товаров сделайте резервную копию базы данных.
- Если каталог очень большой, выполняйте удаление пакетами, чтобы избежать превышения времени выполнения PHP. Например, лимитируйте количество товаров в запросе и повторяйте обработку несколько раз.
- Для повышения производительности используйте
fields => 'ids'в запросах WP_Query. - Если хотите скрыть товары без удаления, используйте изменение статуса:
wp_update_post([
'ID' => $product_id,
'post_status' => 'draft'
]);- Проверяйте, что в шаблонах магазина не выводятся товары со статусом 'draft'.
Вывод
Автоматическое удаление товаров без наличия в WooCommerce помогает поддерживать каталог актуальным и облегчает навигацию для покупателей. Главное — подходить к этой задаче с осторожностью, тестировать код на тестовом сайте и обязательно иметь резервные копии. Для более гибкого управления товарами рассмотрите возможность скрытия вместо удаления.