wpgenerate.ru wordpress wpgenerate.ru

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

Проблема: накопление неактивных вариаций товаров в WooCommerce

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

Как диагностировать наличие неактивных вариаций

  • Перейдите в «Товары» > «Все товары» в админке WooCommerce.
  • Откройте товар с вариациями и проверьте, есть ли вариации с атрибутом Статус: Черновик или Отключено.
  • Можно выполнить SQL-запрос для поиска вариаций без продаж и с неактивным статусом:
SELECT p.ID, p.post_title, p.post_status FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND p.post_status != 'publish'
AND pm.meta_key = '_stock_status'
AND pm.meta_value = 'outofstock'
LIMIT 20;

Этот запрос покажет вариации, которые не опубликованы и находятся в статусе "нет на складе".

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

Реализуем функцию, которая регулярно удаляет вариации с определёнными признаками неактивности: статус не опубликован, отсутствие заказов и отсутствие запасов.

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

function wc_delete_inactive_variations() {
    $args = [
        'post_type' => 'product_variation',
        'post_status' => ['draft', 'pending', 'private'],
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_stock_status',
                'value' => 'outofstock',
            ],
        ],
    ];

    $variations = get_posts($args);

    foreach ($variations as $variation) {
        // Проверяем, были ли заказы с этой вариацией
        $order_count = wc_get_orders([
            'limit' => 1,
            'status' => 'completed',
            'return' => 'ids',
            'meta_query' => [
                [
                    'key' => '_product_id',
                    'value' => $variation->ID,
                    'compare' => '=',
                ]
            ]
        ]);

        if (empty($order_count)) {
            wp_delete_post($variation->ID, true); // Удаляем навсегда
        }
    }
}

2. Регулярное выполнение удаления с помощью WP-Cron

Добавим событие wp_cron, чтобы запускать очистку раз в неделю.

function wc_schedule_variation_cleanup() {
    if (!wp_next_scheduled('wc_variation_cleanup_event')) {
        wp_schedule_event(time(), 'weekly', 'wc_variation_cleanup_event');
    }
}
add_action('wp', 'wc_schedule_variation_cleanup');

add_action('wc_variation_cleanup_event', 'wc_delete_inactive_variations');

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

  • Перейдите в раздел «Все товары» и откройте товар с вариациями — неактивные вариации должны исчезнуть.
  • Для ускоренной проверки можете вызвать функцию wc_delete_inactive_variations() вручную из консоли WP-CLI или временно через add_action('init', 'wc_delete_inactive_variations'); в functions.php.
  • Проверьте таблицу wp_posts в базе данных, чтобы убедиться, что записи с типом product_variation и статусом draft, pending удалены.

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

  • Удаляются активные вариации — убедитесь, что в запросе фильтруются только вариации с нужным статусом и отсутствием заказов.
  • Функция не запускается по расписанию — проверьте, что WP-Cron работает корректно (например, посетите сайт, чтобы инициировать запуск cron).
  • Проблемы с производительностью при большом количестве вариаций — используйте пагинацию в запросах, чтобы обрабатывать порциями.
  • Отсутствие прав на удаление — убедитесь, что скрипт запускается с правами администратора.

Практические советы по оптимизации и безопасности

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

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

МетодПлюсыМинусы
Ручное удаление через админ-панельПростота, нет кодаДолго, не подходит для большого количества вариаций
Плагин для очистки WooCommerceАвтоматизация, настройкиМожет замедлять сайт, лишние зависимости
Код с WP-Cron (описанный метод)Лёгкий, контролируемый, без плагиновТребует навыков, возможны ошибки при некорректном коде
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше