Диагностика проблемы: зачем автоматически удалять товары
В интернет-магазинах на 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 или админку | Простота при малом количестве товаров | Неавтоматично, риск ошибок | Подходит для редких случаев |