Диагностика проблемы отсутствующих товаров в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются товары, которых нет в наличии или которые устарели и не будут возвращены. Это мешает управлению каталогом, снижает удобство для клиентов и может негативно влиять на SEO. Часто такие товары остаются в базе по ошибке или из-за отсутствия процесса их очистки.
Чтобы определить, есть ли в вашем магазине такие товары, выполните запрос в базе данных или используйте административный интерфейс:
SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product' AND post_status != 'trash';Далее проверьте наличие запасов у этих товаров (мета-ключ _stock_status или _stock). Отсутствующие товары обычно имеют статус outofstock или нулевой запас.
Почему важно автоматизировать удаление отсутствующих товаров
- Уменьшается размер базы данных и ускоряется загрузка страниц.
- Улучшение навигации и пользовательского опыта.
- Снижение риска ошибок в заказах и отчетах.
- Оптимизация SEO за счет удаления неактуальных страниц.
Пошаговое решение: как автоматически удалять отсутствующие товары по расписанию
1. Создаём WP-Cron задачу
WordPress позволяет запускать задачи по расписанию с помощью WP-Cron. Создадим задачу, которая будет запускаться, например, раз в сутки, и будет удалять товары с нулевым запасом.
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wpdirect_delete_outofstock_products')) {
wp_schedule_event(time(), 'daily', 'wpdirect_delete_outofstock_products');
}
});2. Реализуем функцию удаления товаров
Функция должна искать товары с мета-ключом _stock_status равным outofstock и удалять их программно с помощью wp_delete_post.
add_action('wpdirect_delete_outofstock_products', function() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_key' => '_stock_status',
'meta_value' => 'outofstock',
'fields' => 'ids',
'post_status' => ['publish', 'private', 'draft']
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
return;
}
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true — удаление без перемещения в корзину
}
});3. Добавляем уведомление в лог (опционально)
Для отладки и контроля полезно вести лог удалённых товаров.
add_action('wpdirect_delete_outofstock_products', function() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_key' => '_stock_status',
'meta_value' => 'outofstock',
'fields' => 'ids',
'post_status' => ['publish', 'private', 'draft']
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
error_log('WPDirect: Нет товаров для удаления.');
return;
}
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true);
error_log('WPDirect: Удалён товар ID ' . $product_id);
}
});Проверка результата после внедрения
- Убедитесь, что в базе данных больше нет товаров с
_stock_status = outofstock. Проверьте через phpMyAdmin или WP_Query. - Проверьте логи ошибок сервера или
debug.logWordPress (если включён) на наличие записей об удалении. - Проверьте, что запланированная задача существует и запускается:
wp cron event list(через WP-CLI) или плагин WP Crontrol.
Частые ошибки и как их исправить
- Задача не запускается: WP-Cron запускается только при посещениях сайта. Для гарантированной работы настройте системный cron на сервере:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1. - Товары не удаляются: Проверьте правильность мета-ключа и значения. В WooCommerce иногда используются другие поля или кастомные статусы.
- Удаление без подтверждения: Используйте второй параметр
trueвwp_delete_post, чтобы обойти корзину и полностью удалить товар. - Проблемы с правами: Код должен работать в контексте администратора или с достаточными правами, чтобы удалять посты.
Практические советы по безопасности и производительности
- Перед удалением делайте резервную копию базы данных.
- Ограничьте количество удаляемых товаров за один запуск, если база очень большая, чтобы избежать таймаутов.
- Используйте
transientили опции для контроля состояния задачи и избежать повторного удаления одних и тех же товаров. - Логируйте действия в отдельный файл или в системный журнал, чтобы отслеживать выполнение.
Сравнение способов удаления отсутствующих товаров
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| Удаление вручную | — | — | Трудозатратно, риск ошибок, не масштабируемо |
| Плагин очистки каталога | Да (например, "WooCommerce Bulk Stock Management") | — | Простота, но нагрузка на сайт, часто платные |
| Автоматизация через код | — | WP-Cron + wp_delete_post | Гибко, бесплатно, требует навыков и тестирования |
Чек-лист для внедрения автоматического удаления товаров
- Определить критерии отсутствия товара (например,
_stock_status = outofstock). - Написать функцию для выборки и удаления товаров.
- Создать WP-Cron задачу для регулярного запуска.
- Настроить системный cron для надёжности (опционально).
- Внедрить логирование удаления.
- Провести тестирование на staging-сайте.
- Сделать резервную копию базы перед запуском на продакшене.