Диагностика проблемы: зачем и когда удалять неактивные продукты
В WooCommerce с ростом ассортимента часто накапливаются продукты, которые не продаются или не обновлялись долгое время. Они замедляют работу административной панели и увеличивают размер базы данных. Автоматическое удаление таких товаров помогает поддерживать чистоту каталога и ускорять работу сайта.
Как определить неактивные продукты
Чаще всего под неактивными продуктами понимают те, у которых:
- отсутствуют продажи за последний год (или выбранный период);
- продукт не обновлялся или не просматривался;
- статус "черновик" или "ожидает" в течение длительного времени.
Выявить такие товары можно с помощью SQL-запроса к базе данных или через код PHP с использованием WP_Query.
Пошаговое решение: автоматическое удаление неактивных продуктов
1. Создаем функцию для выборки неактивных товаров
function wpweb_get_inactive_products( $days = 365 ) {
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'date_query' => [
[
'column' => 'post_modified',
'before' => $date_threshold,
],
],
'post_status' => 'publish',
'meta_query' => [
[
'key' => 'total_sales',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC',
],
],
'fields' => 'ids',
];
return get_posts( $args );
}Эта функция вернет ID продуктов, которые не обновлялись более 365 дней и у которых нет продаж.
2. Функция удаления продуктов по ID
function wpweb_delete_products( $product_ids ) {
foreach ( $product_ids as $id ) {
wp_delete_post( $id, true ); // true — удаление без возможности восстановления
}
}3. Автоматизация через WP-Cron
Добавим задачу, которая будет запускать удаление раз в месяц:
if ( ! wp_next_scheduled( 'wpweb_delete_inactive_products_cron' ) ) {
wp_schedule_event( time(), 'monthly', 'wpweb_delete_inactive_products_cron' );
}
add_action( 'wpweb_delete_inactive_products_cron', function() {
$inactive_products = wpweb_get_inactive_products( 365 );
if ( ! empty( $inactive_products ) ) {
wpweb_delete_products( $inactive_products );
}
});Проверка результата после внедрения
- В админ-панели WooCommerce зайдите в раздел "Товары" и проверьте, что продукты, соответствующие критериям (без продаж и не обновлявшиеся более года), удалены.
- Выполните вручную функцию
wpweb_get_inactive_products(365)через отладчик или временный вызов, чтобы проверить список до удаления. - Проверьте логи сервера, чтобы убедиться, что задача WP-Cron срабатывает без ошибок.
Частые ошибки и как их исправить
- Продукты не удаляются: проверьте, что функция
wp_delete_postвызывается с параметромtrueдля полного удаления. Убедитесь в наличии прав на удаление у пользователя. - Удаляются нужные продукты: уточните критерии фильтрации, возможно, стоит увеличить период или добавить дополнительные проверки, например, по статусу продукта.
- Задача WP-Cron не запускается: проверьте, включен ли WP-Cron в настройках сайта (константа
DISABLE_WP_CRONне установлена в true). Для теста вызовите вручнуюdo_action('wpweb_delete_inactive_products_cron').
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных, особенно если у вас много товаров.
- Для больших магазинов с тысячами товаров используйте пакетную обработку (например, удалять по 50-100 товаров за раз), чтобы избежать превышения лимита времени выполнения скрипта.
- Добавьте логирование удаленных продуктов в файл, чтобы при необходимости можно было отследить удаление.
- Используйте пользовательские роли и права доступа, чтобы ограничить возможность удаления только администраторам.
Чек-лист для внедрения автоматического удаления неактивных продуктов
- Определить критерии "неактивности" продукта (продажи, дата обновления).
- Написать функцию выборки неактивных товаров.
- Реализовать функцию удаления товаров по ID.
- Настроить WP-Cron для регулярного запуска удаления.
- Проверить корректность работы на тестовом сайте.
- Сделать резервную копию перед первой массовой очисткой.
- Добавить логирование и уведомления (по желанию).
Сравнение подходов: плагин vs собственный код
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WP Bulk Delete) | Удобный интерфейс, готовые фильтры, поддержка расписаний | Дополнитель нагрузка, возможны конфликты, ограниченная гибкость |
| Собственный код (как описано выше) | Точная настройка, минимальная нагрузка, полный контроль | Требует навыков программирования, нужно тестировать и поддерживать |