Диагностика проблемы: зачем удалять неиспользуемые варианты товаров
В интернет-магазинах на WooCommerce часто накапливаются тысячи вариантов товаров, многие из которых не продаются и занимают место в базе данных. Это негативно влияет на производительность сайта, усложняет администрирование и ухудшает качество каталога. Автоматическое удаление таких вариантов — эффективный способ оптимизации.
Как определить варианты без продаж
Варианты без продаж — это вариации товаров, у которых не было связанных заказов. WooCommerce хранит данные о продажах в таблицах wp_woocommerce_order_items и wp_woocommerce_order_itemmeta. Чтобы определить, есть ли продажи у варианта, нужно проверить, встречается ли ID варианта (product_variation ID) в заказах.
Пошаговое решение: удаление вариантов без продаж с помощью кода
Реализуем функцию, которая:
- Получит все вариации товаров.
- Проверит для каждой вариации, есть ли связанные продажи.
- Удалит вариацию, если продаж не было.
Добавьте следующий код в файл functions.php вашей темы или в плагин для кастомных функций:
function wc_delete_variations_without_sales() {
global $wpdb;
// Получаем все ID вариаций товаров
$variation_ids = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation'");
foreach ($variation_ids as $variation_id) {
// Проверяем, есть ли продажи для варианта
$sales_count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(oi.order_item_id) FROM {$wpdb->prefix}woocommerce_order_items oi
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE oi.order_item_type = 'line_item'
AND oim.meta_key = '_variation_id'
AND oim.meta_value = %d",
$variation_id
));
if (intval($sales_count) === 0) {
// Удаляем вариацию без продаж
wp_delete_post($variation_id, true); // true — безвозвратно
}
}
}
// Запуск функции вручную или через WP-Cron
// wc_delete_variations_without_sales();Для регулярного запуска можно добавить WP-Cron задачу:
if ( ! wp_next_scheduled( 'wc_delete_variations_without_sales_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_variations_without_sales_cron' );
}
add_action( 'wc_delete_variations_without_sales_cron', 'wc_delete_variations_without_sales' );Проверка результата после внедрения
Чтобы убедиться, что функция сработала:
- Проверьте количество вариаций товаров до и после запуска кода.
- В админке WooCommerce перейдите в раздел «Товары» - «Вариации» и убедитесь, что неиспользуемые варианты исчезли.
- Проверьте логи ошибок PHP на наличие предупреждений или ошибок.
Частые ошибки и как их исправить
- Удаляются активные варианты с продажами: Проверьте SQL-запрос, возможно, ошибка в условии. Для диагностики добавьте логирование
$sales_count. - Вариации не удаляются: Проверьте права пользователя, под которым выполняется скрипт, а также статус публикации вариаций. Используйте
wp_delete_post($variation_id, true);для безвозвратного удаления. - Падение сайта из-за большого количества вариаций: Запускайте удаление партиями, разделяя операции на несколько вызовов с лимитом в 50-100 вариантов.
Практические советы по безопасности и производительности
- Резервное копирование: Перед массовым удалением обязательно создайте резервную копию базы данных.
- Запуск в периоды низкой нагрузки: Чтобы не перегружать сервер, запускайте функцию ночью или по расписанию с WP-Cron.
- Пакетная обработка: Для магазинов с тысячами вариаций разбивайте удаление на части, чтобы избежать таймаутов.
- Логирование: Добавьте ведение логов удаленных вариантов для аудита.
Сравнение способов удаления вариантов без продаж
| Способ | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Плагин очистки WooCommerce | Простота использования, GUI | Может быть дорогостоящим, ограниченная кастомизация | Подходит для небольших магазинов |
| Кастомный код с WP-Cron | Полный контроль, бесплатный, автоматизация | Требует знаний, возможность ошибок без тестирования | Лучшее для опытных разработчиков |
| Ручное удаление через админку | Простота, не требует кода | Трудозатратно при большом объеме | Использовать для единичных случаев |