Диагностика проблемы: зачем нужно удалять товары с низкими продажами
В магазинах на WooCommerce нередко накапливаются товары, которые практически не продаются. Они занимают место в базе данных, замедляют работу сайта и мешают анализу ассортимента. Ручное удаление таких товаров — трудоёмкий и ошибкоопасный процесс, особенно при большом каталоге.
Чтобы убедиться, что в вашем магазине есть такие товары, выполните SQL-запрос к базе данных, который покажет количество продаж по каждому товару за последний год:
SELECT p.ID, p.post_title, IFNULL(SUM(oi.qty), 0) AS total_sales
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON p.ID = oi.order_item_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
GROUP BY p.ID
ORDER BY total_sales ASC;Если среди товаров много с нулевыми или минимальными продажами, стоит рассмотреть автоматизацию их удаления.
Пошаговое решение: как автоматически удалять товары с низкими продажами
1. Создаем функцию для определения низкопродаваемых товаров
Используем WP_Query для выборки товаров с продажами ниже заданного порога за последний год.
function get_low_sales_products( $sales_threshold = 5 ) {
global $wpdb;
$date_from = date( 'Y-m-d', strtotime( '-1 year' ) );
$query = $wpdb->prepare(
"SELECT p.ID, p.post_title, COALESCE(SUM(oi_meta.meta_value), 0) AS total_sales
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_item_id
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oi_meta ON oi.order_item_id = oi_meta.order_item_id AND oi_meta.meta_key = '_qty'
INNER JOIN {$wpdb->posts} o ON o.ID = oi.order_id AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product' AND p.post_status = 'publish' AND o.post_date >= %s
GROUP BY p.ID
HAVING total_sales < %d",
$date_from,
$sales_threshold
);
return $wpdb->get_results( $query );
}2. Функция для удаления товаров
Удаляем товары программно через wp_delete_post(), чтобы корректно очистить все данные.
function delete_products_by_ids( $product_ids ) {
foreach ( $product_ids as $product ) {
wp_delete_post( $product->ID, true ); // true - принудительное удаление без перемещения в корзину
}
}3. Запуск удаления по расписанию с использованием WP-Cron
Добавим событие, которое будет запускать удаление раз в месяц.
add_action( 'wp_low_sales_products_cleanup', 'low_sales_products_cleanup_callback' );
function low_sales_products_cleanup_callback() {
$low_sales_products = get_low_sales_products( 5 ); // товары с менее 5 продаж
if ( ! empty( $low_sales_products ) ) {
delete_products_by_ids( $low_sales_products );
}
}
// Регистрируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wp_low_sales_products_cleanup' ) ) {
wp_schedule_event( time(), 'monthly', 'wp_low_sales_products_cleanup' );
}
// Отключение при деактивации
register_deactivation_hook( __FILE__, function() {
wp_clear_scheduled_hook( 'wp_low_sales_products_cleanup' );
});Проверка результата после внедрения
- В админке WooCommerce проверьте количество товаров до и после запуска запланированной задачи.
- Используйте SQL-запрос из раздела диагностики, чтобы убедиться, что товары с низкими продажами удалены.
- Проверьте логи WP-Cron, если установлен плагин для мониторинга заданий (например, WP Crontrol), чтобы убедиться, что задача выполняется.
Частые ошибки и как их исправить
- Неверный статус заказов: В выборке важно учитывать только оплаченные или завершённые заказы (wc-completed, wc-processing). Если включить отменённые или черновики, статистика будет некорректной.
- Отсутствие прав на удаление: wp_delete_post() требует прав администратора. Запускайте код либо из плагина, либо из темы с правильными правами.
- Проблемы с WP-Cron: WP-Cron может не запускаться на низкозагруженных сайтах. Для надежности настроьте системный cron или запускайте вручную через WP CLI.
- Удаление нужных товаров: Проверьте порог продаж и период выборки, чтобы не удалить потенциально полезные товары с редкими, но важными продажами.
Практические советы по безопасности и производительности
- Перед автоматическим удалением создавайте резервные копии базы данных — например, с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy).
- Если каталог очень большой, разбивайте удаление на партии, чтобы избежать таймаутов.
- Добавьте логирование удалённых товаров для аудита и возможного восстановления.
- Для улучшения производительности используйте transient-кэширование результатов выборки, обновляя кэш раз в сутки.
- Проверяйте совместимость с другими плагинами WooCommerce, которые могут влиять на статусы заказов и отчёты.
Сравнение подходов к удалению товаров с низкими продажами
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простой, не требует кода | Трудоёмко, риск пропуска товаров |
| SQL-запросы + ручное удаление | Ускоряет поиск товаров | Риск ошибок при удалении, требует навыков SQL |
| Автоматическое удаление через WP-Cron и код | Полная автоматизация, контроль, масштабируемость | Требует программирования, настройка cron |