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

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

В WooCommerce вариации товаров – это отдельные записи, которые относятся к основному товару (variable product). Иногда вариации перестают использоваться: например, их отключают через атрибуты, переводят в статус "черновик" или просто удаляют из каталога, но вариации остаются в базе. Это создает дополнительную нагрузку на базу данных, усложняет администрирование, а также может влиять на производительность сайта и корректность отображения товаров.

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

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

Для начала нужно понять, какие вариации считать неактивными. Чаще всего к ним относятся:

  • Вариации со статусом draft или private
  • Вариации, не связанные с активным товаром
  • Вариации, у которых отключены все атрибуты (например, удалены из вариаций)

Проверить статус вариаций можно с помощью SQL-запроса в базе данных или через WP-CLI:

wp post list --post_type=product_variation --post_status=draft,private,pending --fields=ID,post_title,post_status,post_parent

Также важно убедиться, что родительский товар вариации существует и опубликован:

SELECT p.ID, p.post_title, v.ID as variation_id, v.post_status FROM wp_posts v LEFT JOIN wp_posts p ON v.post_parent = p.ID WHERE v.post_type = 'product_variation' AND (v.post_status IN ('draft','private') OR p.post_status != 'publish');

Решение: как автоматически удалять неактивные вариации с помощью PHP-кода

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

1. Функция удаления неактивных вариаций

function wpg_delete_inactive_variations() {
    $args = [
        'post_type' => 'product_variation',
        'post_status' => ['draft', 'private', 'pending'],
        'numberposts' => -1
    ];
    $variations = get_posts($args);
    $deleted_count = 0;

    foreach ($variations as $variation) {
        $parent = get_post($variation->post_parent);
        // Удаляем вариацию если родитель не опубликован или отсутствует
        if (!$parent || $parent->post_status !== 'publish') {
            wp_delete_post($variation->ID, true);
            $deleted_count++;
            continue;
        }

        // Проверяем, есть ли у вариации атрибуты
        $variation_attributes = wc_get_product($variation->ID)->get_attributes();
        if (empty($variation_attributes)) {
            wp_delete_post($variation->ID, true);
            $deleted_count++;
        }
    }
    error_log("Удалено неактивных вариаций: " . $deleted_count);
}

2. Регистрация WP-Cron для запуска функции ежедневно

add_action('wpg_daily_cleanup', 'wpg_delete_inactive_variations');

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

3. Ручной запуск для проверки

Для проверки функции можно вызвать её вручную в админке, например, через файл functions.php или плагин для вставки кода:

if (current_user_can('administrator')) {
    wpg_delete_inactive_variations();
}

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

Чтобы удостовериться, что функция сработала:

  • Посмотрите логи PHP (error_log), где будет выведено количество удалённых вариаций.
  • Проверьте в админке WooCommerce раздел "Вариации" у товаров – неактивные вариации должны исчезнуть.
  • Запустите WP-CLI запрос для проверки количества вариаций с неактивным статусом:
wp post list --post_type=product_variation --post_status=draft,private,pending --format=count

Если число равно нулю или минимально, значит очистка прошла успешно.

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

  • WP-Cron не запускается: на некоторых хостингах WP-Cron работает только при посещении сайта. Для надежной работы настройте системный cron (пример для Linux): wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Удаляются нужные вариации: проверьте условия удаления в функции, убедитесь, что неактивные вариации определяются корректно (статус, родитель и атрибуты)
  • Слишком долгий запрос и таймауты: если вариаций много, разбейте удаление на порции, например, с помощью параметра posts_per_page и пагинации

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

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

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, контрольЗатратно по времени, риск пропуска вариаций
Плагины очистки WooCommerceАвтоматизация, часто с удобным интерфейсомДополнительная нагрузка, возможны конфликты
Кастомный код с WP-Cron (предложенный способ)Гибкость, отсутствие зависимости от плагинов, полная настройкаТребует навыков программирования, нужно контролировать WP-Cron
Автоматическое создание категорий в WordPress с помощью кода
20.03.2026
Как автоматически удалять неиспользуемые категории в WordPress
31.01.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров с помощью кода
01.07.2026
Как автоматически изменять заголовки и метаданные для SEO в WordPress
14.01.2026
Автоматическое отключение плагинов в WordPress по расписанию
16.04.2026