wpdownload.ru wordpress WPDownload.ru

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

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

В WooCommerce под вариантами товаров понимаются вариации переменных товаров (variable products) с разными атрибутами — цвет, размер, материал и т.д. Иногда после обновления каталога или импорта остаются варианты, которые больше не используются в продаже: устаревшие, дублирующиеся или ошибочные. Они занимают место в базе данных, замедляют работу сайта и могут запутать покупателей.

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

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

Чтобы понять, какие варианты товаров можно удалить, нужно определить критерии «неиспользуемости». Частые признаки:

  • Варианты без назначенного статуса «в наличии» и без заказов;
  • Варианты, которые не отображаются на сайте или выключены (статус «черновик» или «приватный»);
  • Варианты без мета-данных или с устаревшими атрибутами, не совпадающими с текущими атрибутами родительского товара;
  • Варианты, которые не связаны с активными переменными товарами.

Проверить количество вариантов у товаров можно через запрос к базе данных:

SELECT p.ID, p.post_title, COUNT(v.ID) as variations_count
FROM wp_posts p
LEFT JOIN wp_posts v ON v.post_parent = p.ID AND v.post_type = 'product_variation'
WHERE p.post_type = 'product'
GROUP BY p.ID
ORDER BY variations_count DESC;

Так вы получите список товаров и количество их вариантов. Для диагностики вариаций без заказов и неактивных вариантов используйте SQL-запросы с условиями по статусу и связям с заказами.

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

Оптимальное решение — написать функцию для регулярного запуска (через WP-Cron или вручную), которая:

  1. Получает все варианты товаров;
  2. Проверяет статус варианта и наличие заказов;
  3. Удаляет варианты, подходящие под критерий «неиспользуемый».

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

function wc_delete_unused_variations() {
    $args = [
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'post_status' => ['publish', 'private', 'draft', 'pending'],
        'fields' => 'ids',
    ];

    $variation_ids = get_posts($args);
    foreach ($variation_ids as $variation_id) {
        $orders = wc_get_orders([
            'limit' => 1,
            'status' => ['completed', 'processing', 'on-hold'],
            'meta_key' => '_product_id',
            'meta_value' => $variation_id,
        ]);

        $status = get_post_status($variation_id);

        // Удаляем вариант, если нет заказов и статус не 'publish'
        if (empty($orders) && $status !== 'publish') {
            wp_delete_post($variation_id, true);
        }
    }
}

// Запуск вручную или через WP-Cron
// wc_delete_unused_variations();

Ключевые моменты кода:

  • Получаем варианты с разными статусами (включая черновики и приватные);
  • Проверяем, есть ли связанные с вариантом заказы с определённым статусом;
  • Удаляем вариант, если он не опубликован и не используется в заказах.

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

После запуска скрипта проверьте:

  • В админке WooCommerce: количество вариантов у переменных товаров уменьшилось;
  • Через SQL-запросы нет вариантов с черновым статусом, не связанным с заказами;
  • Функция wp_delete_post срабатывает без ошибок — логи можно посмотреть в debug.log;
  • На фронтенде не исчезают нужные варианты и нет ошибок при оформлении заказа.

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

  • Удаление активных вариантов с заказами: ошибка в логике проверки заказов. Проверьте, что мета-поля заказа действительно содержат ID варианта, а не родительского товара. Для точной проверки используйте WC_Order_Item_Product и метод get_variation_id().
  • Удаление вариантов с статусом «publish»: скрипт должен исключать опубликованные варианты, иначе удалите активные позиции. Проверьте условие $status !== 'publish'.
  • Неверное получение заказов: функция wc_get_orders не всегда фильтрует по вариациям. Лучше использовать цикл по заказам и проверять товарные позиции вручную.
  • Проблемы с производительностью при большом каталоге: запросы без пагинации могут привести к нагрузке. Используйте постраничный обход с paged и posts_per_page.

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

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

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

МетодПлюсыМинусыПример
Ручное удаление через админкуПросто, без кодаЗатратно по времени, риск пропустить вариантыWooCommerce > Товары > Вариации
SQL-запросы для массового удаленияБыстро, мощноРиск удаления нужных данных, требует бэкапаDELETE FROM wp_posts WHERE post_type='product_variation' AND ...
PHP-скрипт с проверкой заказов (рекомендовано)Точный, безопасный, автоматизируемыйНужно писать код, тестироватьПример в статье
×

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

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

пишет статьи

готовит SEO

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

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