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

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

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

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

SELECT p.ID, p.post_title, v.post_parent
FROM wp_posts p
LEFT JOIN wp_posts v ON p.ID = v.ID
WHERE p.post_type = 'product_variation'
AND p.post_status = 'trash';

Этот запрос покажет все варианты товаров в статусе «trash» — то есть удалённые, но еще не очищенные из базы.

Почему неактивные варианты остаются в базе и почему их нужно удалять

  • Загромождение базы данных: ненужные записи увеличивают размер базы, что сказывается на скорости запросов.
  • Ошибки в отображении: могут появляться варианты, которые нельзя выбрать, вызывая путаницу у покупателей.
  • Оптимизация SEO: неактивные варианты индексируются поисковыми системами, создавая дублированный контент.

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

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

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

function wpb_delete_inactive_product_variations() {
    global $wpdb;
    // Получаем ID всех вариаций в статусе trash
    $variations_to_delete = $wpdb->get_col(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_status = 'trash'"
    );

    if (empty($variations_to_delete)) {
        return;
    }

    foreach ($variations_to_delete as $variation_id) {
        wp_delete_post($variation_id, true); // true - принудительное удаление без корзины
    }
}

// Регистрируем ежедневное событие
if (!wp_next_scheduled('wpb_daily_variation_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpb_daily_variation_cleanup');
}

add_action('wpb_daily_variation_cleanup', 'wpb_delete_inactive_product_variations');

2. Проверяем работу задачи вручную

Для проверки можно вызвать функцию напрямую из админки или через WP-CLI:

wp eval 'wpb_delete_inactive_product_variations();'

Если после вызова в базе данных не останется вариантов с post_status = trash, значит задача работает корректно.

3. Автоматическое удаление вариаций с кастомным полем «неактивный»

Если у вас есть свои метаполя для отметки варианта как неактивного, добавьте проверку:

function wpb_delete_custom_inactive_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => 'is_inactive',
                'value'   => 'yes',
                'compare' => '=',
            ],
        ],
        'fields' => 'ids',
    ];

    $inactive_variations = get_posts($args);

    foreach ($inactive_variations as $variation_id) {
        wp_delete_post($variation_id, true);
    }
}

add_action('wpb_daily_variation_cleanup', 'wpb_delete_custom_inactive_variations');

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

  • В базе данных не должно остаться записей product_variation со статусом trash.
  • Для кастомных метаполей — не должно быть вариантов с меткой «неактивный».
  • Проверьте страницу редактирования товаров: неактивные варианты исчезли.
  • Запустите wp cron event list через WP-CLI и убедитесь, что событие wpb_daily_variation_cleanup запланировано.

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

  • Задача WP-Cron не запускается автоматически. Причина: отсутствие трафика на сайт или отключенный WP-Cron. Решение: настройте системный cron на сервере для вызова wp-cron.php.
  • Неправильный статус вариаций. Иногда варианты могут иметь статус draft или pending. В этом случае расширьте запрос для удаления и этих статусов.
  • Удаление не происходит из-за прав доступа. Убедитесь, что функция вызывается с достаточными правами, и что метод wp_delete_post работает корректно.

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

  • Перед удалением рекомендуем сделать бэкап базы — удаление необратимо.
  • Используйте wp_delete_post($id, true) для удаления без помещения в корзину, чтобы не накапливались мусорные записи.
  • Рассылайте уведомления администраторам о выполнении задачи с результатом, чтобы контролировать процесс.
  • Если на сайте много вариаций, разбейте удаление на порции, например по 50 штук за раз, чтобы не перегружать сервер.

Сравнение методов удаления неактивных вариантов

МетодПлюсыМинусыРекомендуется для
WP-Cron с wp_delete_postАвтоматизация, безопасное удаление, интеграция с WordPressЗависимость от WP-Cron, нагрузка при большом объемеСредние и крупные магазины
Ручной SQL-запросБыстрое удаление, контроль над запросомРиск повреждения базы, нет триггеров очисткиАдминистраторы с опытом SQL
Плагины очистки базы (например, Clearfy Pro)Удобный интерфейс, дополнительные функции оптимизацииЗависимость от стороннего плагина, возможные конфликтыПользователи, предпочитающие готовые решения
Как сделать динамические атрибуты для шорткодов в WordPress
15.01.2026
Как создать свой виджет в WordPress с примером кода
17.11.2025
Оптимизация загрузки WordPress плагинов: уменьшение времени отклика и повышение скорости сайта
03.11.2025
WooCommerce: как автоматически отключать неактивные варианты товаров
24.05.2026
Как удалить или изменить slug в WordPress без потери SEO
14.11.2025