Диагностика проблемы отсутствия товара на складе
В крупных магазинах на WooCommerce часто возникает ситуация, когда товары долгое время отсутствуют на складе. Это негативно влияет на пользовательский опыт и SEO, так как посетители видят товары, которые невозможно купить. Ручное управление товарным каталогом — трудозатратно, особенно при большом объеме товаров.
Задача — автоматизировать удаление или скрытие товаров, которые не были в наличии более определенного времени, например 30 дней, чтобы каталог оставался актуальным.
Пошаговое решение: автоматическое удаление товаров без наличия
1. Выбор метода хранения наличия
WooCommerce хранит количество в метаполе _stock, а статус наличия — в _stock_status (значения: instock, outofstock, onbackorder).
Для отслеживания времени отсутствия товара понадобится добавить метаполе с датой последнего появления в наличии, например, last_instock_date.
2. Добавление кода для обновления даты наличия
Вставьте в файл functions.php вашей темы или отдельный плагин следующий код, который при смене статуса наличия обновляет дату:
add_action('woocommerce_product_set_stock_status', 'update_last_instock_date', 10, 3);
function update_last_instock_date($product_id, $stock_status, $product) {
if ($stock_status === 'instock') {
update_post_meta($product_id, 'last_instock_date', current_time('mysql'));
}
}3. Создание планового задания для удаления товаров
Добавим WP-Cron задачу, которая будет ежедневно проверять товары с отсутствием в наличии более 30 дней и удалять их.
if (!wp_next_scheduled('auto_delete_outofstock_products')) {
wp_schedule_event(time(), 'daily', 'auto_delete_outofstock_products');
}
add_action('auto_delete_outofstock_products', 'delete_old_outofstock_products');
function delete_old_outofstock_products() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
[
'key' => 'last_instock_date',
'value' => $date_threshold,
'compare' => '<=',
'type' => 'DATETIME',
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_trash_post($product_id); // Можно заменить на wp_delete_post для полного удаления
}
}
}Проверка результата после внедрения
1. Измените статус наличия товара на outofstock и убедитесь, что метаданные last_instock_date не обновляются.
2. Верните товар в наличие и проверьте, что дата обновилась в базе (через get_post_meta($product_id, 'last_instock_date', true)).
3. Для теста вручную запустите функцию delete_old_outofstock_products() через WP-CLI или временно вызовите с add_action('init', 'delete_old_outofstock_products'); и проверьте, что товары с датой наличия более 30 дней в прошлом переносятся в корзину.
Частые ошибки и как их исправить
- Дата не обновляется при смене статуса: Проверьте, что хук
woocommerce_product_set_stock_statusсрабатывает и функция корректно вызывается. - Товары не удаляются: Проверьте правильность даты в метаполе
last_instock_dateи формат сравнения в запросе. - Удаление не работает при большом количестве товаров: Разбейте удаление на чанки, чтобы избежать таймаута и нагрузок на базу.
- Потеря данных при жестком удалении: Используйте
wp_trash_postвместоwp_delete_postдля возможности восстановления.
Практические советы по безопасности и производительности
- Резервное копирование базы перед автоматическим удалением — обязательная мера.
- Для больших магазинов используйте WP-CLI для запуска удаления пакетами и мониторинга.
- Добавьте логирование удаленных товаров в отдельный лог-файл для аудита.
- Обеспечьте выполнение WP-Cron с помощью системного cron на сервере, чтобы задачи не зависали.
Сравнение подходов: плагин vs кастомный код
| Критерий | Плагин для очистки товаров | Кастомный код (описанный выше) |
|---|---|---|
| Гибкость | Ограничена настройками плагина | Полный контроль и тонкая настройка |
| Зависимости | Зависит от внешнего кода и обновлений | Минимум сторонних зависимостей |
| Производительность | Может быть тяжеловесным | Оптимизирован под задачи магазина |
| Безопасность | Зависит от качества плагина | Можно контролировать и логировать процесс |