Диагностика проблемы с отсутствующими товарами в WooCommerce
Отсутствующие товары в WooCommerce — это товары, у которых установлен статус «нет в наличии» (stock status – out of stock) и которые не предполагается пополнять. Такие товары могут засорять каталог и ухудшать пользовательский опыт, а также негативно влиять на SEO и производительность сайта. Особенно актуально для крупных магазинов с тысячами товаров.
Чтобы понять, есть ли на вашем сайте подобные товары, выполните запрос в базе данных или воспользуйтесь административной панелью WooCommerce, отфильтровав товары по статусу наличия.
Пример запроса для диагностики отсутствующих товаров через WP-CLI:
wp post list --post_type=product --meta_key=_stock_status --meta_value=outofstock --fields=ID,post_title --format=tableЕсли количество таких товаров значительное и они не планируются к пополнению, имеет смысл автоматизировать их удаление.
Пошаговое решение: автоматическое удаление отсутствующих товаров по расписанию
Для реализации задачи воспользуемся встроенным планировщиком WordPress (WP-Cron) и функциями WooCommerce для выборки и удаления продуктов.
1. Создание функции удаления товаров со статусом "outofstock"
function wpdirect_delete_outofstock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_key' => '_stock_status',
'meta_value' => 'outofstock',
'fields' => 'ids',
'post_status' => 'publish',
];
$products = get_posts($args);
if (empty($products)) {
return;
}
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // true - удаление без отправки в корзину
}
}2. Регистрация задачи в WP-Cron
Добавим в файл functions.php вашей темы или в кастомный плагин следующий код:
if (! wp_next_scheduled('wpdirect_cron_delete_outofstock')) {
wp_schedule_event(time(), 'daily', 'wpdirect_cron_delete_outofstock');
}
add_action('wpdirect_cron_delete_outofstock', 'wpdirect_delete_outofstock_products');Этот код запланирует ежедневное выполнение функции удаления.
Проверка результата после внедрения
- Выполните запрос через WP-CLI:
wp post list --post_type=product --meta_key=_stock_status --meta_value=outofstockи убедитесь, что товары отсутствуют. - Проверьте раздел «Товары» в админке WooCommerce, фильтруя по статусу наличия "Нет в наличии" — таких товаров не должно быть.
- Для срочной проверки можно запустить функцию вручную, добавив временный вызов
wpdirect_delete_outofstock_products();вfunctions.phpи обновив страницу.
Частые ошибки и как их исправить
- Запланированное событие не срабатывает: WP-Cron требует посещения сайта для выполнения задач. Решение — настроить системный cron на сервере, который вызывает
wp-cron.phpрегулярно. - Удаление не происходит: Проверьте права пользователя, под которым работает WordPress, и статус товаров (они должны быть опубликованы).
- Функция удаляет больше товаров, чем нужно: Убедитесь, что фильтр по мета-ключу
_stock_statusи значениюoutofstockкорректен. Можно добавить дополнительную проверку, например, по дате последнего обновления или категории.
Практические советы по безопасности и производительности
- Перед массовым удалением создайте резервную копию базы данных.
- Если товаров много, удаляйте партиями с помощью параметра
posts_per_pageи циклов, чтобы избежать превышения лимита памяти или времени выполнения. - Для надежности используйте системный cron вместо WP-Cron.
- Логируйте выполнение задач, чтобы отслеживать успешные и неудачные операции.
Чек-лист для внедрения автоматического удаления отсутствующих товаров:
- Проверить наличие товаров со статусом
outofstock. - Добавить функцию удаления в
functions.phpили плагин. - Настроить WP-Cron на ежедневный запуск задачи.
- Проверить работу WP-Cron или настроить системный cron.
- Протестировать функцию вручную для контроля.
- Настроить логирование и мониторинг выполнения.
- Обеспечить резервное копирование до запуска.
Сравнение вариантов решения
| Вариант | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| WP-Cron с функцией удаления | Простота реализации, не требует доступа к серверу | Зависит от посещаемости сайта, возможны задержки | Маленькие и средние сайты, ограниченный доступ к серверу |
| Системный cron + WP-CLI скрипт | Надежность, точность исполнения, подходит для больших сайтов | Требует доступа к серверу, настройку cron | Крупные магазины, высокая нагрузка |
| Плагины для управления удалением | Готовые интерфейсы, дополнительные настройки | Зависимость от стороннего кода, возможная нагрузка | Для пользователей без навыков программирования |