Диагностика проблемы с неиспользуемыми вариантами товаров в WooCommerce
При ведении интернет-магазина на WooCommerce часто накапливаются варианты товаров (variations), которые не продаются и не используются. Они занимают место в базе данных, замедляют загрузку страниц и усложняют управление каталогом.
Чтобы определить, есть ли такие варианты, выполните SQL-запрос к базе данных, например через phpMyAdmin или WP-CLI:
SELECT p.ID, p.post_title, COUNT(o.ID) as orders_count
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN wp_posts o ON oi.order_id = o.ID AND o.post_type = 'shop_order'
WHERE p.post_type = 'product_variation'
GROUP BY p.ID
HAVING orders_count = 0;Этот запрос покажет варианты товаров без заказов. Если таких много, стоит очистить каталог.
Пошаговое решение: автоматическое удаление неиспользуемых вариантов
1. Создание функции для поиска и удаления неиспользуемых вариантов
Мы создадим PHP-скрипт, который можно запускать вручную или по расписанию, чтобы удалять варианты без продаж.
function wc_delete_unused_variations() {
global $wpdb;
// Получаем ID вариантов без заказов
$variations = $wpdb->get_col(
"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
LEFT JOIN {$wpdb->posts} o ON oi.order_id = o.ID AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product_variation' AND o.ID IS NULL"
);
if (empty($variations)) {
return 'Нет неиспользуемых вариантов для удаления.';
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // Удаляем без возможности восстановления
}
return count($variations) . ' вариантов успешно удалены.';
}2. Запуск функции вручную
Для теста добавьте следующий код в functions.php вашей темы или в плагин:
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['delete_unused_variations'])) {
$result = wc_delete_unused_variations();
echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
}
});После этого в админке откройте любой раздел и добавьте в URL ?delete_unused_variations=1 — функция удалит неиспользуемые варианты.
3. Автоматизация с помощью WP-Cron
Чтобы регулярно чистить базу, зарегистрируйте событие:
if (!wp_next_scheduled('wc_cron_delete_unused_variations')) {
wp_schedule_event(time(), 'daily', 'wc_cron_delete_unused_variations');
}
add_action('wc_cron_delete_unused_variations', 'wc_delete_unused_variations');Проверка результата после внедрения
- Повторите SQL-запрос из раздела диагностики — количество вариантов без заказов должно быть равно нулю.
- Проверьте раздел «Все товары» в админке WooCommerce — неиспользуемые варианты исчезнут.
- Мониторьте производительность сайта: уменьшится размер базы и время отклика на страницах товаров.
Частые ошибки и как их исправить
- Удалились нужные варианты: Проверьте, что в запросе учитываются только варианты без заказов с определёнными статусами (например,
wc-completedиwc-processing). Возможно, стоит расширить список статусов. - Функция не удаляет варианты: Проверьте права пользователя, наличие hook'ов и корректность SQL-запроса. Также убедитесь, что WP-Cron работает (проверьте планировщик задач сервера).
- Проблемы с производительностью при большом каталоге: Разбейте удаление на партии по 100 вариантов, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Всегда делайте резервное копирование базы данных перед массовым удалением.
- Используйте
wp_delete_post($id, true)для полного удаления, чтобы не оставлять мусор. - Проверяйте наличие заказов не только в статусах
wc-completed, но и вwc-processing,wc-on-hold— чтобы не удалить варианты, связанные с активными заказами. - Для больших магазинов используйте WP-CLI для запуска скриптов, чтобы избежать ограничений веб-сервера.
- Если не хотите писать код, рассмотрите плагин Clearfy Pro с функциями очистки и оптимизации WooCommerce.