wpmoney.ru wordpress WP Money

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

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

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

Как получить список товаров с нулевым или отрицательным остатком

Первым шагом необходимо проверить, как WooCommerce хранит данные об остатках товара. WooCommerce использует мета-поле _stock для хранения количества товара на складе. Можно получить список товаров с остатком <= 0 через WP_Query:

$args = [
    'post_type' => 'product',
    'meta_query' => [
        [
            'key' => '_stock',
            'value' => 0,
            'compare' => '<=',
            'type' => 'NUMERIC'
        ]
    ],
    'posts_per_page' => -1
];
$query = new WP_Query($args);
foreach ($query->posts as $product_post) {
    // обработка каждого товара
}

Проверка точности выборки

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

foreach ($query->posts as $product_post) {
    echo $product_post->ID . ' - ' . get_the_title($product_post->ID) . "\n";
}

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

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

function wpmoney_delete_out_of_stock_products() {
    $args = [
        'post_type' => 'product',
        'meta_query' => [
            [
                'key' => '_stock',
                'value' => 0,
                'compare' => '<=',
                'type' => 'NUMERIC'
            ]
        ],
        'posts_per_page' => -1
    ];

    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        error_log('Нет товаров для удаления с нулевым остатком');
        return;
    }

    foreach ($query->posts as $product_post) {
        wp_delete_post($product_post->ID, true); // без перемещения в корзину
        error_log('Удалён товар ID: ' . $product_post->ID);
    }
}

// Для запуска вручную
// wpmoney_delete_out_of_stock_products();

// Пример добавления в крон
if (!wp_next_scheduled('wpmoney_daily_delete_out_of_stock_products')) {
    wp_schedule_event(time(), 'daily', 'wpmoney_daily_delete_out_of_stock_products');
}
add_action('wpmoney_daily_delete_out_of_stock_products', 'wpmoney_delete_out_of_stock_products');

Объяснение параметров

  • wp_delete_post($ID, true) — удаляет товар без перемещения в корзину;
  • Крон-задача запускается один раз в сутки, чтобы не нагружать сайт;
  • Логирование через error_log помогает отследить процесс.

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

После запуска функции проверьте следующие моменты:

  • В базе данных отсутствуют товары с _stock <= 0. Для этого можно выполнить SQL-запрос:
SELECT post_id FROM wp_postmeta WHERE meta_key = '_stock' AND meta_value <= 0;
  • В админке WooCommerce отсутствуют такие товары;
  • В логах сервера появились записи об удалении товаров;
  • Каталог на сайте не содержит неактуальных позиций.

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

  • Удаляются не все товары с нулевым остатком: Проверьте, что товары используют стандартное мета-поле _stock, а не сторонние плагины, которые могут хранить остаток иначе.
  • Функция не запускается по крону: Убедитесь, что WP-Cron включён и работает, либо используйте системный cron для вызова wp-cron.php.
  • Удаление не происходит, но лог пуст: Проверьте права пользователя, под которым работает сайт, и логи ошибок PHP.
  • Производительность падает при большом количестве товаров: Разбивайте выборку на страницы, например, с помощью 'posts_per_page' => 100 и обрабатывайте по партиям.

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

  • Добавьте проверку current_user_can('delete_products') при ручном запуске функции для безопасности.
  • Используйте транзиенты или кэширование, чтобы не запускать удаление слишком часто.
  • Перед удалением сделайте резервную копию базы данных.
  • Вместо полного удаления можно переводить товары в черновики, чтобы сохранить данные для анализа.
  • Если магазин мультивендорный, учитывайте права отдельных продавцов.

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

МетодПлюсыМинусы
Код на PHP с WP_Query и wp_delete_postПолный контроль, автоматизация, нет зависимости от плагиновТребует навыков, возможны ошибки в логике, нагрузка при больших объёмах
Плагины очистки WooCommerce (например, WPShop Clearfy)Удобство, интерфейс, дополнительные функции оптимизацииЗависимость от стороннего кода, ограниченные настройки
Ручное удаление через админкуПростота, контроль каждого товараНеэффективно при большом каталоге, риск пропустить товары
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙