wp-lessons.ru wordpress WP-Lessons

Как удалить неактивные вариации товаров WooCommerce без плагинов

Проблема: неактивные вариации товаров загромождают базу данных

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

Удаление этих вариаций вручную через админку занимает много времени, а использование плагинов не всегда оправдано из-за нагрузки и возможных конфликтов. В этом руководстве покажу, как безопасно найти и удалить неактивные вариации товаров с помощью собственного кода.

Диагностика: как определить неактивные вариации

Для начала нужно понять, какие вариации являются неактивными. Обычно это вариации, которые не связаны с активными товарами или имеют статус draft, trash или отсутствуют в списке атрибутов.

Основные признаки неактивных вариаций:

  • Вариация не связана с опубликованным товаром-родителем.
  • Статус вариации не publish.
  • Атрибуты вариации не соответствуют текущим значениям атрибутов товара.

Для диагностики можно выполнить SQL-запрос, чтобы найти вариации с неактивными родителями:

SELECT p.ID, p.post_parent, p.post_status FROM wp_posts p WHERE p.post_type = 'product_variation' AND p.post_parent NOT IN (SELECT ID FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish');

Этот запрос вернёт вариации, у которых родительский товар не опубликован или отсутствует. Такие вариации можно рассматривать как кандидатов на удаление.

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

Для безопасного удаления создадим PHP-скрипт, который:

  1. Выберет все вариации с неактивными родителями.
  2. Удалит их через функцию wp_delete_post() с параметром принудительного удаления.

Пример кода для добавления в файл functions.php темы или в отдельный плагин:

function delete_inactive_product_variations() {
    global $wpdb;
    
    // Получаем ID вариаций с неактивными родителями
    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
         WHERE p.post_type = 'product_variation'
         AND p.post_parent NOT IN (
             SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish'
         )"
    );

    if ( empty( $variations ) ) {
        error_log( 'Нет неактивных вариаций для удаления.' );
        return;
    }

    foreach ( $variations as $variation_id ) {
        wp_delete_post( $variation_id, true ); // принудительное удаление без корзины
        error_log( "Удалена вариация с ID: $variation_id" );
    }

    error_log( 'Удаление неактивных вариаций завершено.' );
}

// Запускаем функцию один раз, например, при активации темы или вручную
// delete_inactive_product_variations();

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

Как проверить, что решение сработало

  • Перед запуском сделайте полную резервную копию базы данных.
  • Выполните SQL-запрос из раздела диагностики — количество найденных вариаций должно уменьшиться после выполнения скрипта.
  • В админке WooCommerce убедитесь, что неактивные вариации исчезли из списка вариаций товаров.
  • Просмотрите лог ошибок PHP (error_log) — там будут записи об удалённых вариациях.

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

  • Запуск скрипта без резервного копирования. Риск удаления нужных данных. Всегда делайте резервную копию.
  • Удаление вариаций с активными родителями. Проверьте SQL-запрос и логику выбора вариаций — возможно, товар не опубликован, но вариация нужна.
  • Ошибка доступа к базе данных. Убедитесь, что глобальный объект $wpdb доступен и подключение к базе работает.
  • Запуск скрипта в публичном доступе. Никогда не оставляйте такую функцию в продакшене без контроля — запускайте вручную или через WP-CLI.

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

  • Безопасность: ограничьте доступ к выполнению скрипта администраторам, используйте nonce, если вызываете через админку.
  • Производительность: при большом количестве вариаций разбивайте удаление на порции, чтобы избежать таймаутов:
function delete_inactive_variations_chunked( $limit = 50 ) {
    global $wpdb;
    
    $variations = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT p.ID FROM {$wpdb->posts} p
             WHERE p.post_type = 'product_variation'
             AND p.post_parent NOT IN (
                 SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish'
             )
             LIMIT %d",
            $limit
        )
    );

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

    foreach ( $variations as $variation_id ) {
        wp_delete_post( $variation_id, true );
    }

    return true; // Есть ещё вариации для удаления
}

// Запускайте в цикле, например через WP-CLI или cron
  • Регулярно проверяйте базу на наличие неактивных вариаций, чтобы не допускать их накопления.

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

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

-20% на премиум темы и плагины

Использовать скидку ⋙