WooCommerce: автоматическое отключение неиспользуемых вариантов товаров

Что значит «неиспользуемые варианты товаров» в WooCommerce и зачем их отключать?

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

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

Проверьте наличие вариантов с нулевым запасом и статусом «опубликовано». Для этого достаточно SQL-запроса или использования WP-CLI:

wp db query "SELECT p.ID, pm.meta_value as stock_status FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock';"

Если таких вариантов много и они мешают работе — пора автоматизировать их отключение.

Пошаговое решение: как автоматически отключать неиспользуемые варианты товаров

1. Добавляем функцию в functions.php или собственный плагин

Функция проверяет варианты с запасом 0 и статусом "в наличии", и меняет их статус на "черновик" или "отключено".

function disable_unused_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'post_status'    => 'publish',
    ];

    $variations = get_posts($args);

    foreach ($variations as $variation) {
        // Меняем статус вариации на черновик
        wp_update_post([
            'ID'          => $variation->ID,
            'post_status' => 'draft',
        ]);
    }
}

// Запускаем функцию по крону или вручную
add_action('wp_loaded', 'disable_unused_variations');

2. Автоматизация с помощью WP-Cron

Чтобы запускать функцию регулярно, добавим хук WP-Cron. Например, раз в сутки:

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

add_action('disable_unused_variations_daily', 'disable_unused_variations');

3. Проверка и отмена расписания при необходимости

function unschedule_disable_variations() {
    $timestamp = wp_next_scheduled('disable_unused_variations_daily');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'disable_unused_variations_daily');
    }
}

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

  • Зайдите в админку WooCommerce → Товары → Вариации, фильтруйте по статусу "Опубликовано" и "Черновик".
  • Убедитесь, что варианты с нулевым запасом теперь в статусе "черновик" и не отображаются в каталоге.
  • Проверьте на сайте, что такие варианты не доступны для выбора покупателями.
  • Для дополнительной проверки выполните SQL-запрос из раздела диагностики и убедитесь, что нет опубликованных вариантов с "outofstock".

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

  • Функция не срабатывает при запуске WP-Cron: проверьте, включен ли WP-Cron (опция DISABLE_WP_CRON не должна быть true), убедитесь, что вызов хука совпадает с зарегистрированным.
  • Варианты не меняют статус: проверьте права пользователя, от имени которого выполняется функция, и нет ли ошибок в wp_update_post (например, неверный ID).
  • Варианты с наличием остаются в статусе "черновик": убедитесь, что метаполе _stock_status корректно отражает наличие товара.

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

  • Для больших магазинов с тысячами вариантов используйте пагинацию в запросах, чтобы не перегружать сервер:
$paged = 1;
do {
    $args['paged'] = $paged;
    $variations = get_posts($args);
    // обработка вариаций
    $paged++;
} while (!empty($variations));
  • Включите логирование ошибок в функцию, чтобы отслеживать сбои.
  • Ограничьте запуск функции на время низкой нагрузки сайта.
  • Для контроля используйте Clearfy Pro от WPShop для оптимизации и мониторинга базы данных.

Сравнение вариантов реализации автоматического отключения

МетодПлюсыМинусы
Код в functions.phpБыстрая реализация, контроль в кодеРиск при обновлении темы, требует навыков
Отдельный плагинЛегко деактивировать, переносимостьНужно писать плагин, обновлять
Плагины сторонних разработчиковГотовое решение, поддержкаМогут быть избыточными, нагрузка
Как сделать динамические варианты в выборах форм в WordPress
17.04.2026
Как создать динамические карты сайта в WordPress с помощью плагинов и кода
14.03.2026
WooCommerce: как автоматически изменять стоимость товаров при накопительных скидках
24.07.2026
Как создать и использовать AJAX в WordPress: подробное руководство с примерами
17.11.2025
Как создать автоматическое сохранение данных в WordPress с помощью AJAX и плагинов
03.01.2026