Диагностика проблемы: зачем удалять скрытые товары без продаж
В интернет-магазинах на WooCommerce часто накапливаются товары, которые скрыты от покупателей (статус "скрыт") и не продаются длительное время. Это увеличивает нагрузку на базу данных, замедляет админ-панель и усложняет навигацию. Регулярное удаление таких товаров помогает поддерживать чистоту каталога и оптимизировать производительность.
Как определить товары, которые нужно удалить
Для удаления нам нужны товары, которые одновременно удовлетворяют условиям:
- Статус публикации
private(скрытые товары); - Отсутствие продаж за последние 30 дней;
- Дата последнего обновления или публикации более 30 дней назад.
Проверка продаж — по мета-данным заказа и связке с товаром.
Диагностика: как проверить, какие товары подходят под критерии
Для диагностики можно использовать SQL-запрос к базе данных (предварительно сделайте бэкап):
SELECT p.ID, p.post_title, MAX(o.post_date) AS last_order_date
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_type = 'line_item'
LEFT JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
LEFT JOIN wp_posts o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product' AND p.post_status = 'private'
AND oim.meta_key = '_product_id' AND oim.meta_value = p.ID
GROUP BY p.ID
HAVING (last_order_date IS NULL OR last_order_date < DATE_SUB(NOW(), INTERVAL 30 DAY))
AND p.post_modified < DATE_SUB(NOW(), INTERVAL 30 DAY);Этот запрос покажет скрытые товары, у которых не было заказов за последние 30 дней и которые не обновлялись более 30 дней.
Пошаговое решение: как автоматически удалять скрытые товары без продаж
Используем планировщик задач WordPress (WP-Cron) с кастомной функцией. Пример кода для файла functions.php или собственного плагина:
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wc_delete_hidden_products_cron')) {
wp_schedule_event(time(), 'daily', 'wc_delete_hidden_products_cron');
}
});
add_action('wc_delete_hidden_products_cron', 'wc_delete_hidden_products');
function wc_delete_hidden_products() {
global $wpdb;
// Получаем ID скрытых товаров без продаж и обновлений более 30 дней
$query = "
SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_type = 'line_item'
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
LEFT JOIN {$wpdb->posts} o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product' AND p.post_status = 'private'
AND oim.meta_key = '_product_id' AND oim.meta_value = p.ID
GROUP BY p.ID
HAVING (MAX(o.post_date) IS NULL OR MAX(o.post_date) < DATE_SUB(NOW(), INTERVAL 30 DAY))
AND p.post_modified < DATE_SUB(NOW(), INTERVAL 30 DAY)
";
$product_ids = $wpdb->get_col($query);
if (empty($product_ids)) {
return; // Нет товаров для удаления
}
foreach ($product_ids as $product_id) {
wp_delete_post($product_id, true); // Полное удаление
}
}Объяснение кода
- Планируется ежедневный запуск задачи
wc_delete_hidden_products_cron. - В функции
wc_delete_hidden_productsвыполняется запрос для выбора товаров по критериям. - Удаление выполняется через
wp_delete_post()с параметромtrueдля полного удаления.
Проверка результата после внедрения
- Выполните вручную запуск cron-функции через WP CLI или временно добавьте вызов функции в
functions.phpдля теста. - Проверьте, что скрытые товары с отсутствием продаж и давностью обновления больше 30 дней исчезли из админки WooCommerce.
- Запустите SQL-запрос диагностики снова — список должен быть пуст.
Частые ошибки и как их исправить
- Проблема: Cron-задача не запускается.
Решение: Проверьте работу WP-Cron, можно использовать плагин WP Crontrol для проверки и запуска задач вручную. - Проблема: Запрос не находит товары, хотя они есть.
Решение: Убедитесь, что товары действительно имеют статусprivate, и что заказы имеют статусыwc-completedилиwc-processing. В запросе иногда нужно адаптировать префиксы таблиц. - Проблема: Удаление не происходит из-за прав.
Решение: Функция выполняется под пользователем с правами администратора или из кода, где есть права на удаление постов.
Практические советы по безопасности и производительности
- Перед запуском автоматического удаления сделайте резервную копию базы данных.
- Убедитесь, что cron-задача не запускается слишком часто — достаточно раз в сутки.
- Для больших магазинов оптимизируйте запрос, добавляя лимиты и постраничную обработку.
- Рекомендуется тестировать код на staging-сервере перед производством.
Сравнение подходов удаления скрытых товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление в админке | Удаление товаров вручную через панель WooCommerce | Простота, контроль | Неэффективно для большого количества товаров |
| Плагин для очистки каталога | Использование плагина с настройками фильтрации | Удобство, интерфейс | Дополнительные зависимости, нагрузка |
| Код с WP-Cron | Автоматизированное удаление через кастомный код | Гибкость, отсутствие лишних плагинов | Требует навыков, возможны ошибки без тестирования |