wpmoney.ru wordpress WP Money

Автоматическое удаление товаров WooCommerce по остаткам и скидкам

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

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

Какие товары удалять автоматически: критерии отбора

Основные критерии для автоматического удаления:

  • Количество на складе равно нулю или меньше.
  • Отсутствие скидки (акционной цены).
  • Товары, помеченные специальным тегом или кастомным полем (по желанию).

В этой статье рассмотрим удаление товаров с нулевым остатком и без скидки.

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

Реализуем функцию, которая будет запускаться по крону (WP-Cron) и удалять товары, у которых количество на складе меньше или равно нулю и нет скидки.

1. Добавление функции удаления товаров

function wpmoney_delete_products_no_stock_no_sale() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            'relation' => 'AND',
            array(
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '<=',
                'type'    => 'NUMERIC',
            ),
            array(
                'key'     => '_sale_price',
                'value'   => '',
                'compare' => '=',
            ),
        ),
        'fields' => 'ids',
    );

    $products = get_posts($args);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_delete_post($product_id, true); // принудительное удаление без перемещения в корзину
        }
    }
}

2. Регистрация события WP-Cron

Добавим еженедельное событие, чтобы функция запускалась сама по расписанию.

function wpmoney_schedule_product_cleanup() {
    if (!wp_next_scheduled('wpmoney_product_cleanup_hook')) {
        wp_schedule_event(time(), 'weekly', 'wpmoney_product_cleanup_hook');
    }
}
add_action('wp', 'wpmoney_schedule_product_cleanup');
add_action('wpmoney_product_cleanup_hook', 'wpmoney_delete_products_no_stock_no_sale');

3. Вызов функции вручную (для теста)

Чтобы проверить работу без ожидания cron, вызовите функцию напрямую из консоли или временно добавьте:

// wpmoney_delete_products_no_stock_no_sale();

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

  • В админке WooCommerce проверьте, что товары с нулевым остатком и без скидки отсутствуют.
  • Используйте SQL-запрос для проверки:
SELECT ID, post_title FROM wp_posts
JOIN wp_postmeta pm1 ON (ID = pm1.post_id AND pm1.meta_key = '_stock')
JOIN wp_postmeta pm2 ON (ID = pm2.post_id AND pm2.meta_key = '_sale_price')
WHERE post_type = 'product' AND pm1.meta_value <= 0 AND (pm2.meta_value = '' OR pm2.meta_value IS NULL);
<

Запрос должен вернуть 0 строк.

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

  • Проблема: WP-Cron не запускается автоматически.
    Решение: Настройте системный cron на сервере для регулярного вызова wp-cron.php или используйте плагины для мониторинга cron.
  • Проблема: Товары с действующей скидкой удаляются.
    Причина: Ошибка в сравнении мета-полей.
    Решение: Убедитесь, что _sale_price пустой для товаров без скидки и что сравнение в meta_query корректно.
  • Проблема: Удаление не происходит из-за кеширования.
    Решение: Очистите кеш объектов и страниц, если используете кеширующие плагины.

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

  • Для больших магазинов с тысячами товаров ограничьте количество удаляемых товаров за один запуск, например, 'posts_per_page' => 100.
  • Используйте транзиенты или опции для отслеживания времени последнего запуска, чтобы избежать повторных удалений.
  • Перед удалением товара можно сохранять резервную копию или экспортировать список, чтобы избежать потери данных.
  • Не забывайте, что принудительное удаление wp_delete_post($id, true) минует корзину, поэтому будьте осторожны.

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

МетодПреимуществаНедостаткиКомпромисс
Плагин (например, Bulk Delete) Готовое решение, настройки через UI Может быть тяжелым, не всегда гибко Удобно для небольших магазинов
Код с WP-Cron (описанный способ) Максимальный контроль, лёгкость, можно адаптировать Требует навыков, нужно следить за cron Идеально для кастомных задач
Ручное удаление через SQL или админку Простота при малом количестве товаров Неавтоматично, риск ошибок Подходит для редких случаев
×
-15%
на премиум плагин
My Popup

Повысьте конверсию!

Получить скидку »