Диагностика: зачем автоматизировать удаление старых товаров в WooCommerce
В интернет-магазинах на WooCommerce накапливается множество товаров, которые устарели, вышли из продажи или давно не покупаются. Ручное удаление таких записей трудозатратно и может привести к ошибкам. Автоматизация этого процесса помогает поддерживать базу данных в актуальном состоянии, улучшать производительность и облегчать работу администратору.
Как определить товары для удаления: критерии выбора
Чаще всего старый контент в WooCommerce удаляют по одним из следующих критериев:
- Товары, которые не обновлялись более X месяцев (например, 6–12 месяцев).
- Товары со статусом "черновик" или "в ожидании", которые не публиковались длительное время.
- Товары без заказов за определённый период.
Для реализации автоматического удаления нужно выбрать и настроить один из критериев или их комбинацию.
Пошаговое решение: автоматическое удаление товаров по дате последнего обновления
1. Создаём функцию для удаления товаров старше 6 месяцев
function wpreset_delete_old_products() {
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_modified',
'before' => '6 months 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); // Полное удаление
}
}
}2. Запускаем функцию через WP-Cron раз в неделю
if (!wp_next_scheduled('wpreset_weekly_delete_old_products')) {
wp_schedule_event(time(), 'weekly', 'wpreset_weekly_delete_old_products');
}
add_action('wpreset_weekly_delete_old_products', 'wpreset_delete_old_products');3. Добавляем уведомление в лог (по желанию)
function wpreset_delete_old_products() {
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_modified',
'before' => '6 months 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);
}
error_log('WPReset: удалено ' . count($old_products) . ' старых товаров WooCommerce');
}
}Проверка результата после внедрения
- В админке WooCommerce проверьте раздел «Товары» — товары старше 6 месяцев должны отсутствовать.
- Просмотрите системный лог PHP (error_log) на предмет сообщений от вашей функции.
- Можно временно заменить
wp_delete_postнаerror_log('Удаляем товар ID: ' . $product_id);для отладки без удаления.
Частые ошибки и как их исправить
- Функция не запускается: Проверьте, что WP-Cron включён. Для теста вызовите функцию вручную.
- Удаляются не все товары: Проверьте правильность
date_query— дата берётся из поляpost_modified. Если нужно по дате создания, используйтеpost_date. - Удаление не полное: Аргумент
wp_delete_post($id, true)отвечает за полное удаление. Если он не true, пост перемещается в корзину. - Нагрузка на сервер: При большом количестве товаров делайте удаление пакетами (например, по 50 товаров за запуск).
Советы по безопасности и производительности
- Используйте
current_user_can('delete_posts'), если вызываете функцию из интерфейса. - Для крупных магазинов делайте удаление пакетами, чтобы не перегружать сервер.
- Резервное копирование базы перед запуском автоматического удаления — обязательно.
- Добавьте проверку на необходимость удаления только товаров без заказов, если хотите сохранить исторические данные.
Альтернативные методы: сравнение
| Метод | Преимущества | Недостатки |
|---|---|---|
| Самописный WP-Cron скрипт | Гибкость, контроль, нет лишних плагинов | Требует навыков программирования, возможно нагрузка |
| Плагин автоматизации (например, WP Reset с задачами) | Простота установки, поддержка, логи | Может быть избыточным, зависит от сторонних обновлений |
| Ручное удаление через админку | Простота для небольших магазинов | Неэффективно при большом объёме, риск ошибок |