Диагностика проблемы: зачем и когда нужно удалять неактивные товары
В WooCommerce со временем накапливаются товары, которые не продаются, неактивны или устарели. Это ведёт к раздуванию базы данных, замедлению административной панели и усложнению управления каталогом. Ручное удаление товаров — трудоёмкий процесс, особенно если таких товаров много.
Цель: автоматически удалять товары, которые помечены как неактивные и не обновлялись длительное время, например, старше 6 месяцев.
Как определить неактивные товары
В WooCommerce статус товара может быть разным — опубликован, черновик, ожидает проверки и пр. Для удаления обычно выбирают товары со статусом draft или private, которые не обновлялись длительное время.
Проверить статус и дату изменения товара можно через SQL или WP_Query.
Пример запроса WP_Query для диагностики
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'private'],
'date_query' => [
[
'column' => 'post_modified',
'before' => '6 months ago',
],
],
'posts_per_page' => 10
];
$query = new WP_Query($args);
foreach ($query->posts as $post) {
error_log('Неактивный товар: ' . $post->ID . ' - ' . $post->post_title);
}
Этот код выведет первые 10 неактивных товаров, не обновлявшихся более 6 месяцев.
Пошаговое решение: автоматическое удаление неактивных товаров через WP-Cron
1. Добавьте кастомную функцию, которая будет искать и удалять товары с нужными параметрами.
function wc_remove_inactive_products() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'private'],
'date_query' => [
[
'column' => 'post_modified',
'before' => '6 months ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true — удалить без корзины
}
}
}
2. Зарегистрируйте событие WP-Cron для запуска функции автоматически (например, раз в сутки):
if (!wp_next_scheduled('wc_daily_remove_inactive_products')) {
wp_schedule_event(time(), 'daily', 'wc_daily_remove_inactive_products');
}
add_action('wc_daily_remove_inactive_products', 'wc_remove_inactive_products');
3. Добавьте этот код в functions.php вашей темы или в кастомный плагин.
Проверка результата после внедрения
- Через базу данных или админку проверьте наличие товаров со статусом
draftилиprivate, изменённых больше 6 месяцев назад — они должны исчезнуть. - Для отладки добавьте в функцию
error_log()перед удалением, чтобы увидеть список удаляемых товаров. - Проверьте логи сервера на наличие ошибок при запуске WP-Cron.
Частые ошибки и как их исправить
- WP-Cron не срабатывает: Если WP-Cron не запускается автоматически (например, из-за низкой посещаемости сайта), настройте системный cron на сервере для вызова
wp-cron.php. - Удаление происходит не по плану: Проверьте, что событие
wc_daily_remove_inactive_productsзарегистрировано черезwp_next_scheduled()и не дублируется. - Удаляются нужные товары: Убедитесь, что условие
post_statusиdate_queryправильно настроены. Желательно протестировать функцию на тестовом сайте. - Переполнение памяти или таймаут: Если много товаров под удаление, разбейте процесс на партии с параметром
posts_per_page(например, 50).
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед автоматическим удалением.
- Используйте
wp_delete_post($id, true)с параметромtrueдля полного удаления, но будьте осторожны — восстановить будет сложно. - Для больших магазинов оптимизируйте запрос с пагинацией и ограничением количества удаляемых товаров за один проход.
- Логируйте удалённые товары в отдельный файл для возможного аудита.
- Проверяйте, что не удаляются товары, которые могли быть временно сняты с публикации по другим причинам.
Сравнение вариантов реализации автоматического удаления неактивных товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кастомным кодом | Гибкость, контроль, нет лишних плагинов | Зависит от WP-Cron, требует навыков программирования |
| Плагин для очистки WooCommerce | Простота установки, готовые функции | Могут быть избыточными, нагрузка, ограничения настроек |
| Ручное удаление через админку | Полный контроль, нет риска автоматических ошибок | Трудоёмко, не подходит для больших каталогов |