Диагностика проблемы: зачем удалять неактивные вариации в WooCommerce
С ростом ассортимента WooCommerce-магазина количество вариаций товаров может разрастаться до сотен и тысяч. Часто среди них появляются вариации, которые больше не используются — например, устаревшие цвета, размеры или комбинации, которые не продаются и не отображаются на сайте. Они замусоривают базу данных, замедляют работу админки и фронтенда, а также усложняют управление товарным каталогом.
Если не проводить регулярную чистку, то WooCommerce начинает потреблять больше ресурсов, а операции, связанные с вариациями (фильтры, поиск, изменение цен), выполняются медленнее.
Как определить неактивные вариации для удаления
Неактивные вариации — это вариации, которые:
- имеют статус
privateилиdraft(не опубликованы); - не имеют продаж за заданный период (например, 6 месяцев);
- не используются в заказах и не имеют остатков на складе;
- не отображаются в каталоге (имеют мета-данные, отключающие показ).
Для определения таких вариаций понадобится анализ метаданных товаров и заказов.
Пошаговое решение: скрипт для удаления неактивных вариаций WooCommerce
Ниже пример рабочего PHP-кода, который можно добавить в functions.php темы или создать отдельный файл для запуска через WP-CLI. Скрипт удаляет вариации без продаж и без остатков за последние 180 дней.
<?php
function wc_delete_inactive_variations( $days = 180 ) {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID вариаций, у которых не было заказов после даты
$variations_to_check = $wpdb->get_col( "
SELECT p.ID FROM {$wpdb->posts} p
WHERE p.post_type = 'product_variation'
" );
foreach ( $variations_to_check as $variation_id ) {
// Проверяем, были ли продажи вариации после даты
$has_recent_order = $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
INNER JOIN {$wpdb->posts} o ON o.ID = oi.order_id
WHERE oi.order_item_type = 'line_item'
AND oim.meta_key = '_variation_id'
AND oim.meta_value = %d
AND o.post_date > %s
AND o.post_status IN ('wc-completed','wc-processing','wc-on-hold')
", $variation_id, $date_threshold ) );
if ( $has_recent_order ) {
continue; // Есть продажи - пропускаем
}
// Проверяем остаток на складе вариации
$stock = get_post_meta( $variation_id, '_stock', true );
if ( !empty($stock) && intval($stock) > 0 ) {
continue; // Есть остаток - пропускаем
}
// Удаляем вариацию
wp_delete_post( $variation_id, true );
}
}
// Запуск с удалением вариаций без продаж и остатков за 180 дней
add_action( 'init', function() {
if ( is_admin() && isset($_GET['delete_inactive_variations']) && current_user_can('manage_woocommerce') ) {
wc_delete_inactive_variations(180);
echo 'Удаление неактивных вариаций завершено';
exit;
}
} );
?>Для запуска перейдите в админке по URL: https://ваш-сайт.ru/wp-admin/?delete_inactive_variations=1 (подставьте свой домен). Скрипт выполнится и удалит все вариации без продаж и остатков за последние 180 дней.
Проверка результата после внедрения
- В админке WooCommerce откройте список вариаций и убедитесь, что неактивные вариации удалены.
- Проверьте базу данных в таблице
wp_postsдляpost_type = 'product_variation'— количество строк уменьшилось. - Убедитесь, что в новых заказах не появляются удалённые вариации.
- Проверьте на фронтенде, что отсутствуют пустые или неиспользуемые варианты выбора у товаров.
Частые ошибки и как их исправить
- Скрипт ничего не удаляет: проверьте, что вы запускаете с правильными правами (админ, manage_woocommerce), и что есть вариации без заказов и остатков.
- Удаляются нужные вариации: внимательно настраивайте условие времени и проверку остатков. Для большей безопасности делайте резервную копию базы.
- Ошибки выполнения из-за таймаута PHP: если вариаций много, запускайте скрипт через WP-CLI или делайте удаление частями, добавляя пагинацию.
- Потеря данных: отключайте удаление с флагом
wp_delete_post($id, true)— true означает удаление без возможности восстановления. Можно заменить наfalseдля отправки в корзину.
Практические советы по безопасности и производительности
- Перед запуском скрипта сделайте полную резервную копию базы данных.
- Для магазинов с большим количеством товаров и заказов используйте WP-CLI для пакетного удаления, чтобы избежать таймаутов.
- Добавьте логирование удалённых вариаций в отдельный файл для контроля и отката при необходимости.
- Периодически запускайте скрипт по CRON (через WP-Cron или системный CRON) для автоматической чистки.
- Если вы используете плагин Clearfy Pro, можете дополнительно оптимизировать базу данных и удалить мусорные метаданные, чтобы ускорить работу WooCommerce.
Сравнение методов удаления неактивных вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление в админке | Простота, безопасность | Затратно по времени при большом количестве вариаций |
| Скрипт на PHP (как выше) | Автоматизация, точечное удаление | Нужны базовые навыки разработки, риск ошибок |
| Плагины очистки WooCommerce | Удобство, дополнительные функции | Могут замедлять сайт, лишний код |