Проблема: накопление неактивных товаров в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда в каталоге остаются товары, которые долго не обновлялись или не продаются. Это создаёт бардак, замедляет поиск и негативно влияет на пользовательский опыт и SEO. Автоматическое удаление таких товаров позволяет поддерживать базу в актуальном состоянии без ручной работы.
Диагностика: как определить неактивные товары
Под неактивными товарами будем понимать те, у которых:
- нет продаж за заданный период (например, 6 месяцев);
- статус товара опубликован, но дата последнего обновления превышает порог;
- нет активности в виде просмотров или заказов (если есть сбор статистики).
Для простой автоматизации возьмём критерий последнего обновления товара — дата post_modified. Если товар не менялся более 180 дней, его можно считать устаревшим.
Пошаговое решение: скрипт для автоматического удаления товаров
1. Создаём функцию для выборки устаревших товаров
function get_old_woocommerce_products($days = 180) {
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days'));
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_modified',
'before' => $date_threshold,
]
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
return $query->posts;
}
2. Функция для массового удаления товаров по ID
function delete_products_by_ids(array $product_ids) {
foreach ($product_ids as $id) {
wp_delete_post($id, true); // true — удаление в обход корзины
}
}
3. Автоматизация через WP-Cron
Добавим задачу, которая будет запускаться ежедневно и удалять устаревшие товары.
if (!wp_next_scheduled('daily_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'daily_delete_old_products');
}
add_action('daily_delete_old_products', function() {
$old_products = get_old_woocommerce_products(180);
if (!empty($old_products)) {
delete_products_by_ids($old_products);
}
});
Проверка результата после внедрения
- Проверьте через админку WooCommerce — устаревшие товары должны исчезнуть.
- Запустите вручную функцию удаления, если нужно — через WP-CLI:
wp eval 'delete_products_by_ids(get_old_woocommerce_products(180));'. - Проверьте логи сервера и WordPress на предмет ошибок удаления.
- Создайте тестовый товар с датой изменения больше 180 дней назад, чтобы убедиться, что он удаляется автоматически.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, включен ли WP-Cron, или запустите cron вручную (
wp cron event run --due-now). - Удаляются товары, которые не должны: убедитесь, что критерий отбора корректен, возможно, нужно добавить дополнительные фильтры (например, по продажам или статусу).
- Потеря данных: перед внедрением обязательно сделайте резервную копию базы данных.
- Высокая нагрузка при большом количестве товаров: разбейте удаление на порции, например по 50 товаров за запуск.
Практические советы по безопасности и производительности
- Используйте параметр
wp_delete_postс$force_delete = trueдля полного удаления, но будьте осторожны — восстановление будет невозможно. - Добавьте проверку nonce и прав пользователя, если планируете запускать удаление с интерфейса.
- Для больших магазинов делайте удаление в пакетах — можно хранить состояние удаления через опции WordPress.
- Логируйте удалённые товары в отдельный файл для последующего аудита.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простой контроль | Трудозатратно, ошибки при больших объёмах |
| Автоматический скрипт с WP-Cron (код) | Автоматизация, гибкость настройки | Нужно следить за работой cron, возможна нагрузка |
| Плагины очистки WooCommerce | Простота установки, готовые интерфейсы | Могут быть перегружены ненужными функциями, влиять на производительность |