Диагностика проблемы
В интернет-магазинах на WooCommerce со временем накапливаются товары, которые не были ни разу заказаны. Они занимают место в базе данных, замедляют загрузку страниц и запутывают покупателей. Ручное удаление каждого такого товара — неэффективный процесс, особенно при большом ассортименте.
Как проверить, есть ли у вас такие товары? В административной панели WooCommerce можно использовать расширенный фильтр:
- Перейдите в Товары → Все товары.
- Добавьте фильтр по количеству заказов (если доступно) или экспортируйте список товаров для анализа.
Аналитика через SQL напрямую даст точные данные о товарах без продаж.
Пошаговое решение: удаление товаров без заказов с помощью PHP-кода
Для автоматизации процесса можно создать кастомный скрипт, который удалит все товары без заказов. Добавьте следующий код в файл functions.php вашей темы (рекомендуется использовать дочернюю тему) или в отдельный плагин:
function wc_delete_products_without_orders() {
if ( ! current_user_can('manage_woocommerce') ) {
return;
}
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids',
];
$product_ids = get_posts($args);
foreach ($product_ids as $product_id) {
$orders = wc_get_orders([
'limit' => 1,
'status' => ['completed', 'processing', 'on-hold'],
'product_id' => $product_id,
'return' => 'ids',
]);
if (empty($orders)) {
wp_delete_post($product_id, true); // Безвозвратно удаляет товар
}
}
}
// Для запуска вручную через WP-CLI или временно вызовите функцию
// wc_delete_products_without_orders();Объяснение кода:
- Получаем все опубликованные товары.
- Для каждого товара проверяем наличие заказов со статусом
completed,processingилиon-hold. - Если заказов нет, удаляем товар без возможности восстановления.
Автоматизация удаления с помощью WP-Cron
Чтобы запускать очистку регулярно, добавьте расписание:
if ( ! wp_next_scheduled('wc_delete_products_without_orders_event') ) {
wp_schedule_event(time(), 'daily', 'wc_delete_products_without_orders_event');
}
add_action('wc_delete_products_without_orders_event', 'wc_delete_products_without_orders');Это позволит ежедневно автоматически удалять неиспользуемые товары.
Проверка результата после внедрения
Чтобы убедиться, что удаление сработало:
- Перейдите в Товары и проверьте количество товаров — оно должно уменьшиться.
- Запустите SQL-запрос для проверки товаров без заказов, например:
SELECT p.ID, p.post_title
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.ID
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND oi.order_item_id IS NULL;Если запрос не возвращает результатов, товаров без заказов не осталось.
Частые ошибки и как их исправить
- Неверный статус заказа: Если в магазине используются кастомные статусы, их нужно добавить в фильтр
'status'вwc_get_orders. - Удаление не происходит: Проверьте права пользователя, от имени которого запускается функция. Рекомендуется добавлять проверку
current_user_can('manage_woocommerce'). - Высокая нагрузка при большом количестве товаров: Разбейте удаление по партиям с помощью
pagedиoffsetв запросах, чтобы избежать таймаутов. - Удаление товаров с вариациями: В WooCommerce вариации — отдельные записи. Удаление родительского товара удалит вариации автоматически.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Реализуйте логирование удаленных товаров для контроля.
- Используйте WP-CLI для запуска скриптов в командной строке, это быстрее и безопаснее, чем через веб-интерфейс.
- Планируйте удаление в период низкой нагрузки сайта.
Сравнение способов удаления товаров без заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, нет кода | Долго, неудобно при большом количестве товаров |
| Кастомный PHP-скрипт с WP-Cron | Автоматизация, гибкость, подходит для больших магазинов | Требует навыков разработки, возможность ошибок при неправильном коде |
| Плагины очистки (например, WPShop Clearfy Pro) | Простая настройка, дополнительные функции оптимизации | Может замедлять сайт, требует покупки и поддержки |