Диагностика проблемы: зачем автоматически удалять товары в WooCommerce
В больших магазинах на WooCommerce часто накапливаются товары с нулевым остатком или без заданных атрибутов и вариаций. Такие позиции неактуальны и могут мешать навигации покупателям, снижать конверсию и увеличивать нагрузку на базу данных. Автоматизация удаления таких товаров поможет поддерживать каталог в актуальном состоянии без постоянного ручного контроля.
Какие товары стоит автоматически удалять
- Товары с остатком 0 (stock_quantity <= 0) и отключенным управлением запасами (manage_stock = true)
- Простые товары без атрибутов и вариаций (simple products без атрибутов)
- Вариации товаров с нулевым остатком и без назначенных атрибутов
Автоматическое удаление следует настроить с учётом статусов заказа — не удалять товары, связанные с активными заказами.
Пошаговое решение: код для автоматического удаления товаров
1. Создаем WP-Cron задачу для регулярной проверки товаров
add_action('wp', 'setup_daily_product_cleanup_cron');
function setup_daily_product_cleanup_cron() {
if (!wp_next_scheduled('daily_product_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'daily_product_cleanup_event');
}
}2. Обработчик очистки товаров
add_action('daily_product_cleanup_event', 'delete_low_stock_and_attribute_less_products');
function delete_low_stock_and_attribute_less_products() {
$args = [
'post_type' => ['product', 'product_variation'],
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
[
'key' => '_manage_stock',
'value' => 'yes',
],
],
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
$product = wc_get_product($product_id);
// Проверка на атрибуты для простых товаров
if ($product->is_type('simple')) {
$attributes = $product->get_attributes();
if (empty($attributes)) {
wp_delete_post($product_id, true); // Удаляем без возможности восстановления
}
} elseif ($product->is_type('variable')) {
// Удаление вариаций без атрибутов и с нулевым остатком
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation->get_stock_quantity() <= 0) {
$variation_attributes = $variation->get_attributes();
if (empty($variation_attributes)) {
wp_delete_post($variation_id, true);
}
}
}
}
}
}Как проверить, что функция работает
- Включите отладку: добавьте
error_logс выводом количества удалённых товаров внутрь функции. - Запустите cron вручную через wp-cli:
wp cron event run daily_product_cleanup_event. - Проверьте базу данных — удалённые товары должны исчезнуть из таблицы
wp_posts. - Проверьте фронтенд — товары с нулевым остатком и без атрибутов не должны отображаться.
Частые ошибки и как их исправить
- Удаление нужных товаров: функция не учитывает связанные заказы — добавьте проверку, что товар не используется в активных заказах (
wc_get_ordersс фильтром по продуктам). - Удаление не срабатывает: убедитесь, что cron запускается (используйте плагин WP Crontrol для диагностики).
- Удаление вариаций не происходит: проверьте, что в запросе указаны оба типа post_type:
productиproduct_variation. - Потеря данных при удалении: используйте
wp_delete_postс параметромtrueдля полного удаления, иначе товар попадёт в корзину.
Практические советы по безопасности и производительности
- Для больших магазинов разбивайте удаление на партии (например, по 50 товаров за раз), чтобы избежать превышения лимитов памяти и времени выполнения.
- Создавайте резервные копии базы перед автоматическими удалениями.
- Используйте транзиенты для кеширования результатов и снижения нагрузки.
- Проверяйте права пользователя при запуске функции, если запускаете вручную.
Сравнение методов удаления товаров с нулевым остатком и без атрибутов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Полный контроль, простота | Неэффективно для больших магазинов | Малые магазины или разовые операции |
| Плагины очистки (например, WP Sweep, Clearfy Pro) | Автоматизация, дополнительные функции | Зависимость от стороннего кода, возможные конфликты | Средние магазины, дополнительная оптимизация |
| Кастомный WP-Cron скрипт (как в статье) | Полный контроль, гибкость, интеграция с бизнес-логикой | Требует навыков программирования, ответственность за тестирование | Крупные проекты с уникальными требованиями |