wpwebsite.ru wordpress WPWebSite

Автоматическое удаление скрытых товаров WooCommerce после 30 дней без продаж

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

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

Как определить товары, которые нужно удалить

Для удаления нам нужны товары, которые одновременно удовлетворяют условиям:

  • Статус публикации private (скрытые товары);
  • Отсутствие продаж за последние 30 дней;
  • Дата последнего обновления или публикации более 30 дней назад.

Проверка продаж — по мета-данным заказа и связке с товаром.

Диагностика: как проверить, какие товары подходят под критерии

Для диагностики можно использовать SQL-запрос к базе данных (предварительно сделайте бэкап):

SELECT p.ID, p.post_title, MAX(o.post_date) AS last_order_date
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_type = 'line_item'
LEFT JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
LEFT JOIN wp_posts o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product' AND p.post_status = 'private'
AND oim.meta_key = '_product_id' AND oim.meta_value = p.ID
GROUP BY p.ID
HAVING (last_order_date IS NULL OR last_order_date < DATE_SUB(NOW(), INTERVAL 30 DAY))
AND p.post_modified < DATE_SUB(NOW(), INTERVAL 30 DAY);

Этот запрос покажет скрытые товары, у которых не было заказов за последние 30 дней и которые не обновлялись более 30 дней.

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

Используем планировщик задач WordPress (WP-Cron) с кастомной функцией. Пример кода для файла functions.php или собственного плагина:

add_action('wp_loaded', function() {
    if (!wp_next_scheduled('wc_delete_hidden_products_cron')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_hidden_products_cron');
    }
});

add_action('wc_delete_hidden_products_cron', 'wc_delete_hidden_products');

function wc_delete_hidden_products() {
    global $wpdb;

    // Получаем ID скрытых товаров без продаж и обновлений более 30 дней
    $query = "
        SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_type = 'line_item'
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
        LEFT JOIN {$wpdb->posts} o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
        WHERE p.post_type = 'product' AND p.post_status = 'private'
        AND oim.meta_key = '_product_id' AND oim.meta_value = p.ID
        GROUP BY p.ID
        HAVING (MAX(o.post_date) IS NULL OR MAX(o.post_date) < DATE_SUB(NOW(), INTERVAL 30 DAY))
        AND p.post_modified < DATE_SUB(NOW(), INTERVAL 30 DAY)
    ";

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

    if (empty($product_ids)) {
        return; // Нет товаров для удаления
    }

    foreach ($product_ids as $product_id) {
        wp_delete_post($product_id, true); // Полное удаление
    }
}

Объяснение кода

  • Планируется ежедневный запуск задачи wc_delete_hidden_products_cron.
  • В функции wc_delete_hidden_products выполняется запрос для выбора товаров по критериям.
  • Удаление выполняется через wp_delete_post() с параметром true для полного удаления.

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

  • Выполните вручную запуск cron-функции через WP CLI или временно добавьте вызов функции в functions.php для теста.
  • Проверьте, что скрытые товары с отсутствием продаж и давностью обновления больше 30 дней исчезли из админки WooCommerce.
  • Запустите SQL-запрос диагностики снова — список должен быть пуст.

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

  • Проблема: Cron-задача не запускается.
    Решение: Проверьте работу WP-Cron, можно использовать плагин WP Crontrol для проверки и запуска задач вручную.
  • Проблема: Запрос не находит товары, хотя они есть.
    Решение: Убедитесь, что товары действительно имеют статус private, и что заказы имеют статусы wc-completed или wc-processing. В запросе иногда нужно адаптировать префиксы таблиц.
  • Проблема: Удаление не происходит из-за прав.
    Решение: Функция выполняется под пользователем с правами администратора или из кода, где есть права на удаление постов.

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

  • Перед запуском автоматического удаления сделайте резервную копию базы данных.
  • Убедитесь, что cron-задача не запускается слишком часто — достаточно раз в сутки.
  • Для больших магазинов оптимизируйте запрос, добавляя лимиты и постраничную обработку.
  • Рекомендуется тестировать код на staging-сервере перед производством.

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

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

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

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

пишет статьи

готовит SEO

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

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