Диагностика проблемы с отсутствующими товарами в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары долго отсутствуют на складе, но остаются в каталоге. Это негативно влияет на UX, SEO и приводит к снижению конверсии. Следует определить, какие товары считаются «отсутствующими» для автоматического удаления или архивирования.
Как определить «отсутствующий товар»?
Отсутствующий товар — это товар с нулевым запасом _stock и статусом управления запасами manage_stock = yes. Можно дополнительно учитывать дату последнего обновления или статус видимости товара.
Диагностика через базу данных и админку
- В админке WooCommerce перейдите в Товары и отфильтруйте по статусу запасов.
- Через phpMyAdmin выполните запрос для поиска товаров с нулевым запасом:
SELECT ID, post_title, meta_value as stock FROM wp_posts p
JOIN wp_postmeta pm_stock ON p.ID = pm_stock.post_id AND pm_stock.meta_key = '_stock'
JOIN wp_postmeta pm_manage ON p.ID = pm_manage.post_id AND pm_manage.meta_key = '_manage_stock'
WHERE pm_manage.meta_value = 'yes' AND pm_stock.meta_value = '0' AND p.post_type = 'product';Это поможет проверить, какие товары можно считать для автоматического удаления.
Пошаговое решение: автоматическое удаление отсутствующих товаров
1. Создаем функцию удаления
Добавим в файл functions.php темы или в отдельный плагин код, который будет удалять товары с нулевым запасом старше 30 дней.
function wpstuff_delete_out_of_stock_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_manage_stock',
'value' => 'yes',
),
array(
'key' => '_stock',
'value' => '0',
'compare' => '='
),
),
'date_query' => array(
array(
'column' => 'post_modified_gmt',
'before' => '30 days ago',
),
),
'fields' => 'ids',
);
$products = get_posts($args);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // true — принудительное удаление без корзины
}
}2. Запускаем функцию по расписанию (WP-Cron)
Чтобы автоматизировать процесс, добавим событие в WP-Cron, которое будет запускать функцию раз в сутки.
function wpstuff_schedule_delete_event() {
if (!wp_next_scheduled('wpstuff_daily_delete_out_of_stock')) {
wp_schedule_event(time(), 'daily', 'wpstuff_daily_delete_out_of_stock');
}
}
add_action('wp', 'wpstuff_schedule_delete_event');
add_action('wpstuff_daily_delete_out_of_stock', 'wpstuff_delete_out_of_stock_products');Проверка результата после внедрения
- В админке WooCommerce проверьте список товаров с нулевым запасом старше 30 дней — они должны исчезнуть после запуска события.
- Для теста можно временно изменить период в условии
'before' => '1 day ago'или вызвать функцию вручную:
wpstuff_delete_out_of_stock_products();Частые ошибки и как их исправить
- Функция не запускается по расписанию: убедитесь, что WP-Cron работает (например, посетите сайт, чтобы активировать cron). Можно заменить WP-Cron на системный cron для надежности.
- Удаляются товары, которые не нужно удалять: проверьте корректность условий в
meta_queryиdate_query, особенно дату последнего обновления. - Проблемы с правами: функция
wp_delete_postтребует прав администратора или соответствующих ролей. Запуск из WP-Cron выполняется от имени сервера.
Практические советы по безопасности и производительности
- Перед удалением товаров создавайте резервную копию базы данных.
- Для больших магазинов с тысячами товаров делайте удаление пакетами, например, по 50 товаров за один запуск, чтобы не нагружать сервер.
- Добавьте логирование удалений в отдельный файл для аудита и восстановления при необходимости.
- Если используется кэширование (например, Object Cache, Redis), очищайте кэш после удаления товаров.
Сравнение способов автоматического удаления отсутствующих товаров
| Способ | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WP Bulk Delete) | Простота, интерфейс настройки, безопасность | Ограниченная кастомизация, может нагружать базу |
| Собственный код с WP-Cron | Гибкость, точечное управление, масштабируемость | Требует навыков, нужно тестировать и отлаживать |
| Ручное удаление через админку | Простота, полный контроль | Трудозатратно при большом количестве товаров |