Диагностика проблемы: зачем удалять товары с низким остатком автоматически
В WooCommerce часто возникает задача: убрать из каталога товары, у которых на складе практически закончились запасы. Это необходимо для поддержания актуальности ассортимента и улучшения пользовательского опыта — покупатели не видят товары, которые вряд ли будут доступны к покупке. Ручное удаление — трудоемкий процесс, а стандартных настроек WooCommerce для автоматизации подобной очистки нет.
Пошаговое решение: создание автоматического удаления товаров по минимальному остатку
1. Подключение функции удаления товаров через wp_cron
Реализуем задачу с помощью планировщика WordPress — WP-Cron. Будем запускать еженедельную проверку товаров и удалять те, у которых запас меньше заданного порога.
function wc_auto_delete_low_stock_products() {
$threshold = 2; // Минимальный остаток для удаления
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock',
'value' => $threshold,
'compare' => '<=',
'type' => 'NUMERIC',
),
),
'post_status' => 'publish',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
wp_delete_post( get_the_ID(), true );
}
wp_reset_postdata();
}
}
// Регистрируем событие, если оно еще не задано
if ( ! wp_next_scheduled( 'wc_auto_delete_low_stock_event' ) ) {
wp_schedule_event( time(), 'weekly', 'wc_auto_delete_low_stock_event' );
}
// Хук на событие
add_action( 'wc_auto_delete_low_stock_event', 'wc_auto_delete_low_stock_products' );2. Настройка порога и частоты проверки
В данном примере порог задан как 2, то есть товары с запасом 2 и менее будут удаляться. Частоту можно изменить с 'weekly' на 'daily' или 'hourly', если необходима более частая очистка.
3. Очистка и резервное копирование
Рекомендуется перед включением автоматического удаления сделать резервную копию базы и протестировать скрипт на тестовом сайте, чтобы избежать потери нужных данных.
Проверка результата после внедрения
Для проверки работы функции:
- Создайте тестовый товар с остатком <= 2.
- Запустите функцию вручную, вызвав
wc_auto_delete_low_stock_products()через консоль WP-CLI или временно добавьте вызов в functions.php. - Проверьте, что товар удалился из админки и каталога.
- Дождитесь срабатывания wp_cron (или запустите вручную через WP-CLI
wp cron event run wc_auto_delete_low_stock_event).
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, что у товаров заполнено поле
_stock. Иногда складские запасы не учитываются, если включен управляющий запасом плагин. Убедитесь, что запасы актуальны. - WP-Cron не срабатывает: на некоторых хостингах WP-Cron нужно запускать через системный cron. Проверьте логи и вручную запустите событие для отладки.
- Удаляются не те товары: проверьте параметр
compareи тип поля в запросеmeta_query. Иногда_stockхранится как строка, что влияет на сравнение. - Потеря важных товаров: добавьте дополнительные фильтры, например по категории или меткам, чтобы исключить из удаления товары с определенными статусами или важностью.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post( $post_id, true )с параметромtrueдля полного удаления, чтобы избежать накопления мусора. - Ограничивайте количество удаляемых записей за раз, чтобы не перегружать базу, особенно на больших магазинах. Можно добавить пагинацию в WP_Query.
- Проверяйте права пользователя и запускайте удаление от имени администратора или системного пользователя.
- Добавьте логирование удаленных товаров в отдельный файл или базу, чтобы отслеживать изменения.
Сравнение вариантов автоматизации удаления товаров по остатку
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| WP-Cron + кастомный код | Полный контроль, гибкая логика | Требует навыков программирования, зависит от cron | Средние и крупные магазины с возможностью тестирования |
| Плагины управления запасами | Простота установки, готовый функционал | Может быть избыточно, не всегда гибко | Малые магазины, не требующие кастомной логики |
| Ручное удаление через админку | Простота, нет ошибок кода | Ручной труд, не автоматизировано | Магазины с небольшим ассортиментом |
Код для запуска функции вручную (для тестирования)
add_action('admin_init', function() {
if ( isset($_GET['run_low_stock_delete']) && current_user_can('manage_options') ) {
wc_auto_delete_low_stock_products();
wp_die('Удаление товаров с низким остатком выполнено');
}
});После добавления этого кода в functions.php, перейдите по адресу https://ваш-сайт/wp-admin/?run_low_stock_delete=1 для запуска удаления вручную.