wpcat.ru wordpress WPCat.ru

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

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

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

  • Отсутствие продаж за последние N месяцев.
  • Товар имеет статус «черновик» или «в ожидании» длительное время.
  • Отсутствие просмотров или активности (если настроена аналитика).

Чаще всего достаточно ориентироваться на дату последней продажи и статус товара.

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

Реализуем функцию на PHP, которая:

  • Получит ID товаров, у которых не было продаж за последние 6 месяцев.
  • Удалит эти товары из базы.
  • Добавит возможность запускать скрипт вручную или по Cron.

1. Получение товаров без продаж

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

function get_inactive_products_ids( $months = 6 ) {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$months} months"));

    // Получаем ID проданных товаров за последние $months месяцев
    $sold_products = $wpdb->get_col($wpdb->prepare(
        "SELECT DISTINCT order_item_meta.meta_value
         FROM {$wpdb->prefix}woocommerce_order_items as order_items
         
         LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
         
         LEFT JOIN {$wpdb->posts} as posts ON posts.ID = order_items.order_id
         
         WHERE order_items.order_item_type = 'line_item'
         AND order_item_meta.meta_key = '_product_id'
         AND posts.post_type = 'shop_order'
         AND posts.post_status IN ('wc-completed','wc-processing')
         AND posts.post_date >= %s
        ", $date_threshold
    ));

    // Получаем все опубликованные товары
    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    ];
    $all_products = get_posts($args);

    // Исключаем проданные товары
    $inactive_products = array_diff($all_products, $sold_products);

    return $inactive_products;
}

2. Удаление неактивных товаров

Функция для удаления по списку ID товаров с возможностью безопасного удаления (с перемещением в корзину):

function delete_products_by_ids( $product_ids ) {
    foreach ( $product_ids as $product_id ) {
        wp_trash_post( $product_id ); // Можно заменить на wp_delete_post для полного удаления
    }
}

3. Запуск по Cron

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

if ( ! wp_next_scheduled( 'delete_inactive_products_monthly' ) ) {
    wp_schedule_event( time(), 'monthly', 'delete_inactive_products_monthly' );
}

add_action( 'delete_inactive_products_monthly', function() {
    $inactive_products = get_inactive_products_ids(6); // 6 месяцев
    if ( ! empty( $inactive_products ) ) {
        delete_products_by_ids( $inactive_products );
    }
});

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

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

  • Вызовите вручную функции get_inactive_products_ids() и проверьте, что возвращаются ожидаемые ID.
  • Перед удалением выведите список товаров на экран или в лог.
  • После запуска удаления проверьте, что товары перемещены в корзину (Trash) в админке WooCommerce.
  • Убедитесь, что товары с продажами за последние 6 месяцев не удалены.

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

  • Удаляются не те товары: Проверьте правильность временного порога и статусов заказов. Например, заказы в статусах «отменен» или «в ожидании» не учитываются.
  • Пустой список неактивных товаров: Возможно, в базе нет заказов с нужными статусами или интервал слишком короткий. Проверьте параметры функции.
  • Ошибка памяти при большом количестве товаров: Реализуйте обработку по партиям (пагинация) в запросах и удалении.
  • Удаление происходит сразу, нет возможности отменить: Используйте wp_trash_post() вместо wp_delete_post() для возможности восстановления.

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

  • Резервное копирование: Перед массовым удалением товаров сделайте полную резервную копию базы данных.
  • Логирование: Ведите лог удалений, чтобы при необходимости откатить изменения.
  • Оптимизация запросов: Используйте индексы и минимизируйте количество тяжелых запросов к базе.
  • Тестирование на копии сайта: Проверяйте работу кода на тестовом сервере, чтобы избежать потери данных.

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

МетодПлюсыМинусыРекомендации
Плагин (например, WP Bulk Delete)Быстрое внедрение, интерфейс, гибкие фильтрыДополнительная нагрузка, зависимости, возможные конфликтыЕсли нужен быстрый результат без кода
Самописный код (как в статье)Полный контроль, минимум нагрузки, легко интегрировать в CronТребует навыков программирования, тестовДля опытных разработчиков и кастомных задач
Ручное удаление в админкеПростота, нет технических навыковДолго, риск ошибок при большом количестве товаровДля единичных случаев
×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙