Диагностика проблемы с неактивными вариациями товаров в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются неактивные вариации товаров — варианты продуктов, которые больше не продаются, устарели или не используются покупателями. Это замедляет работу сайта, увеличивает размер базы данных и усложняет управление каталогом. Выявить такие вариации можно, проверив их статус и наличие продаж.
- Перейдите в админку WooCommerce → Товары → Вариации и отсортируйте по статусу.
- Выясните, какие вариации имеют статус «черновик» или «отключено».
- Проверьте, когда была последняя продажа вариации (для этого можно использовать отчет WooCommerce или запрос к базе данных).
Как проверить отсутствие заказов по вариации
Выполните SQL-запрос в базе WooCommerce для поиска ID вариаций без заказов:
SELECT p.ID FROM wp_posts p WHERE p.post_type = 'product_variation' AND NOT EXISTS (SELECT 1 FROM wp_woocommerce_order_items oi JOIN wp_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 = p.ID);Этот запрос возвращает ID вариаций товаров, которые никогда не были куплены.
Пошаговое решение: автоматическое удаление неактивных вариаций с помощью PHP-кода
Для автоматизации удаления неактивных вариаций создадим кастомный скрипт, который будет запускаться по cron или вручную:
- Определяем критерии удаления: вариации, которые неактивны (статус «draft» или «private») и не имеют заказов за последний год.
- Создаем функцию для сбора таких вариаций и удаления их через WooCommerce API.
function wc_delete_inactive_variations( $days_inactive = 365 ) {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
// Получаем ID вариаций, неактивных и без заказов после $date_threshold
$variations = $wpdb->get_col( $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
WHERE p.post_type = 'product_variation'
AND p.post_status IN ('draft', 'private')
AND p.post_date < %s
AND NOT EXISTS (
SELECT 1 FROM {$wpdb->prefix}woocommerce_order_items oi
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
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 = p.ID
AND o.post_status IN ('wc-completed', 'wc-processing')
AND o.post_date > %s
)",
$date_threshold,
$date_threshold
) );
if ( empty( $variations ) ) {
return 'No inactive variations found for deletion.';
}
foreach ( $variations as $variation_id ) {
wp_delete_post( $variation_id, true );
}
return count( $variations ) . ' inactive variations deleted.';
}Вы можете запустить эту функцию вручную или добавить вызов в cron:
// Пример вызова
add_action('init', function() {
if ( current_user_can('administrator') && isset($_GET['delete_inactive_variations']) ) {
echo wc_delete_inactive_variations();
exit;
}
});Проверка результата после внедрения
- Запустите функцию вручную через URL, например:
https://your-site.ru/?delete_inactive_variations=1. В ответе должно быть количество удалённых вариаций. - Проверьте в админке WooCommerce, что неактивные вариации удалены.
- Сделайте тестовую покупку вариации и проверьте, что она не удаляется при повторном запуске.
Частые ошибки при автоматическом удалении вариаций и их исправление
- Удаление активных вариаций: Проверьте правильность фильтра по статусу и дате, чтобы случайно не удалить продающиеся варианты.
- Отсутствие прав на удаление: Убедитесь, что код запускается с правами администратора и wp_delete_post вызывается корректно.
- Неучет заказов: Если отчет по заказам неполный, проверьте корректность SQL-запроса и статусов заказов.
- Проблемы с производительностью: При большом количестве вариаций разбейте удаление на партии (batch processing) с лимитом на количество удаляемых вариаций за один запуск.
Практические советы по безопасности и производительности
- Всегда создавайте резервную копию базы перед массовым удалением данных.
- Ограничьте запуск скрипта только для авторизованных администраторов и по защищённым триггерам (cron, секретный ключ в URL).
- Используйте WP-Cron с интервалом один раз в неделю для автоматизации без нагрузки на сервер.
- Для больших магазинов внедрите batch-обработку с лимитом, например 50 вариаций за раз.
Сравнение способов удаления неактивных вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Долго, неудобно при большом каталоге |
| Плагины (например, Bulk Delete) | Автоматизация, UI | Могут быть платными, лишний функционал |
| Код на PHP (как в статье) | Максимальный контроль, автоматизация, легковесность | Требует навыков разработки, риск ошибок без тестов |