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

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

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

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

SELECT p.ID, p.post_title, p.post_date, pm.meta_value AS parent_id
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON pm.post_id = p.ID AND pm.meta_key = '_product_id'
WHERE p.post_type = 'product_variation'
AND p.post_status = 'publish'
ORDER BY p.post_date ASC;

Этот запрос выведет список активных вариаций с датой создания. Обратите внимание на даты — вариации, не обновлявшиеся или не продававшиеся длительное время, стоит рассмотреть к удалению.

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

1. Определяем критерии неактивности

В данном случае будем считать неактивными вариации старше 180 дней (6 месяцев).

2. Добавляем PHP-скрипт для удаления вариаций по дате

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

add_action('wp_loaded', function() {
    // Запускаем только в админке и один раз в сутки
    if (!is_admin()) return;
    if (get_transient('wc_clean_old_variations')) return;

    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    // Получаем ID вариаций старше 180 дней
    $variation_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_date < %s",
        $date_threshold
    ));

    if ($variation_ids) {
        foreach ($variation_ids as $var_id) {
            // Удаляем вариацию полностью, минуя корзину
            wp_delete_post($var_id, true);
        }
    }

    // Ставим транзиент на 24 часа, чтобы не запускать скрипт слишком часто
    set_transient('wc_clean_old_variations', true, DAY_IN_SECONDS);
});

3. Автоматизация через Cron (рекомендуется для крупных сайтов)

Чтобы запускать очистку по расписанию, добавьте задачу в Cron WordPress:

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

add_action('wc_clean_old_variations_cron', function() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    $variation_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_date < %s",
        $date_threshold
    ));

    foreach ($variation_ids as $var_id) {
        wp_delete_post($var_id, true);
    }
});

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

Для проверки выполните SQL-запрос из раздела диагностики до и после запуска скрипта. Количество вариаций должно уменьшиться.

В админке WooCommerce также убедитесь, что неактивные вариации исчезли.

Для отладки можно добавить error_log() внутри цикла удаления, чтобы видеть какие ID удаляются:

error_log('Удалена вариация ID: ' . $var_id);

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

  • Скрипт не запускается: Проверьте, что код находится в активной теме или в подключаемом плагине. Для Cron убедитесь, что WP-Cron работает (например, страница сайта посещается регулярно).
  • Удаляются нужные вариации: Скорректируйте условие по дате, возможно, стоит увеличить порог неактивности.
  • Ошибки доступа к базе: Используйте $wpdb->prepare для безопасных запросов, проверьте права пользователя базы данных.
  • Нагрузка на сервер: Для большого количества вариаций разделите удаление на несколько итераций, добавьте лимит в запросе и запускайте в цикле.

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

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

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, без кодаДолго, неэффективно для больших магазинов
Плагины очистки WooCommerceГотовые функции, интерфейсНагрузка, зависимость от стороннего кода
Собственный код с CronГибкость, контроль, отсутствие плагиновТребует навыков, ответственность за ошибки
Как создать автообновляемый кэш в WordPress: практическое руководство
04.11.2025
Автоматическое удаление старых записей по метаданным в WordPress с помощью WPcore
28.12.2025
Как создать автоматическое отправление email при новом комментарии в WordPress
21.02.2026
Как удалить все комментарии в WordPress быстро и безопасно
05.12.2025
Как добавить владельца постов в WordPress с помощью кода
09.03.2026