wpcoding.ru wordpress WP Coding

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

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

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

Как определить товары без активных заказов?

Активные заказы — это заказы, которые не отменены и не завершены отменой возврата. Чтобы выявить товары без таких заказов, нужно проверить наличие связей товара с заказами в статусах, например, processing, on-hold, completed.

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

Для реализации решения добавим кастомный WP-Cron, который ежедневно проверяет товары и удаляет те, у которых нет активных заказов.

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

function wpc_remove_products_without_active_orders() {
    global $wpdb;

    // Получаем все ID товаров
    $product_ids = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish'");

    foreach ($product_ids as $product_id) {
        // Получаем количество активных заказов с товаром
        $order_count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->prefix}posts p
            INNER JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_id
            INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
            WHERE p.post_type = 'shop_order'
            AND p.post_status IN ('wc-processing', 'wc-on-hold', 'wc-completed')
            AND oim.meta_key = '_product_id'
            AND oim.meta_value = %d",
            $product_id
        ));

        if (intval($order_count) === 0) {
            // Удаляем товар без активных заказов
            wp_delete_post($product_id, true); // true — принудительное удаление без корзины
        }
    }
}

2. Регистрируем ежедневное событие WP-Cron

function wpc_schedule_daily_product_cleanup() {
    if (!wp_next_scheduled('wpc_daily_product_cleanup_event')) {
        wp_schedule_event(time(), 'daily', 'wpc_daily_product_cleanup_event');
    }
}
add_action('wp', 'wpc_schedule_daily_product_cleanup');

add_action('wpc_daily_product_cleanup_event', 'wpc_remove_products_without_active_orders');

3. Отключение cron и запуск вручную (для отладки)

Для проверки можно запускать функцию вручную из админки или через консоль WP-CLI:

wp eval 'wpc_remove_products_without_active_orders();'

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

  • Проверьте, что после запуска cron товары без активных заказов удаляются из базы (в админке WooCommerce они должны исчезнуть).
  • Включите логирование, добавив error_log в функцию для вывода ID удаляемых товаров.
  • Запустите функцию вручную и убедитесь, что товары с активными заказами не затрагиваются.

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

  • Нет удаления товаров: Убедитесь, что cron событие запланировано и функция вызывается. Проверьте права пользователя, под которым работает скрипт.
  • Удаляются товары с заказами: Проверьте правильность статусов заказов в запросе. По умолчанию учитывайте только wc-processing, wc-on-hold и wc-completed.
  • Производительность: При большом количестве товаров запросы могут нагружать базу. Разбейте обработку на порции по 100 товаров в цикле.
  • Потеря данных: Обязательно сделайте резервную копию базы перед внедрением удаления.

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

  • Используйте принудительное удаление wp_delete_post($id, true) только если уверены, что бэкапы есть.
  • Для больших магазинов реализуйте пакетную обработку — в каждой итерации обрабатывайте 50-100 товаров, чтобы избежать таймаутов.
  • Добавьте проверку nonce и прав пользователя, если планируете запускать функцию вручную из админки.
  • Для отладки подключите логирование через error_log, чтобы отслеживать удаляемые товары.
  • Регулярно контролируйте планировщик WP-Cron, чтобы он не блокировался, особенно на низконагруженных серверах.

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

МетодПреимуществаНедостаткиИспользование
WP-Cron с кастомным кодомПолный контроль, автоматизация, гибкостьТребует навыков программирования, нагрузка при большом каталогеПодходит для магазинов с регулярным обновлением ассортимента
Плагины очистки каталогаПростота, готовые решенияМогут не учитывать все бизнес-правила, нагрузка и лишние функцииДля небольших магазинов без специальных условий
Ручное удаление в админкеБезопасно, визуальный контрольТрудоемко, не автоматичноМаленькие магазины или редко обновляемый каталог
×

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

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

пишет статьи

готовит SEO

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

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