WooCommerce: как автоматически удалять товары с отсутствующими вариантами

Диагностика проблемы отсутствующих вариантов товаров в WooCommerce

В WooCommerce часто возникают ситуации, когда у товаров с вариациями отсутствуют все варианты — например, после импорта данных или массового редактирования. Такие товары становятся «пустыми» с точки зрения покупателя: они отображаются в каталоге, но не имеют доступных для выбора вариантов, что ухудшает UX и может снизить конверсию.

Чтобы убедиться, что у товара действительно отсутствуют варианты, можно проверить их количество программно:

global $product;
if ( $product->is_type('variable') ) {
    $available_variations = $product->get_available_variations();
    if ( empty($available_variations) ) {
        // Вариантов нет
    }
}

Если таких товаров много, ручное удаление неудобно и требует автоматизации.

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

1. Создание WP-CLI команды для поиска и удаления товаров без доступных вариантов

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

if ( defined('WP_CLI') && WP_CLI ) {
    WP_CLI::add_command('wc-remove-empty-variables', function() {
        $args = [
            'post_type'      => 'product',
            'posts_per_page' => -1,
            'meta_query'     => [
                [
                    'key'     => '_product_type',
                    'value'   => 'variable'
                ]
            ]
        ];
        $query = new WP_Query($args);
        $deleted = 0;
        foreach ($query->posts as $post) {
            $product = wc_get_product($post->ID);
            if ( $product->is_type('variable') ) {
                $variations = $product->get_available_variations();
                if ( empty($variations) ) {
                    wp_delete_post($post->ID, true);
                    $deleted++;
                }
            }
        }
        WP_CLI::success("Удалено товаров без вариантов: $deleted");
    });
}

Сохраните этот код в файле плагина или в functions.php темы (рекомендуется использовать плагин). Запуск команды:

wp wc-remove-empty-variables

2. Автоматизация удаления через WP-Cron

Для регулярного удаления можно добавить задачу в WP-Cron:

function wc_schedule_remove_empty_variable_products() {
    if ( ! wp_next_scheduled( 'wc_remove_empty_variable_products_event' ) ) {
        wp_schedule_event( time(), 'daily', 'wc_remove_empty_variable_products_event' );
    }
}
add_action( 'wp', 'wc_schedule_remove_empty_variable_products' );

add_action( 'wc_remove_empty_variable_products_event', function() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_product_type',
                'value'   => 'variable'
            ]
        ]
    ];
    $query = new WP_Query($args);
    foreach ( $query->posts as $post ) {
        $product = wc_get_product($post->ID);
        if ( $product->is_type('variable') && empty($product->get_available_variations()) ) {
            wp_delete_post($post->ID, true);
        }
    }
});

Такое решение позволит автоматически поддерживать базу товаров в чистоте без ручного вмешательства.

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

  • Запустите WP-CLI команду вручную и убедитесь, что в ответе указано количество удалённых товаров.
  • Откройте админку WooCommerce, проверьте, что товары без вариантов исчезли из списка.
  • На фронтенде убедитесь, что в каталоге не отображаются товары с отсутствующими вариантами.
  • Для WP-Cron проверьте, что задача в расписании имеется: wp cron event list.

Частые ошибки и как их исправить

  • Ошибка: Команда WP-CLI не срабатывает.
    Причина: WP-CLI не установлен или код не загружается.
    Решение: Проверьте наличие WP-CLI, загрузку плагина с командой и используйте wp plugin list.
  • Ошибка: Товары не удаляются, хотя у них нет вариантов.
    Причина: Неверный способ проверки вариаций.
    Решение: Убедитесь, что вызывается $product->get_available_variations() и возвращается пустой массив.
  • Ошибка: Удаление не происходит при запуске WP-Cron.
    Причина: WP-Cron отключён или событие не запланировано.
    Решение: Проверьте наличие события через wp cron event list и включите WP-Cron.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Используйте wp_delete_post($post_id, true), чтобы удалить товар без помещения в корзину, экономя место.
  • Для больших магазинов с тысячами товаров добавьте пагинацию в WP_Query, чтобы избежать превышения лимита памяти.
  • Внедрите логирование удалений в отдельный файл для аудита.
  • Ограничьте запуск WP-Cron с помощью DISABLE_WP_CRON и настройте системный cron для стабильности.

Сравнение способов удаления товаров без вариантов

МетодПлюсыМинусы
Ручное удаление через админкуПросто, без кодаМедленно, не для массовых операций
WP-CLI командаБыстро, удобно для разработчиковТребует доступа к серверу и знания WP-CLI
WP-Cron автоматизацияАвтоматически поддерживает базу чистойЗависит от корректной работы WP-Cron
WooCommerce: как автоматизировать удаление старых заказов и их очистку
20.06.2026
Жесткая фильтрация входящих данных в WordPress: практические методы и примеры
09.12.2025
Как избежать размытых изображений в WordPress: практическое руководство
29.01.2026
Как установить и настроить PHP Redis для ускорения WordPress
05.01.2026
Автоматическое создание резервных копий WordPress: настройка и лучшие плагины
30.11.2025