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

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

При ведении интернет-магазина на WooCommerce часто накапливаются варианты товаров (variations), которые не продаются и не используются. Они занимают место в базе данных, замедляют загрузку страниц и усложняют управление каталогом.

Чтобы определить, есть ли такие варианты, выполните SQL-запрос к базе данных, например через phpMyAdmin или WP-CLI:

SELECT p.ID, p.post_title, COUNT(o.ID) as orders_count
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN wp_posts o ON oi.order_id = o.ID AND o.post_type = 'shop_order'
WHERE p.post_type = 'product_variation'
GROUP BY p.ID
HAVING orders_count = 0;

Этот запрос покажет варианты товаров без заказов. Если таких много, стоит очистить каталог.

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

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

Мы создадим PHP-скрипт, который можно запускать вручную или по расписанию, чтобы удалять варианты без продаж.

function wc_delete_unused_variations() {
    global $wpdb;

    // Получаем ID вариантов без заказов
    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.meta_value = p.ID
         LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
         LEFT JOIN {$wpdb->posts} o ON oi.order_id = o.ID AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')
         WHERE p.post_type = 'product_variation' AND o.ID IS NULL"
    );

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

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // Удаляем без возможности восстановления
    }

    return count($variations) . ' вариантов успешно удалены.';
}

2. Запуск функции вручную

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

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_unused_variations'])) {
        $result = wc_delete_unused_variations();
        echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
    }
});

После этого в админке откройте любой раздел и добавьте в URL ?delete_unused_variations=1 — функция удалит неиспользуемые варианты.

3. Автоматизация с помощью WP-Cron

Чтобы регулярно чистить базу, зарегистрируйте событие:

if (!wp_next_scheduled('wc_cron_delete_unused_variations')) {
    wp_schedule_event(time(), 'daily', 'wc_cron_delete_unused_variations');
}

add_action('wc_cron_delete_unused_variations', 'wc_delete_unused_variations');

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

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

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

  • Удалились нужные варианты: Проверьте, что в запросе учитываются только варианты без заказов с определёнными статусами (например, wc-completed и wc-processing). Возможно, стоит расширить список статусов.
  • Функция не удаляет варианты: Проверьте права пользователя, наличие hook'ов и корректность SQL-запроса. Также убедитесь, что WP-Cron работает (проверьте планировщик задач сервера).
  • Проблемы с производительностью при большом каталоге: Разбейте удаление на партии по 100 вариантов, чтобы избежать таймаутов.

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

  • Всегда делайте резервное копирование базы данных перед массовым удалением.
  • Используйте wp_delete_post($id, true) для полного удаления, чтобы не оставлять мусор.
  • Проверяйте наличие заказов не только в статусах wc-completed, но и в wc-processing, wc-on-hold — чтобы не удалить варианты, связанные с активными заказами.
  • Для больших магазинов используйте WP-CLI для запуска скриптов, чтобы избежать ограничений веб-сервера.
  • Если не хотите писать код, рассмотрите плагин Clearfy Pro с функциями очистки и оптимизации WooCommerce.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать автоматическое сохранение через AJAX в WordPress
02.12.2025
Как создать подробный лог ошибок и действий в WordPress
26.11.2025
Как автоматизировать создание резервных копий WordPress с помощью плагинов
11.04.2026
Как создать динамический попап в WordPress на AJAX с примером кода
27.02.2026
Как удалить автоматически неиспользуемые теги в WordPress: практическое решение
16.02.2026
×

Время действовать!

Суперцены на
WordPress!

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

Не упусти шанс ⋙