Диагностика проблемы: зачем нужно автоматическое удаление неактивных товаров
В магазинах на WooCommerce периодически возникают ситуации, когда товары становятся неактивными — например, их долго нет в наличии, или они сняты с производства. Накопление таких товаров усложняет навигацию, замедляет работу сайта и портит пользовательский опыт.
Ручное удаление занимает много времени и опасно — можно случайно удалить нужный товар. Автоматизация процесса с помощью CRON-задачи решит проблему, если задать чёткие критерии отбора товаров для удаления.
Как определить неактивные товары для удаления
Чаще всего под неактивными понимают товары с одним или несколькими из следующих признаков:
- статус товара
draftилиprivate; - отсутствие запасов (stock = 0) более 30 дней;
- отсутствие продаж за последние несколько месяцев;
- отсутствие активности в метаданных, например, дата последнего обновления.
Выбор критериев зависит от бизнес-логики магазина.
Пошаговое решение: настройка автоматического удаления товаров через WP-Cron
1. Добавляем функцию для поиска и удаления неактивных товаров
function wpmanual_remove_inactive_products() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'private'],
'meta_query' => [
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC'
],
[
'key' => '_stock_date', // кастомное поле с датой последнего обновления запаса
'value' => date('Y-m-d', strtotime('-30 days')),
'compare' => '<=',
'type' => 'DATE'
]
],
'fields' => 'ids',
'posts_per_page'=> -1
];
$products = get_posts($args);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // жесткое удаление
}
}Примечание: Чтобы использовать метаполе _stock_date, нужен дополнительный код, который при обновлении товара будет сохранять дату изменения запаса. Пример ниже.
2. Сохраняем дату обновления запаса
add_action('woocommerce_update_product_stock', function($product) {
update_post_meta($product->get_id(), '_stock_date', current_time('Y-m-d'));
});3. Регистрируем CRON задачу для автоматического запуска
add_action('wpmanual_delete_inactive_products_cron', 'wpmanual_remove_inactive_products');
function wpmanual_activate_cron() {
if (!wp_next_scheduled('wpmanual_delete_inactive_products_cron')) {
wp_schedule_event(time(), 'daily', 'wpmanual_delete_inactive_products_cron');
}
}
add_action('wp', 'wpmanual_activate_cron');4. Очистка CRON при деактивации плагина или темы
function wpmanual_deactivate_cron() {
$timestamp = wp_next_scheduled('wpmanual_delete_inactive_products_cron');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmanual_delete_inactive_products_cron');
}
}
register_deactivation_hook(__FILE__, 'wpmanual_deactivate_cron');Проверка результата после внедрения
- Убедитесь, что товары с нулевым остатком и статусом
draftилиprivateстарше 30 дней удаляются автоматически после запуска CRON. - Для ручного запуска можно вызвать функцию
wpmanual_remove_inactive_products()из консоли WP-CLI:wp eval 'wpmanual_remove_inactive_products();'. - Проверьте, что мета поле
_stock_dateобновляется при изменении запаса товара.
Частые ошибки и как их исправить
- CRON-задача не выполняется автоматически: Проверьте, что на сайте включен WP-Cron (нет константы
DISABLE_WP_CRONвwp-config.phpили настроен системный cron для вызоваwp-cron.php). - Товары не удаляются: Убедитесь, что критерии
post_statusи мета-запросы совпадают с реальным состоянием товаров. Для отладки выведите ID товаров, найденных запросом:
error_log(print_r($products, true));- Удаление происходит не корректно: Используйте
wp_delete_post($id, true)для полного удаления, иначе товар попадет в корзину.
Практические советы по безопасности и производительности
- Не запускайте удаление слишком часто — достаточно раз в день, чтобы не перегружать сервер.
- Перед удалением сделайте резервное копирование базы данных.
- Добавьте логирование удалённых товаров для аудита.
- Если товаров много, разбивайте удаление по партиям — например, по 50 штук за запуск, чтобы избежать таймаутов.
Сравнение вариантов автоматического удаления товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление через WP-Cron и код | Гибко, бесплатно, можно точно настроить критерии | Нужен опыт программирования, возможны ошибки без тестирования |
| Плагины для очистки товаров | Просто, быстро, часто с UI | Может не поддерживать кастомные критерии, нагрузка |
| Ручное удаление через админку | Полный контроль | Долго, риск ошибок, не автоматизировано |