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

Проблема: неиспользуемые варианты товаров в WooCommerce и их влияние

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

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

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

Для удаления необходимо точно определить критерии «неиспользуемости». Обычно это:

  • Варианты без продаж (продаж = 0)
  • Варианты, которые не были в заказах в течение заданного периода (например, 6 месяцев)
  • Варианты, которые не активны или скрыты

Проверить наличие продаж можно через запросы к таблице wp_woocommerce_order_items и связям с товарами, либо через метаполя варианта.

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

Ниже пример рабочего кода, который удалит варианты товаров без продаж и без заказов за последние 180 дней. Код можно запускать разово или интегрировать в WP-Cron для периодической очистки.

<?php
// Функция для удаления неиспользуемых вариаций WooCommerce
function wc_delete_unused_variations( $days = 180 ) {
    global $wpdb;

    // Получаем дату отсечения
    $date_cutoff = date( 'Y-m-d H:i:s', strtotime( "-" . intval($days) . " days" ) );

    // Запрос для получения ID вариаций без продаж за последние $days
    $query = $wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.meta_value = p.ID
        LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
        LEFT JOIN {$wpdb->posts} o ON o.ID = oi.order_id AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed','wc-processing','wc-on-hold')
        WHERE p.post_type = 'product_variation'
        AND (o.post_date > %s OR o.post_date IS NULL)
        GROUP BY p.ID
        HAVING COUNT(o.ID) = 0",
        $date_cutoff
    );

    $variation_ids = $wpdb->get_col($query);

    if (empty($variation_ids)) {
        return 'Нет вариаций для удаления';
    }

    $deleted_count = 0;
    foreach ($variation_ids as $variation_id) {
        wp_delete_post($variation_id, true); // Полное удаление вариации
        $deleted_count++;
    }

    return "Удалено вариаций: $deleted_count";
}

// Пример вызова
// echo wc_delete_unused_variations(180);
?>

Этот код использует прямой SQL-запрос для поиска вариаций без заказов за последние 180 дней и удаляет их.

Как интегрировать в WP-Cron для автоматизации

Чтобы запускать очистку регулярно, добавьте в functions.php:

// Планирование cron задачи
if ( ! wp_next_scheduled( 'wc_delete_unused_variations_cron_job' ) ) {
    wp_schedule_event( time(), 'weekly', 'wc_delete_unused_variations_cron_job' );
}

// Обработчик cron
add_action( 'wc_delete_unused_variations_cron_job', function() {
    wc_delete_unused_variations(180);
} );

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

  • В админке WooCommerce проверьте список вариаций товаров: ненужные должны исчезнуть.
  • В БД можно проверить количество записей с post_type = 'product_variation' до и после запуска.
  • Для логирования можно временно добавить вывод количества удаленных вариаций через error_log или в отдельный файл.

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

  • Удаляются нужные варианты: Проверьте правильность даты и условия запроса. Возможно, нужны более точные критерии, например фильтрация по статусу вариации.
  • Не удаляется ни одна вариация: Возможно, в базе нет вариаций без заказов или ошибка в SQL-запросе. Включите отладку WP_DEBUG для выявления ошибок.
  • Скрипт долго выполняется или приводит к таймауту: Уменьшите количество обрабатываемых вариаций за один запуск или разделите процесс на батчи.

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

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

Сравнение методов удаления неиспользуемых вариантов

МетодОписаниеПлюсыМинусы
Удаление вручную через админкуРедактирование каждого товара и удаление вариантовПростота, нет кодаДолго, неэффективно при большом количестве
Плагины очистки WooCommerceАвтоматизация, интерфейсУдобство, поддержкаДополнительная нагрузка, возможные конфликты
Код на PHP с WP-CronАвтоматическое удаление по заданным правиламГибкость, контроль, без сторонних плагиновТребует навыков, возможны ошибки в логике

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: как оптимизировать массовое обновление заказов и товаров без ошибок
01.07.2026
Как отключить автоматическое обновление плагинов в WordPress
26.03.2026
Как использовать nonce в WordPress для защиты форм и запросов
18.12.2025
Как создать настройку в админке WordPress: подробное руководство
10.11.2025
Как создать настройку для внешнего API в WordPress: подробное руководство
10.01.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее