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

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

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

Как определить неактивные вариации?

  • Вариации, которые не связаны с активными товарами (родительскими продуктами);
  • Вариации без атрибутов или с пустыми значениями;
  • Вариации, дата последнего обновления которых старше определённого периода (например, 6 месяцев);
  • Вариации, которые не отображаются на фронтенде (статус «черновик» или «отменено»).

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

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

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

function wpcore_delete_old_inactive_variations() {
    global $wpdb;
    $days_threshold = 180; // количество дней, после которых вариации считаются устаревшими
    $date_limit = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));

    // Получаем ID вариаций, где дата обновления старше $date_limit и статус не опубликован
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_modified < %s AND post_status != 'publish'",
        $date_limit
    );
    $variation_ids = $wpdb->get_col($query);

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $variation_id) {
            // Проверяем принадлежность вариации к активному продукту
            $parent_id = wp_get_post_parent_id($variation_id);
            $parent_status = get_post_status($parent_id);
            if ($parent_status === 'publish') {
                // Удаляем вариацию
                wp_delete_post($variation_id, true);
            }
        }
    }
}

// Регистрируем Cron задачу, если ещё не зарегистрирована
if (!wp_next_scheduled('wpcore_cron_delete_old_variations')) {
    wp_schedule_event(time(), 'daily', 'wpcore_cron_delete_old_variations');
}

// Хук на выполнение функции при запуске Cron
add_action('wpcore_cron_delete_old_variations', 'wpcore_delete_old_inactive_variations');

2. Запуск очистки вручную для проверки

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

add_action('init', function() {
    if (current_user_can('administrator') && isset($_GET['wpcore_clear_variations'])) {
        wpcore_delete_old_inactive_variations();
        echo 'Очистка вариаций выполнена';
        exit;
    }
});

После этого перейдите в браузере по адресу https://your-site.ru/?wpcore_clear_variations=1, чтобы запустить удаление вручную.

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

  • Проверьте базу данных wp_posts на предмет удалённых вариаций с помощью SQL-запроса:
SELECT ID, post_title, post_status, post_modified FROM wp_posts WHERE post_type='product_variation' ORDER BY post_modified DESC LIMIT 10;
  • Убедитесь, что вариации с датой обновления старше 180 дней и статусом не «publish» удалены.
  • Проверьте работу сайта и фронтенда, чтобы убедиться, что активные вариации остались.
  • Просмотрите логи Cron (если настроены), чтобы убедиться в регулярном запуске задачи.

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

  • Удаляются активные вариации: Проверьте логику проверки родителя и статус публикации. Возможно, у родительского товара статус не «publish» — исправьте условие.
  • Функция не запускается по Cron: Убедитесь, что Cron активен, и задача зарегистрирована. Можно использовать плагин WP Crontrol для диагностики.
  • Превышение времени выполнения PHP: Для большого количества вариаций разбейте очистку на партии, используя параметр LIMIT в запросах.
  • Удаление не происходит: Проверьте права пользователя, под которым запускается скрипт, и возможность выполнения wp_delete_post.

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

  • Всегда делайте резервную копию базы перед запуском автоматических удалений.
  • Добавляйте логи выполнения в отдельный файл или с помощью error_log для отслеживания ошибок.
  • Оптимизируйте запросы к базе данных, особенно на больших магазинах — используйте индексы и ограничение выборки.
  • Используйте WP Cron только для нерегулярных задач, для критичных периодических задач лучше настроить системный Cron на сервере.
  • Регулярно обновляйте WooCommerce и WordPress для совместимости с вашим кодом.

Сравнение вариантов решения

МетодПлюсыМинусыПрименимость
Кодовая реализация в functions.phpЛёгкая настройка, полное управление, не зависит от плагиновНужен опыт, возможны ошибки при некорректном кодеМалые и средние магазины с разработчиком
Плагины очистки WooCommerceУдобный интерфейс, готовые функцииДополнительная нагрузка, возможные конфликты, платные опцииБыстрое внедрение без кода
Внешние скрипты и SQL-запросыМаксимальная скорость и контрольРиск ошибок, требует админских навыковОпытные администраторы и разработчики
Как безопасно удалить старые записи по метаданным в WordPress
20.01.2026
Как удалить пустые meta-поля в WordPress
16.03.2026
Как создать динамическую форму обратной связи в WordPress с проверкой и отправкой на почту
19.11.2025
Как использовать WPGPT для автоматического создания контента в WordPress
16.04.2026
WooCommerce: как автоматически очищать базу от старых и отменённых заказов
16.05.2026