Как удалить оставшиеся вариации товаров в WooCommerce через код

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

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

Чтобы убедиться, что на вашем сайте есть неиспользуемые вариации, можно проверить таблицу wp_posts с типом product_variation и сравнить с активными товарами.

SELECT p.ID, p.post_title, p.post_parent 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. Создаем функцию для удаления вариаций

Чтобы безопасно удалить вариации, используем встроенные функции WooCommerce и WordPress. Ниже пример кода, который удалит вариации товаров, у которых отсутствует опубликованный родитель.

function delete_orphaned_product_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );
    $variations = get_posts($args);

    foreach ( $variations as $variation_id ) {
        $parent_id = wp_get_post_parent_id($variation_id);
        $parent_post = get_post($parent_id);

        if ( !$parent_post || $parent_post->post_status !== 'publish' ) {
            wp_delete_post($variation_id, true);
        }
    }
}

2. Запускаем функцию вручную или через WP-CLI

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

add_action('init', 'delete_orphaned_product_variations');

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

Альтернативно можно выполнить этот код через WP-CLI, создав PHP-скрипт и запустив его командой wp eval-file script.php.

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

После запуска функции проверьте, что вариации с несуществующими или неопубликованными товарами удалены. Для этого выполните SQL-запрос из блока диагностики повторно — он должен вернуть пустой результат.

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

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

  • Функция не удаляет вариации: убедитесь, что у вас есть права администратора и код запускается в нужный момент. Проверьте, что post_status вариаций и товаров правильный.
  • Удаляются нужные вариации: проверьте логику проверки родительского товара, возможно, статус товара не «publish», а, например, «private» или «draft». Учтите это в коде.
  • Ошибки PHP или «белый экран»: выполняйте тесты на тестовом сайте, используйте отладчик или WP_DEBUG. Добавьте логирование для отлова ошибок.

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

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

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

МетодПлюсыМинусы
SQL-запрос напрямуюБыстрое удаление, без загрузки WordPressРиск удаления нужных данных, отсутствие логики WooCommerce
PHP-код с wp_delete_post()Безопасно, учитывает все хуки и зависимостиМожет быть медленнее при большом объеме данных
Плагины для очистки базыУдобный интерфейс, функции под контролемЗависимость от стороннего ПО, возможны конфликты
Как создать автоматическое удаление старых записей в WordPress по дате
24.01.2026
Как использовать Redis для ускорения WordPress: настройка и примеры
10.03.2026
Как изменить уникальный slug в WordPress для записей без плагинов
07.03.2026
Как автоматизировать удаление ревизий записей в WordPress для оптимизации базы данных
29.01.2026
Как создать плагин для автоматического очищения кеша WordPress
25.11.2025