Диагностика проблемы: почему важно удалять старые товары
В интернет-магазинах на WooCommerce со временем накапливаются товары, которые устарели, неактуальны или сняты с производства. Их хранение влияет на производительность сайта, увеличивает размер базы данных и затрудняет администрирование каталога. Ручное удаление таких товаров неудобно и требует времени, особенно если их много.
Автоматизация процесса через WP-Cron позволяет регулярно очищать каталог от старых товаров без вмешательства администратора.
Пошаговое решение: настройка WP-Cron для удаления товаров по дате
1. Выбор критерия удаления
Для примера возьмём удаление товаров, которые не обновлялись более 180 дней. Это можно сделать по дате изменения записи (post_modified).
2. Создание функции удаления старых товаров
Добавим в файл functions.php вашей темы или в отдельный плагин следующий код:
function wpunit_delete_old_woocommerce_products() {
global $wpdb;
// Определяем дату 180 дней назад
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
// Получаем ID товаров, не обновлявшихся более 180 дней
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'product'
AND post_modified < %s
AND post_status != 'trash'",
$date_threshold
));
if (!empty($product_ids)) {
foreach ($product_ids as $product_id) {
wp_trash_post($product_id); // отправляем в корзину
}
}
}3. Регистрация WP-Cron задачи
Далее регистрируем событие, которое будет запускать эту функцию раз в сутки:
if (!wp_next_scheduled('wpunit_daily_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'wpunit_daily_delete_old_products');
}
add_action('wpunit_daily_delete_old_products', 'wpunit_delete_old_woocommerce_products');4. Очистка при деактивации
Чтобы избежать накопления запланированных задач, удалим их при деактивации плагина или отключении темы:
function wpunit_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wpunit_daily_delete_old_products');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpunit_daily_delete_old_products');
}
}
register_deactivation_hook(__FILE__, 'wpunit_deactivate_cleanup');Проверка результата после внедрения
- Для теста можно временно изменить период в функции на 1 день, чтобы увидеть, что товары старше суток попадут в корзину.
- Проверяйте в админке раздел «Товары» — старые товары должны перемещаться в корзину.
- Можно использовать WP-CLI команду
wp cron event run wpunit_daily_delete_old_productsдля немедленного запуска задачи. - Логи ошибок включайте через
define('WP_DEBUG_LOG', true);вwp-config.phpдля отслеживания сбоев.
Частые ошибки и как исправить
- WP-Cron не срабатывает: В средах с низким трафиком cron-задачи могут не запускаться вовремя. Решение — настроить системный cron на сервере для вызова
wp-cron.phpкаждые 15 минут. - Удаляются не те товары: Проверьте правильность условия выборки в SQL, возможно, нужно изменить дату или статус поста.
- Проблемы с правами доступа: Убедитесь, что пользователь, запускающий WP-Cron, имеет права на удаление товаров.
- Медленная работа при большом количестве товаров: Разбейте удаление на части, например, удалять по 50 товаров за один запуск.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()вместоwp_delete_post()для возможности восстановления товаров из корзины. - Для больших сайтов распараллельте удаление с помощью transients и AJAX, чтобы не создавать нагрузку на сервер.
- Регулярно очищайте корзину товаров, чтобы база данных не разрасталась.
- Логируйте действия удаления в отдельный файл для аудита и отладки.
Сравнение вариантов удаления старых товаров
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Долго, неудобно на больших каталогах |
| WP-Cron с кастомным кодом | Автоматизация, гибкость, без плагинов | Зависимость от посещаемости сайта, требует навыков разработки |
| Плагины очистки WooCommerce | Простота настройки, интерфейс | Нагрузка, возможные конфликты, платные функции |