WPExperts

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

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

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

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

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

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

function wpexperts_delete_out_of_stock_products() {
    // Получаем ID товаров с нулевым остатком
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'post_status'    => 'publish',
    ];

    $products = get_posts($args);

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

    foreach ($products as $product_id) {
        wp_trash_post($product_id); // Перемещаем товар в корзину
    }
}

2. Автоматизация с помощью WP-Cron

Чтобы функция запускалась регулярно (например, ежедневно), зарегистрируйте событие Cron:

// Регистрируем ежедневное событие
add_action('wpexperts_daily_delete_out_of_stock', 'wpexperts_delete_out_of_stock_products');

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

3. Очистка Cron при деактивации

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

function wpexperts_deactivate_cleanup() {
    $timestamp = wp_next_scheduled('wpexperts_daily_delete_out_of_stock');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpexperts_daily_delete_out_of_stock');
    }
}
register_deactivation_hook(__FILE__, 'wpexperts_deactivate_cleanup');

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

Для проверки работы скрипта:

  • Создайте тестовый товар с нулевым остатком.
  • Запустите функцию вручную в functions.php или через WP-CLI:
wp eval 'wpexperts_delete_out_of_stock_products();'
  • Проверьте, что товар переместился в корзину (раздел "Удаленные товары" в админке WooCommerce).
  • Убедитесь, что через сутки автоматический запуск удаляет новые товары с нулевым остатком.

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

  • Функция не удаляет товары: Проверьте, что у товаров действительно статус outofstock. Иногда остаток может быть 0, но статус не обновлен. Запустите wc_update_product_stock_status( $product_id ) для обновления.
  • Функция не запускается по расписанию: Проверьте работу WP-Cron. Для этого можно использовать плагин WP Crontrol или вручную вызвать wp cron event run --due-now через WP-CLI.
  • Удаление нельзя отменить: функция перемещает товары в корзину, а не удаляет окончательно. Для полного удаления замените wp_trash_post() на wp_delete_post( $product_id, true ).

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

  • Резервное копирование: Перед внедрением автоматического удаления убедитесь, что есть регулярные бэкапы базы данных.
  • Оптимизация запросов: Запрос на товары с нулевым остатком может быть тяжелым при большом каталоге. Можно добавить пагинацию или обрабатывать по частям.
  • Логирование: Для отслеживания работы функции рекомендуем включить логирование удаленных товаров:
function wpexperts_delete_out_of_stock_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'post_status'    => 'publish',
    ];

    $products = get_posts($args);

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

    foreach ($products as $product_id) {
        wp_trash_post($product_id);
        error_log('Удален товар с ID: ' . $product_id);
    }
}

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

МетодПлюсыМинусы
Ручное удаление в админкеПолный контроль, простотаТрудозатратно, неэффективно при большом каталоге
Автоматизация через WP-Cron и кастомный кодАвтоматическое поддержание актуальности, гибкость настройкиТребует навыков, возможны ошибки без тестирования
Плагины для очистки каталогаГотовое решение, удобный интерфейсМогут быть платными, риск конфликтов с другими плагинами
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »