Диагностика проблемы: зачем удалять неактивные товары в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются товары, которые не продаются и не вызывают интереса покупателей. Это может замедлять работу сайта, создавать путаницу и ухудшать SEO-за счет большого количества неактуальных страниц. Особо проблематично, когда таких товаров много и они не обновляются вручную.
Ключевой вопрос: как автоматически выявлять и удалять товары, которые не продаются и имеют мало или нет отзывов, чтобы поддерживать актуальность каталога без ручной проверки?
Основные критерии для удаления товаров
- Отсутствие продаж за заданный период (например, 6 месяцев)
- Отсутствие или очень низкое количество отзывов (например, менее 3)
- Статус товара — опубликованный, чтобы не удалять черновики и архивные записи случайно
Пошаговое решение: автоматическое удаление товаров на основе продаж и отзывов
1. Создаем функцию для выборки и удаления товаров
В functions.php активной темы или в собственном плагине добавьте следующий код:
function wpcoder_delete_inactive_products() {
global $wpdb;
$months_no_sales = 6;
$min_reviews = 3;
// Дата, начиная с которой считаем продажи
$date_limit = date('Y-m-d H:i:s', strtotime('-' . $months_no_sales . ' months'));
// Получаем ID товаров, у которых нет заказов за последние $months_no_sales месяцев
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN (
SELECT order_item_meta.meta_value AS product_id, MAX(p2.post_date) AS last_order_date
FROM {$wpdb->prefix}woocommerce_order_items order_items
JOIN {$wpdb->prefix}woocommerce_order_itemmeta order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
JOIN {$wpdb->posts} p2 ON p2.ID = order_items.order_id
WHERE order_item_meta.meta_key = '_product_id'
AND p2.post_type = 'shop_order'
AND p2.post_status IN ('wc-completed', 'wc-processing')
GROUP BY product_id
) sales ON sales.product_id = p.ID
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND (sales.last_order_date IS NULL OR sales.last_order_date < %s)",
$date_limit
));
if (empty($product_ids)) {
return 'Нет товаров для удаления';
}
// Фильтруем товары по количеству отзывов
$products_to_delete = [];
foreach ($product_ids as $product_id) {
$comments_count = get_approved_comments_number($product_id);
if ($comments_count < $min_reviews) {
$products_to_delete[] = $product_id;
}
}
// Удаляем выбранные товары
foreach ($products_to_delete as $prod_id) {
wp_delete_post($prod_id, true); // true - без перемещения в корзину
}
return count($products_to_delete) . ' товаров успешно удалено';
}2. Запуск скрипта через WP-Cron
Чтобы удаление происходило регулярно, зарегистрируем планировщик:
add_action('wpcoder_daily_product_cleanup', 'wpcoder_delete_inactive_products');
// Регистрируем ежедневное событие при активации темы или плагина
if (!wp_next_scheduled('wpcoder_daily_product_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpcoder_daily_product_cleanup');
}3. Запуск проверки вручную (для теста)
Вы можете вызвать функцию вручную, например, добавив временный код:
add_action('admin_init', function() {
if (current_user_can('manage_options') && isset($_GET['run_cleanup'])) {
$result = wpcoder_delete_inactive_products();
wp_die($result);
}
});После этого зайдите в админку WordPress с параметром ?run_cleanup=1 в URL, например https://example.com/wp-admin/?run_cleanup=1.
Как проверить, что решение сработало
- Перед запуском сделайте резервную копию базы и файлов.
- В админке WooCommerce проверьте количество опубликованных товаров.
- Запустите ручной запуск по инструкции выше и проверьте сообщение с количеством удаленных товаров.
- Проверьте базу данных или список товаров — удаленные должны исчезнуть.
- В логах сервера/WordPress ошибок не должно быть ошибок.
Частые ошибки и их исправление
- Нет удаления товаров: возможно, неправильный подсчет продаж или комментариев. Проверьте, что заказы действительно имеют статусы
wc-completedилиwc-processing. - Удаляются лишние товары: проверьте параметры
$months_no_salesи$min_reviews, возможно, они слишком жесткие. - Функция wp_delete_post не срабатывает: убедитесь, что код вызывается с правами администратора и что нет конфликтов с плагинами безопасности.
- Проблемы с WP-Cron: проверьте, что на сайте включен WP-Cron и что нет ограничений на запуск задач.
Практические советы по безопасности и производительности
- Перед массовым удалением делайте резервное копирование базы и файлов.
- Используйте транзакции и проверки при работе с базой (при необходимости дорабатывать код).
- Ограничьте запуск удаления до разовых или редких задач — не чаще 1 раза в сутки.
- Если товаров очень много, разбейте удаление на партии по 50-100 штук за один запуск, чтобы не перегружать сервер.
- Используйте плагины Clearfy Pro для оптимизации и удаления дублей, чтобы дополнительно ускорить сайт и очистить базу.
Сравнение вариантов удаления неактивных товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Полный контроль, нет кода | Трудоемко, неэффективно на больших каталогах |
| Код с автоматическим удалением (описанный) | Автоматизация, гибкие критерии | Требует навыков, возможны ошибки без теста |
| Плагины оптимизации (например, Clearfy Pro) | Удобство, дополнительные функции очистки | Платные, могут конфликтовать с кастомным кодом |