WooCommerce: автоматическое удаление товаров при нулевом остатке и без вариаций

Диагностика проблемы: зачем удалять товары с нулевым остатком и без вариаций

Магазины на WooCommerce часто сталкиваются с накоплением товаров, которые неактивны из-за отсутствия остатков или отсутствия вариаций и атрибутов, особенно при использовании вариативных товаров. Это снижает производительность сайта, усложняет администрирование и может негативно влиять на SEO, если такие страницы индексируются.

Основные признаки проблемы:

  • В каталоге много товаров с количеством на складе 0.
  • Некоторые товары вариативные, но без активных вариаций.
  • Администраторы тратят время на ручное удаление устаревших товаров.

Как проверить наличие товаров без вариаций и с нулевым остатком

Для диагностики используйте следующий SQL-запрос, который поможет выявить такие товары в базе данных:

SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_wc_product_meta_lookup pm ON p.ID = pm.product_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND pm.stock_quantity <= 0
AND p.ID NOT IN (
    SELECT post_parent FROM wp_posts
    WHERE post_type = 'product_variation'
);

Данный запрос выводит опубликованные товары с нулевым или отрицательным остатком, у которых нет дочерних вариаций.

Пошаговое решение: автоматизация удаления товаров при нулевом остатке и без вариаций

1. Создание функции для удаления товаров

Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код:

function wpdir_delete_out_of_stock_simple_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ),
        ),
        'fields'         => 'ids',
        'tax_query'      => array(
            array(
                'taxonomy' => 'product_type',
                'field'    => 'slug',
                'terms'    => 'simple',
            ),
        ),
    );

    $products = get_posts($args);
    foreach ($products as $product_id) {
        // Проверяем наличие вариаций
        $variations = new WP_Query(array(
            'post_parent'    => $product_id,
            'post_type'      => 'product_variation',
            'posts_per_page' => 1,
            'fields'         => 'ids',
        ));

        if (!$variations->have_posts()) {
            wp_delete_post($product_id, true); // Удаляем без возможности восстановления
        }
    }
}

2. Настройка планировщика для регулярного запуска

Чтобы функция запускалась автоматически, добавьте WP-Cron задачу:

if (!wp_next_scheduled('wpdir_delete_out_of_stock_simple_products_hook')) {
    wp_schedule_event(time(), 'daily', 'wpdir_delete_out_of_stock_simple_products_hook');
}

add_action('wpdir_delete_out_of_stock_simple_products_hook', 'wpdir_delete_out_of_stock_simple_products');

Это обеспечит ежедневную проверку и удаление товаров.

Проверка результата после внедрения

Для проверки:

  1. Создайте тестовый простой товар с нулевым остатком и без вариаций.
  2. Убедитесь, что он опубликован.
  3. Запустите функцию вручную (например, вызвав wpdir_delete_out_of_stock_simple_products(); через админ-панель или подключив скрипт).
  4. Проверьте, что товар удалён из админки и frontend каталога.

Частые ошибки и способы их устранения

  • Функция не запускается автоматически
    Проверьте, активирован ли WP-Cron, и есть ли посещения сайта, запускающие задачи. Для теста вызовите функцию вручную.
  • Удаляются товары с вариациями
    Проверьте условие проверки дочерних вариаций. Запрос WP_Query должен корректно искать вариации по post_parent.
  • Удаление не происходит из-за кеширования
    Очистите кеш сайта и кэширующих плагинов после внедрения кода.

Практические советы по безопасности и производительности

  • Всегда делайте резервные копии базы перед автоматическим удалением.
  • Для больших магазинов используйте постраничную обработку (pagination) при выборке товаров, чтобы избежать превышения лимитов памяти.
  • При необходимости добавьте логирование удалённых товаров для аудита.
  • Если вы не уверены, сначала меняйте статус товара на draft вместо удаления, чтобы проверить процесс.
  • Для более точной очистки рассмотрите использование плагина Clearfy Pro — он помогает оптимизировать WooCommerce и автоматически удалять мусорные данные.

Сравнение способов удаления товаров с нулевым остатком и без вариаций

МетодПлюсыМинусы
Ручное удалениеПолный контрольТрудозатратно, риск забыть
WP-Cron с кастомным кодомАвтоматизация, гибкостьНужны навыки программирования, возможны ошибки в логике
Плагины (например, Clearfy Pro)Удобство, дополнительные функцииМогут быть платными, лишние зависимости
WooCommerce: автоматическое удаление товаров при нулевом остатке и без вариаций
15.06.2026
WooCommerce: автоматическое удаление неактивных товаров по дате последнего изменения
02.05.2026
Как создать уникальный Metabox в WordPress с примером кода
23.12.2025
WooCommerce: установка и настройка подтверждения возврата товара
30.05.2026
WooCommerce: как автоматически удалять товары при нулевом остатке
23.05.2026