Проблема: накопление устаревших товаров в WooCommerce
При большом ассортименте в WooCommerce часто возникает задача автоматически удалять товары, которые устарели или давно не обновлялись, чтобы не загромождать каталог и не портить пользовательский опыт. Ручное удаление занимает много времени, а плагинов с подобной глубокой автоматизацией мало.
Диагностика: как определить, что товары устарели
Основным критерием может быть дата публикации товара (post_date) или дата последнего обновления (post_modified). Например, товары старше 180 дней считаются устаревшими. Также можно учитывать статус товара или наличие заказов.
Проверка товаров по дате публикации в базе данных
SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' ORDER BY post_date ASC LIMIT 10;Это позволит увидеть самые старые опубликованные товары.
Пошаговое решение: автоматизация удаления старых товаров
1. Создание функции удаления товаров
function delete_old_woocommerce_products() {
$days_threshold = 180; // товары старше 180 дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'fields' => 'ids',
'posts_per_page' => 100,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - удалить без корзины
}
}
}2. Запуск функции по расписанию с помощью WP-Cron
if (!wp_next_scheduled('delete_old_products_daily_event')) {
wp_schedule_event(time(), 'daily', 'delete_old_products_daily_event');
}
add_action('delete_old_products_daily_event', 'delete_old_woocommerce_products');Этот код запускает функцию удаления товаров один раз в сутки.
Проверка результата после внедрения
- В админке WooCommerce проверьте количество товаров до и после запуска задачи.
- В базе данных через phpMyAdmin выполните запрос на поиск товаров с датой старше 180 дней - их должно не быть.
- Для отладки можно временно добавить логирование удаляемых ID в файл
wp-content/debug.logс помощьюerror_log($product_id);.
Частые ошибки и способы их исправления
- Неправильный формат даты или временная зона: убедитесь, что
date('Y-m-d H:i:s')совпадает с временной зоной сайта (Settings > General). - WP-Cron не срабатывает: проверьте, активен ли wp-cron и нет ли конфликтов с плагинами кэширования. Для теста можно вручную запустить задачу через плагин WP Crontrol.
- Удаляются нужные товары: добавьте дополнительную фильтрацию по меткам, категориям или статусу, чтобы избежать удаления важных позиций.
- Большая нагрузка при удалении: лимитируйте количество удаляемых товаров за один запуск и используйте транзиенты для отслеживания прогресса.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед массовым удалением.
- Для больших магазинов разбивайте удаление на партии по 50-100 товаров.
- Используйте
wp_delete_post($id, true)для полного удаления, иначе товары попадут в корзину и будут занимать место. - Ограничьте права на запуск удаления только администраторам, если добавляете интерфейс.
Сравнение способов автоматического удаления товаров
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код на PHP + WP-Cron | Гибко, бесплатно, без лишних плагинов | Требует навыков, возможен сбой wp-cron | Использовать WP Crontrol для контроля задач |
| Плагин для автоматизации | Просто настроить, есть UI | Может быть платным, нагрузка на сайт | Выбирать легкие и проверенные плагины |
| Ручное удаление | Полный контроль | Очень трудоемко при большом каталоге | Использовать для мелких магазинов |