Диагностика задачи: зачем и когда удалять товары автоматически
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически удалять товары, которые устарели, неактивны или не продаются длительное время. Это помогает поддерживать актуальность ассортимента, снижать нагрузку на базу данных и улучшать производительность сайта.
Чаще всего удаляют товары по двум параметрам:
- Дата создания или последнего обновления товара — удалять товары старше определенного периода;
- Статус товара — удалять черновики, неактивные или товары с определенным статусом.
Пошаговое решение: автоматическое удаление товаров по дате и статусу
1. Создаем WP-Cron задачу для периодического запуска
Для автоматизации используем встроенную систему планировщика заданий WordPress — WP-Cron. Добавим событие, которое будет запускаться ежедневно.
function wpr_add_daily_cron_event() {
if (!wp_next_scheduled('wpr_delete_old_products_cron')) {
wp_schedule_event(time(), 'daily', 'wpr_delete_old_products_cron');
}
}
add_action('wp', 'wpr_add_daily_cron_event');
2. Функция удаления товаров по параметрам
Определим функцию, которая будет искать и удалять товары старше 90 дней с определенными статусами (например, 'draft' и 'private').
function wpr_delete_old_products() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'private'],
'date_query' => [
[
'column' => 'post_date',
'before' => '90 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_products = get_posts($args);
if (!empty($old_products)) {
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true); // true — полный удаление без перемещения в корзину
}
}
}
add_action('wpr_delete_old_products_cron', 'wpr_delete_old_products');
3. Очистка WP-Cron при деактивации плагина или темы
Чтобы избежать накопления ненужных задач, добавим очистку при деактивации.
function wpr_remove_cron_event() {
$timestamp = wp_next_scheduled('wpr_delete_old_products_cron');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpr_delete_old_products_cron');
}
}
register_deactivation_hook(__FILE__, 'wpr_remove_cron_event');
Как проверить, что автоматическое удаление работает
- Добавьте несколько тестовых товаров с нужным статусом (draft или private) и датой создания более 90 дней назад (можно изменить дату вручную через базу или плагин для управления датами постов).
- Запустите WP-Cron вручную с помощью плагина WP Crontrol или вызовите функцию
wpr_delete_old_products()напрямую через консоль WP-CLI или временный вызов в теме. - Проверьте, что товары удалились из админки WooCommerce и отсутствуют в базе (таблица
wp_posts). - Убедитесь, что в логе ошибок нет предупреждений или ошибок.
Частые ошибки и их исправление
- Товары не удаляются: возможно, WP-Cron не запускается из-за низкого трафика. Решение — настроить системный cron на сервере или запускать вручную через WP-CLI.
- Удаляются не те товары: проверьте параметры
post_statusиdate_query, убедитесь, что даты и статусы соответствуют. - Проблемы с правами доступа: убедитесь, что пользователь, под которым выполняется скрипт, имеет права на удаление записей.
- Удаление замедляет сайт: если товаров много, разбейте удаление на партии по 20-50 штук за один запуск.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($post_id, true)с параметромtrueдля полного удаления без перемещения в корзину, чтобы не засорять базу. - Регулярно создавайте резервные копии перед автоматическим удалением, чтобы избежать потери данных.
- Для больших магазинов используйте отложенное удаление по частям, чтобы избежать таймаутов.
- Проверяйте логи ошибок и активируйте WP_DEBUG на тестовом сервере перед внедрением.
Сравнение вариантов удаления товаров
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| WP-Cron + кастомный код (как в статье) | Гибко, бесплатно, без плагинов, можно подстроить под любые условия | Зависит от WP-Cron, требует навыков разработки | Подходит для разработчиков и опытных администраторов |
| Плагины очистки WooCommerce (например, WP Reset) | Удобный интерфейс, быстрый запуск, готовые функции | Может удалять больше, чем нужно, есть риск потери важных данных | Для пользователей без навыков программирования, но с рисками |
| Ручное удаление через админку | Простота, контроль | Трудозатратно, не подходит для больших объемов | Малые магазины с небольшим каталогом |