wphow.ru wordpress WPHow

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

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

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

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

Диагностика: как определить, что вариации не используются

Для начала убедитесь, что вариации действительно неактивны. Критерии могут быть:

  • Статус вариации — не опубликованы или черновики.
  • Вариации не связаны с активным родительским продуктом.
  • Вариации не имеют заказов или просмотров за длительный период.

Используйте запросы SQL или WP_Query для проверки:

$args = [
    'post_type'      => 'product_variation',
    'post_status'    => ['draft', 'trash', 'private'],
    'posts_per_page' => -1,
];
$query = new WP_Query($args);
// Выведем ID таких вариаций
foreach ($query->posts as $variation) {
    error_log('Unused variation ID: ' . $variation->ID);
}

Если таких много, их стоит удалить.

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

1. Создаем WP-Cron задачу для регулярной очистки

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

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

add_action('cleanup_unused_variations_hook', 'cleanup_unused_variations');

function cleanup_unused_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['draft', 'trash', 'private'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);
    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // true — без перемещения в корзину
    }
}

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

Вариации без родительского продукта тоже считаются ненужными. Обновим функцию:

function cleanup_unused_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => 'any',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);
    foreach ($variations as $variation_id) {
        $parent_id = wp_get_post_parent_id($variation_id);
        $parent_status = get_post_status($parent_id);
        if (!$parent_id || $parent_status !== 'publish') {
            wp_delete_post($variation_id, true);
        }
    }
}

3. Оптимизируем выборку для больших баз

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

function cleanup_unused_variations() {
    $paged = 1;
    do {
        $args = [
            'post_type'      => 'product_variation',
            'post_status'    => 'any',
            'posts_per_page' => 100,
            'paged'          => $paged,
            'fields'         => 'ids',
        ];
        $variations = get_posts($args);
        if (!$variations) break;
        foreach ($variations as $variation_id) {
            $parent_id = wp_get_post_parent_id($variation_id);
            $parent_status = get_post_status($parent_id);
            if (!$parent_id || $parent_status !== 'publish') {
                wp_delete_post($variation_id, true);
            }
        }
        $paged++;
    } while (count($variations) === 100);
}

Проверка результата

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

  • В разделе «Все продукты» — проверьте, что вариации с неактивным статусом или без родителя исчезли.
  • Выполните вручную функцию через WP-CLI, если есть доступ: wp cron event run cleanup_unused_variations_hook.
  • Отслеживайте логи ошибок error_log для выявления возможных сбоев.

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

  • Вариации не удаляются: проверьте права пользователя, под которым запускается WP-Cron, и убедитесь, что wp_delete_post вызывается с параметром true для полного удаления.
  • Удаляются нужные вариации: уточните логику проверки статуса родителя и условий удаления. Добавьте дополнительную проверку заказов или просмотров при необходимости.
  • Скрипт превышает лимит времени выполнения: используйте постраничную обработку и оптимизируйте выборки.

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

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

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

МетодПлюсыМинусы
Удаление через SQL-запросы напрямуюОчень быстрое выполнениеРиск нарушения связей, потеря данных, сложно откатить
Удаление через wp_delete_post() с WP-CronБезопасно, учитываются хуки и кэшМедленнее, требует настройки WP-Cron
Плагины очистки WooCommerceПростота использования, готовые интерфейсыМогут быть тяжелыми, не всегда бесплатны
×

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

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

пишет статьи

готовит SEO

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

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