wphow.ru wordpress WPHow

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

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

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

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

  • Перейдите в админку WordPress → Товары → Вариации и просмотрите список.
  • Используйте SQL-запрос для поиска вариаций без активных связей или с нулевой доступностью.
SELECT p.ID, p.post_parent FROM wp_posts p WHERE p.post_type = 'product_variation' AND NOT EXISTS (SELECT 1 FROM wp_postmeta pm WHERE pm.post_id = p.ID AND pm.meta_key = '_stock_status' AND pm.meta_value = 'instock');

Этот запрос выведет вариации без статуса «в наличии» — потенциально неиспользуемые.

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

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

Шаг 1. Создайте резервную копию базы данных

Перед удалением данных сделайте полный бэкап базы данных.

Шаг 2. Функция для удаления вариаций без наличия

function wphow_delete_unused_variations() {
    global $wpdb;
    // Получаем ID вариаций, у которых stock_status != 'instock'
    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->prefix}posts p
         LEFT JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock_status'
         WHERE p.post_type = 'product_variation' AND (pm.meta_value IS NULL OR pm.meta_value != 'instock')"
    );

    if (empty($variations)) {
        echo 'Неиспользуемых вариаций не найдено.';
        return;
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // true - удалить полностью
    }

    echo 'Удалено ' . count($variations) . ' неиспользуемых вариаций.';
}

Шаг 3. Запуск функции

Добавьте вызов wphow_delete_unused_variations(); в functions.php, обновите страницу админки один раз, затем удалите вызов.

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

  • Проверьте количество вариаций в WooCommerce → Товары → Вариации.
  • Повторите SQL-запрос из раздела диагностики — он должен вернуть пустой результат.
  • Убедитесь, что удалённые вариации действительно не отображаются на сайте и не влияют на оформление заказов.

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

Ошибка 1. Удаление нужных вариаций

Если функция удаляет вариации, которые всё ещё используются, проверьте, правильно ли у вас выставлен статус _stock_status. Иногда вариация может иметь нестандартный статус или отсутствовать мета-поле.

Ошибка 2. Функция не удаляет вариации

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

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

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

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

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

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

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

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙