Диагностика проблемы: зачем удалять неиспользуемые вариации товаров
В магазинах на WooCommerce с большим ассортиментом часто создаются вариации товаров, которые со временем перестают использоваться — устаревшие цвета, размеры, комплектации. Они нагружают базу данных, увеличивают время загрузки страниц и усложняют администрирование. Автоматическое удаление таких вариаций поможет поддерживать магазин в актуальном состоянии и повысит производительность.
Как выявить неиспользуемые вариации
Для начала нужно определить, какие вариации можно считать неиспользуемыми. Обычно это вариации, которые:
- Не были проданы и не просматривались длительное время (например, >6 месяцев).
- Неактивны или отключены в настройках товара.
- Имеют нулевой остаток и не планируются к пополнению.
Для анализа можно использовать SQL-запросы к базе данных или плагины для отчетности по WooCommerce, например, Clearfy Pro с функциями оптимизации базы.
Пошаговое решение: автоматическое удаление неиспользуемых вариаций
1. Создаем WP-Cron для регулярной проверки и очистки
Добавим в functions.php или в собственный плагин следующий код, который будет запускать удаление раз в неделю:
if (!wp_next_scheduled('wc_delete_unused_variations_weekly')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_unused_variations_weekly');
}
add_action('wc_delete_unused_variations_weekly', 'wc_delete_unused_variations');
function wc_delete_unused_variations() {
global $wpdb;
$threshold_date = date('Y-m-d H:i:s', strtotime('-6 months'));
// Выбираем ID вариаций, которые не продавались и не просматривались более 6 месяцев
$variations = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.meta_value = p.ID
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
WHERE p.post_type = 'product_variation'
AND p.post_modified < %s
AND (oi.order_item_id IS NULL OR oi.order_item_id NOT IN (
SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items oi2
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2 ON oim2.order_item_id = oi2.order_item_id
JOIN {$wpdb->posts} orders ON orders.ID = oi2.order_id
WHERE oim2.meta_key = '_product_id' AND oim2.meta_value = p.ID AND orders.post_date >= %s
))",
$threshold_date, $threshold_date
));
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // принудительное удаление
}
}2. Оптимизация и проверка остатков
Можно добавить дополнительную проверку, чтобы не удалять вариации с остатками:
function wc_delete_unused_variations() {
global $wpdb;
$threshold_date = date('Y-m-d H:i:s', strtotime('-6 months'));
$variations = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm_stock ON pm_stock.post_id = p.ID AND pm_stock.meta_key = '_stock'
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.meta_value = p.ID
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
WHERE p.post_type = 'product_variation'
AND p.post_modified < %s
AND (oi.order_item_id IS NULL OR oi.order_item_id NOT IN (
SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items oi2
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2 ON oim2.order_item_id = oi2.order_item_id
JOIN {$wpdb->posts} orders ON orders.ID = oi2.order_id
WHERE oim2.meta_key = '_product_id' AND oim2.meta_value = p.ID AND orders.post_date >= %s
))
AND (pm_stock.meta_value IS NULL OR pm_stock.meta_value = '0')",
$threshold_date, $threshold_date
));
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true);
}
}Проверка результата после внедрения
- Проверьте наличие запланированного события WP-Cron командой
wp cron event listили плагином WP Crontrol. - После выполнения события проверьте, что вариации с датой изменения более 6 месяцев и без продаж удалены в админке WooCommerce.
- Для контроля можно добавить логирование удалений, например, в файл или в системный лог.
Частые ошибки и как их исправить
- Удаление активных вариаций: Проверьте условия в SQL-запросе, чтобы не затронуть товары с остатком или недавними продажами.
- WP-Cron не запускается автоматически: На некоторых серверах WP-Cron работает только при посещении сайта. Рекомендуется настроить системный cron для запуска
wp cron event run --due-now. - Проблемы с правами: Убедитесь, что у пользователя, от имени которого работает скрипт, есть права на удаление постов.
- Потеря данных: Всегда делайте резервную копию базы данных перед массовым удалением.
Практические советы по безопасности и производительности
- Используйте транзакции или делайте удаление частями, чтобы не перегружать базу при больших объемах данных.
- Добавьте логирование удалений для аудита и отката при необходимости.
- Перед внедрением на рабочем сайте протестируйте на копии или в staging-среде.
- Используйте плагины оптимизации, например Clearfy Pro, для дополнительной очистки и ускорения WooCommerce.
Сравнение способов очистки неиспользуемых вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление в админке | Простой, не требует кода | Трудоемко, риск ошибок, не подходит для большого количества |
| SQL-запросы напрямую в базе | Быстрое массовое удаление | Риск повреждения данных, требует навыков SQL |
| Автоматизация через WP-Cron и PHP | Регулярная чистка, безопаснее, можно настроить условия | Требует правильной настройки и тестирования |
| Плагины оптимизации (например, Clearfy Pro) | Простота использования, дополнительно ускоряют сайт | Может быть платным, зависит от функционала плагина |