WooCommerce: автоматическое удаление неактивных вариаций товаров

Почему важно удалять неактивные вариации товаров в WooCommerce

В WooCommerce при управлении товарами с вариациями часто накапливаются неактивные (отключённые) вариации, которые не продаются и не отображаются на сайте. Они занимают место в базе данных, замедляют загрузку страниц товара и усложняют администрирование каталога. Автоматизация удаления таких вариаций помогает поддерживать чистоту данных и оптимизировать работу магазина.

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

Неактивные вариации имеют статус private или draft, либо отключены через поле menu_order или пользовательские мета-данные. Чаще всего статус вариации задаётся как publish, но она может иметь мета-ключ _stock_status равный outofstock или мета _manage_stock равный yes и количество на складе 0 – такие вариации тоже можно считать неактивными.

Чтобы проверить наличие неактивных вариаций, используйте SQL-запрос к базе данных:

SELECT p.ID, p.post_status FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND (p.post_status != 'publish' OR pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock');

Также можно вывести список в админке с помощью WP-CLI:

wp post list --post_type=product_variation --field=ID,post_status --meta_key=_stock_status --meta_value=outofstock

Пошаговое решение: автоматическое удаление неактивных вариаций

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

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

function wponline_delete_inactive_variations() {
    $args = [
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'post_status' => ['draft', 'private', 'trash', 'publish'],
        'meta_query' => [
            'relation' => 'OR',
            [
                'key' => '_stock_status',
                'value' => 'outofstock',
                'compare' => '=',
            ],
            [
                'key' => '_manage_stock',
                'value' => 'yes',
                'compare' => '=',
            ],
        ],
    ];

    $variations = get_posts($args);

    foreach ($variations as $variation) {
        $stock_qty = get_post_meta($variation->ID, '_stock', true);
        $stock_status = get_post_meta($variation->ID, '_stock_status', true);

        // Удаляем вариации с нулевым остатком и статусом outofstock, а также черновики и приватные
        if ($variation->post_status !== 'publish' || ($stock_status === 'outofstock' && (int)$stock_qty <= 0)) {
            wp_delete_post($variation->ID, true); // Принудительное удаление
        }
    }
}

2. Запуск функции по расписанию с WP-Cron

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

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

add_action('wponline_delete_variations_cron', 'wponline_delete_inactive_variations');

3. Очистка и логирование

Для контроля можно добавить логирование удалённых вариаций в файл:

function wponline_delete_inactive_variations() {
    $args = [/* как выше */];
    $variations = get_posts($args);
    $log_file = WP_CONTENT_DIR . '/inactive_variations.log';

    foreach ($variations as $variation) {
        $stock_qty = get_post_meta($variation->ID, '_stock', true);
        $stock_status = get_post_meta($variation->ID, '_stock_status', true);

        if ($variation->post_status !== 'publish' || ($stock_status === 'outofstock' && (int)$stock_qty <= 0)) {
            wp_delete_post($variation->ID, true);
            file_put_contents($log_file, date('Y-m-d H:i:s') . " - Deleted variation ID: {$variation->ID}\n", FILE_APPEND);
        }
    }
}

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

  • Перейдите в админку WooCommerce → Товары → Вариации, проверьте отсутствие неактивных вариантов.
  • Запустите функцию вручную через WP-CLI: wp eval 'wponline_delete_inactive_variations();' и проверьте лог в wp-content/inactive_variations.log.
  • Проверьте нагрузку на базу данных и скорость загрузки страниц товаров с вариациями.

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

  • Удаление активных вариаций: Неправильный фильтр по статусу или мета-данным может удалить нужные вариации. Проверяйте условия в запросе до запуска.
  • Функция не запускается по расписанию: WP-Cron зависит от посещений сайта. Для теста используйте прямой вызов функции или настройте системный cron на вызов wp-cron.php.
  • Потеря данных при удалении: Делайте бэкапы перед внедрением автоматического удаления.

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

  • Выносите подобный код в отдельный кастомный плагин, чтобы не потерять при обновлении темы.
  • Ограничивайте количество обрабатываемых вариаций за один запуск (например, 50 в запросе), чтобы избежать таймаутов сервера.
  • Добавьте nonce и проверки прав, если планируете запускать функцию через интерфейс администратора.
  • Для больших магазинов используйте WP-CLI скрипты для пакетной очистки без нагрузки на веб-сервер.

Сравнение вариантов очистки неактивных вариаций

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПростота, контрольЗатратно по времени, риск пропуститьПодходит для небольших магазинов
Автоматическое удаление через WP-Cron + кодАвтоматизация, регулярностьТребует тестирования, возможны ошибкиЛучший выбор для средних и больших магазинов
Плагины для очистки WooCommerceУдобный UI, расширенный функционалМожет замедлять сайт, зависит от поддержкиИспользовать с осторожностью, проверять совместимость
WooCommerce: автоматическое изменение стоимости товаров при определённых условиях
09.05.2026
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
16.06.2026
Как добавить автоматическое удаление старого контента в WordPress
01.04.2026
Как избежать проблем с кэшированием при разработке в WordPress
13.07.2026
Как использовать MetaBox для создания собственных пользовательских полей в WordPress
05.04.2026