wp-lessons.ru wordpress WP-Lessons

Автоматическое отключение товаров в WooCommerce без заказов за определённый период

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

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

Решение: автоматизировать отключение товаров без заказов за заданный период — например, за последние 6 месяцев. Это позволит поддерживать каталог актуальным и повысит удобство управления магазином.

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

Для начала нужно проверить, какие товары не были куплены за, скажем, последние 180 дней. Это можно сделать с помощью SQL-запроса к базе данных WooCommerce или средствами PHP с использованием функций WooCommerce.

Пример SQL-запроса для выборки ID товаров без заказов за 180 дней:

SELECT p.ID FROM wp_posts p
LEFT JOIN (
  SELECT im.meta_value AS product_id
  FROM wp_woocommerce_order_items oi
  JOIN wp_woocommerce_order_itemmeta im ON oi.order_item_id = im.order_item_id
  JOIN wp_posts o ON oi.order_id = o.ID
  WHERE im.meta_key = '_product_id'
    AND o.post_status IN ('wc-completed', 'wc-processing')
    AND o.post_date >= DATE_SUB(NOW(), INTERVAL 180 DAY)
  GROUP BY im.meta_value
) recent_orders ON p.ID = recent_orders.product_id
WHERE p.post_type = 'product'
  AND p.post_status = 'publish'
  AND recent_orders.product_id IS NULL;

Этот запрос возвращает товары, для которых нет завершённых или обрабатываемых заказов за последние 180 дней.

Пошаговое решение: автоматическое отключение товаров без заказов

Реализуем функцию на PHP, которую можно запускать через WP-Cron для автоматической деактивации товаров без продаж.

Код для отключения товаров без заказов за 180 дней

function disable_products_without_orders( $days = 180 ) {
    global $wpdb;

    $query = $wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->prefix}posts p
        LEFT JOIN (
            SELECT im.meta_value AS product_id
            FROM {$wpdb->prefix}woocommerce_order_items oi
            JOIN {$wpdb->prefix}woocommerce_order_itemmeta im ON oi.order_item_id = im.order_item_id
            JOIN {$wpdb->prefix}posts o ON oi.order_id = o.ID
            WHERE im.meta_key = '_product_id'
              AND o.post_status IN ('wc-completed', 'wc-processing')
              AND o.post_date >= DATE_SUB(NOW(), INTERVAL %d DAY)
            GROUP BY im.meta_value
        ) recent_orders ON p.ID = recent_orders.product_id
        WHERE p.post_type = 'product'
          AND p.post_status = 'publish'
          AND recent_orders.product_id IS NULL",
        $days
    );

    $product_ids = $wpdb->get_col( $query );

    if ( empty( $product_ids ) ) {
        return;
    }

    foreach ( $product_ids as $product_id ) {
        // Меняем статус товара на 'draft' (черновик) — отключаем отображение
        wp_update_post( [
            'ID'          => $product_id,
            'post_status' => 'draft',
        ] );
    }
}

// Пример запуска функции
// disable_products_without_orders(180);

Этот код безопасно переводит товары, не имеющие заказов за 180 дней, в статус «черновик», тем самым скрывая их с сайта.

Настройка WP-Cron для автоматического запуска

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

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

add_action( 'disable_inactive_products_daily', function() {
    disable_products_without_orders( 180 );
} );

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

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

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

  • Неверный префикс таблиц в запросах: в разных установках WordPress префиксы таблиц могут отличаться. Используйте $wpdb->prefix для динамического определения.
  • Неправильный статус заказа: учитывайте, что для WooCommerce статус заказа может быть «wc-completed» или «wc-processing» для успешных продаж. Если не учитывать оба — товары с незавершёнными заказами могут ошибочно отключаться.
  • Отсутствие проверки прав пользователя: функция должна запускаться только с правами администратора или через WP-Cron, чтобы избежать случайного отключения.
  • Конфликты с кешированием: после изменения статуса товаров очистите кеш сайта и, если есть, кеш WooCommerce для корректного отображения.

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

  • При большом количестве товаров разбивайте обработку на партии — например, по 100 товаров за раз, чтобы избежать превышения лимитов памяти и времени исполнения.
  • Сделайте резервную копию базы данных перед внедрением автоматических изменений.
  • Используйте транзиенты или мета данные для отметки уже обработанных товаров, чтобы не перезапускать обработку одних и тех же позиций.
  • Для более гибкого управления рассмотрите использование плагина Clearfy Pro от WPShop для очистки и оптимизации WooCommerce.

Сравнение подходов к отключению товаров без заказов

МетодОписаниеПлюсыМинусы
Ручное отключениеАдмин вручную меняет статус товаровПростой, не требует кодаТрудоёмко, не подходит для больших магазинов
Плагин для анализа продажИспользует готовые решения с интерфейсомУдобно, часто с дополнительными функциямиМожет нагружать сайт, платные версии
Код с WP-CronАвтоматический скрипт на PHP, запускаемый по расписаниюГибко, без сторонних плагинов, под контролемТребует навыков, возможны ошибки без тестирования
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее