Диагностика проблемы: зачем и когда нужно удалять товары автоматически
В магазине на WooCommerce накапливаются товары с нулевым остатком или устаревшие позиции, которые уже не продаются. Это замедляет админ-панель, увеличивает размер базы данных и мешает покупателям. Часто владельцы не знают, как автоматически очищать каталог без ручного труда.
Проверьте, есть ли у вас товары с остатком 0 или с датами выпуска более 6 месяцев назад (или другой подходящий срок). Для этого в админке WooCommerce перейдите в Товары, отфильтруйте по количеству остатков и дате публикации.
Пошаговое решение: автоматическое удаление товаров с нулевым остатком и по дате публикации
1. Создаем функцию для удаления товаров
Добавьте следующий код в functions.php вашей дочерней темы или в отдельный плагин:
function wc_auto_delete_out_of_stock_and_old_products() {
// Параметры: товары с остатком 0 и старше 180 дней
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => '180 days ago',
),
),
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // жесткое удаление
}
}
}2. Автоматизируем запуск с помощью WP-Cron
Добавьте расписание для запуска функции, например, ежедневно:
add_action('wc_daily_delete_products_event', 'wc_auto_delete_out_of_stock_and_old_products');
function wc_schedule_daily_product_deletion() {
if (!wp_next_scheduled('wc_daily_delete_products_event')) {
wp_schedule_event(time(), 'daily', 'wc_daily_delete_products_event');
}
}
add_action('wp', 'wc_schedule_daily_product_deletion');Проверка результата после внедрения
- Проверьте, что в базе данных действительно удалились товары с остатком 0 и датой выпуска старше 180 дней.
- В админке WooCommerce откройте список товаров и убедитесь, что ненужные позиции исчезли.
- Для отладки добавьте временно логирование в функцию удаления:
function wc_auto_delete_out_of_stock_and_old_products() {
$args = [...]; // как выше
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
error_log('Удаляем товар ID: ' . $product_id);
wp_delete_post($product_id, true);
}
} else {
error_log('Нет товаров для удаления');
}
}Частые ошибки и как исправить
- Функция не запускается регулярно: Проверьте, активирован ли WP-Cron. Если нет, настройте системный CRON на вызов
wp-cron.php. - Удаляются не те товары: Убедитесь, что мета-ключ
_stock_statusсуществует и принимает значениеoutofstock. Можно проверить через базу данных или var_dump продуктов. - Удаление не происходит из-за прав: Запуск кода должен быть с правами администратора. Ошибки в логах помогут выявить проблемы с правами доступа.
- Нагрузка на сервер при большом количестве товаров: Используйте постраничный разбивку (pagination) для выборки товаров и удаляйте не все сразу.
Практические советы по безопасности и производительности
- Настройте резервное копирование перед автоматическим удалением.
- Используйте
wp_delete_postс параметромtrueдля полного удаления, включая метаданные. - Для больших магазинов реализуйте пакетное удаление по 50 товаров за один запуск, чтобы избежать таймаутов.
- Тестируйте на staging-среде перед применением на рабочем сайте.
Альтернативные подходы: плагин vs код
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код (как в статье) | Точный контроль, без сторонних зависимостей, кастомизация | Требует навыков, возможны ошибки при неправильном коде | Для разработчиков и кастомных решений |
| Плагин управления товарами | Простой интерфейс, готовые функции, поддержка | Может нагружать сайт, меньше гибкости, платные версии | Для пользователей без навыков программирования |