wpdownload.ru wordpress WPDownload.ru

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

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

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

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

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

Для диагностики можно использовать SQL-запросы к базе или WP-CLI, а также специальные фильтры WooCommerce.

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

Ниже пример кода, который можно добавить в functions.php вашей темы или в кастомный плагин. Он удаляет вариации товара, которые не связаны с опубликованным товаром или имеют нулевой остаток и не продавались в течение 90 дней.

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

    $deleted_count = 0;

    foreach ($variations as $variation) {
        $parent_id = wp_get_post_parent_id($variation->ID);
        $parent_product = wc_get_product($parent_id);

        // Проверяем, есть ли родительский товар и он опубликован
        if (!$parent_product || !$parent_product->is_visible()) {
            wp_delete_post($variation->ID, true);
            $deleted_count++;
            continue;
        }

        $variation_product = wc_get_product($variation->ID);
        $stock = $variation_product->get_stock_quantity();

        // Проверяем остаток и дату последнего заказа
        if ($stock === 0) {
            global $wpdb;
            $last_order_date = $wpdb->get_var($wpdb->prepare(
                "SELECT MAX(post_date) FROM {$wpdb->prefix}posts AS posts
                 INNER JOIN {$wpdb->prefix}woocommerce_order_items AS items
                 ON posts.ID = items.order_id
                 INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta
                 ON items.order_item_id = itemmeta.order_item_id
                 WHERE posts.post_type = 'shop_order'
                   AND posts.post_status IN ('wc-completed','wc-processing')
                   AND itemmeta.meta_key = '_variation_id'
                   AND itemmeta.meta_value = %d",
                $variation->ID
            ));

            $threshold = strtotime('-90 days');
            $last_order_timestamp = strtotime($last_order_date);

            if (!$last_order_date || $last_order_timestamp < $threshold) {
                wp_delete_post($variation->ID, true);
                $deleted_count++;
            }
        }
    }

    error_log("WooCommerce: удалено неиспользуемых вариантов товаров - " . $deleted_count);
}

// Запуск по крону или вручную
// add_action('init', 'wc_auto_delete_unused_variations');

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

Для автоматизации добавьте крон-задачу в WordPress:

if (!wp_next_scheduled('wc_daily_delete_unused_variations')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_delete_unused_variations');
}
add_action('wc_daily_delete_unused_variations', 'wc_auto_delete_unused_variations');

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

Чтобы убедиться, что удаление прошло корректно:

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

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

  • Удаление активных вариантов: Ошибка в проверке статуса родительского товара — убедитесь, что используете $parent_product->is_visible() и проверяете статус публикации.
  • Потеря данных о заказах: Некорректный SQL-запрос для получения последних дат заказов — тестируйте запросы отдельно в базе данных.
  • Производительность: Обработка всех вариантов за один проход может нагрузить сервер — используйте пагинацию или делайте задачи по частям.
  • Крон не запускается: Проверьте, активен ли WP-Cron, или настройте системный cron для вызова wp-cron.php.

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

  • Перед запуском автоматического удаления создавайте резервную копию базы данных.
  • Внедряйте логи для мониторинга количества удалённых элементов и возможных ошибок.
  • Используйте WP-CLI команды для отладки и массовых операций на тестовом сервере.
  • Рассмотрите использование плагинов для управления кроном и мониторинга задач, например, WP Crontrol.

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

МетодПлюсыМинусы
Код в functions.php или плагинеГибкость, можно кастомизировать под свои критерииТребует навыков, риск ошибок
Плагины очистки WooCommerceПростота использования, готовые решенияМогут не учитывать все бизнес-правила, нагрузка на сайт
SQL-запросы напрямуюБыстро, без нагрузки на WPРиск повреждения данных, требует опыт работы с БД
×
Оптимизируй свой сайт!

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

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