Если у товара много вариаций, админка WooCommerce начинает заметно тормозить: карточка товара открывается долго, вкладка «Вариации» подвисает, а сохранение иногда уходит в таймаут. Чаще всего проблема не в одном «тяжёлом» месте, а в сумме запросов: загрузка всех вариаций, метаданных, AJAX-обновлений и лишних действий сторонних плагинов.
Ниже разберём, как понять, что именно тормозит, и что можно отключить или изменить без прямого вмешательства в базу данных.
Когда проблема действительно в вариациях
Сначала стоит отделить медленную админку от общей проблемы сайта. Если тормозит только редактирование товаров с большим числом вариаций, а обычные записи и страницы открываются нормально, почти наверняка узкое место именно в WooCommerce-логике вариативных товаров.
Типичные симптомы
- страница редактирования товара долго грузится после клика по «Изменить»;
- вкладка «Вариации» раскрывается с задержкой;
- сохранение товара занимает заметно больше времени, чем у простого товара;
- в логах сервера появляются медленные запросы к
wp_postmetaиwp_posts; - после установки дополнительных плагинов тормоза усилились.
Что проверить в первую очередь
- сколько вариаций у проблемного товара;
- есть ли у вариаций много метаполей;
- не подключены ли плагины, которые добавляют свои поля в карточку товара;
- не включён ли у хостинга слишком агрессивный object cache без нормальной настройки;
- не генерирует ли тема или конструктор лишние запросы в админке.
Диагностика: где именно теряется время
Для начала не гадайте, а посмотрите на запросы. Самый простой способ — открыть карточку товара с включённым Query Monitor. Он покажет, какие запросы выполняются долго, сколько их и какие плагины их инициируют.
Если Query Monitor ставить не хотите, можно хотя бы временно включить логирование медленных запросов на уровне MySQL или посмотреть, не растёт ли время ответа именно на экране редактирования товара.
Отдельно стоит проверить, не вызывается ли в админке лишняя загрузка вариаций через AJAX. В WooCommerce это часто происходит, когда сторонний код без необходимости обращается к get_available_variations() или перебирает все вариации на каждом рендере поля.
Что искать в запросах
- много повторяющихся запросов к метаданным вариаций;
- долгие JOIN по
wp_postmeta; - запросы, которые запускаются при каждом открытии метабокса;
- дополнительные запросы от плагинов доставки, цен, фильтров и складского учёта.
Как уменьшить нагрузку без потери функциональности
Если у товара десятки или сотни вариаций, главная цель — не заставлять WooCommerce каждый раз поднимать всё дерево вариаций в админке. В некоторых сценариях помогает отключение части интерфейсных скриптов и аккуратная оптимизация собственных хуков.
Ниже — рабочий подход, который не ломает фронтенд, но убирает лишнюю работу в админке для товаров с большим числом вариаций.
1. Не грузить лишний код в админке товара
Если у вас есть собственные метабоксы или скрипты, проверьте, что они подключаются только на нужных экранах. Частая ошибка — грузить JS и выполнять запросы на всех страницах админки.
add_action('admin_enqueue_scripts', function($hook) {
if ($hook !== 'post.php' && $hook !== 'post-new.php') {
return;
}
$screen = function_exists('get_current_screen') ? get_current_screen() : null;
if (!$screen || $screen->post_type !== 'product') {
return;
}
wp_enqueue_script(
'my-product-admin',
get_stylesheet_directory_uri() . '/assets/js/product-admin.js',
array('jquery'),
'1.0.0',
true
);
});2. Убрать тяжёлые действия из рендера вариаций
Если вы добавляете свои поля в вариации через хук woocommerce_product_after_variable_attributes, не делайте внутри него дорогие запросы к внешним сервисам или сложные выборки. Этот хук вызывается много раз — по одному разу на каждую вариацию.
Лучше заранее подготовить данные один раз и передать их в шаблон. Например, если нужно показать список терминов или справочник, загрузите его до цикла и используйте в памяти.
add_action('woocommerce_product_after_variable_attributes', function($loop, $variation_data, $variation) {
static $options = null;
if ($options === null) {
$options = get_terms(array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'fields' => 'id=>name',
));
}
$selected = get_post_meta($variation->ID, '_my_category_id', true);
echo '<p class="form-row form-row-full">';
echo '<label>Категория для вариации</label>';
echo '<select name="my_category_id[' . esc_attr($variation->ID) . ']">';
echo '<option value="">—</option>';
if (!is_wp_error($options)) {
foreach ($options as $term_id => $name) {
printf(
'<option value="%d" %s>%s</option>',
(int) $term_id,
selected($selected, $term_id, false),
esc_html($name)
);
}
}
echo '</select>';
echo '</p>';
}, 10, 3);3. Не вызывать загрузку всех вариаций без необходимости
Если в теме или плагине есть код вида $product->get_available_variations(), проверьте, действительно ли он нужен на странице редактирования товара. Эта функция может быть дорогой на больших каталогах. Для админки часто достаточно получить только IDs вариаций и обработать их точечно.
$product = wc_get_product($product_id);
if ($product && $product->is_type('variable')) {
$variation_ids = $product->get_children();
foreach ($variation_ids as $variation_id) {
$variation = wc_get_product($variation_id);
if (!$variation) {
continue;
}
$price = $variation->get_regular_price();
// Работайте только с тем, что реально нужно.
}
}Сравнение подходов: плагин, код или частичная переработка
| Подход | Когда подходит | Минус |
|---|---|---|
| Оптимизация кодом | Есть свой плагин или тема, где можно убрать лишние запросы | Нужно понимать, какой хук тормозит |
| Отключение лишних админ-скриптов | Тормозит только экран редактирования товара | Не решает проблему тяжёлых метаданных вариаций |
| Пересмотр структуры товара | Слишком много вариаций и атрибутов | Потребует ручной работы с каталогом |
Если проблема в стороннем плагине, иногда быстрее временно отключить его и проверить, исчезла ли задержка. Но если причина в самой модели товара, кодом можно только снизить нагрузку, а не убрать её полностью.
Пошаговое решение на практике
- Проверьте товар с большим числом вариаций в Query Monitor или через логи медленных запросов.
- Отключите на время сторонние плагины, которые добавляют поля в карточку товара.
- Уберите из админки собственные скрипты и запросы, если они не нужны на экране товара.
- Замените вызовы
get_available_variations()на работу сget_children(), если вам не нужны все данные сразу. - Перенесите тяжёлые вычисления из рендера вариаций в отдельный кэшируемый шаг.
- Проверьте сохранение товара после каждого изменения, чтобы не искать проблему вслепую.
Как проверить, что решение сработало
Проверка должна быть не «на глаз», а по одинаковому сценарию. Откройте один и тот же товар до и после изменений и сравните:
- время открытия страницы редактирования;
- время раскрытия вкладки «Вариации»;
- время сохранения товара;
- количество запросов в Query Monitor;
- наличие повторяющихся запросов к метаданным.
Если после правок страница стала открываться быстрее, но сохранение всё ещё подвисает, значит узкое место осталось в обработчиках сохранения. Тогда смотрите хуки woocommerce_save_product_variation и woocommerce_admin_process_variation_object — именно там часто сидят тяжёлые операции.
Частые ошибки и как их исправить
Слишком много логики внутри хука вариации
Ошибка: в woocommerce_product_after_variable_attributes или похожем хуке выполняются запросы к API, сложные выборки или генерация больших списков. Исправление: вынесите подготовку данных выше по коду и кэшируйте результат хотя бы на время запроса.
Использование get_available_variations() там, где достаточно ID
Ошибка: функция возвращает большой массив со всеми данными вариаций, хотя нужен только список дочерних товаров. Исправление: используйте get_children() и подгружайте только нужные поля.
Глобальные скрипты в админке
Ошибка: JS и CSS подключаются на всех страницах панели, хотя нужны только на редактировании товара. Исправление: ограничьте загрузку через admin_enqueue_scripts и проверку текущего экрана.
Игнорирование сторонних плагинов
Ошибка: после установки плагина доставки, фильтров или цен админка стала медленнее, но виноватым считают WooCommerce. Исправление: отключайте плагины по одному и смотрите, какой из них добавляет лишние запросы в карточку товара.
Безопасность и производительность: что не стоит делать
Не отключайте системные проверки и не правьте ядро WooCommerce напрямую. Такие изменения сложно сопровождать: после обновления они теряются, а отладка становится только хуже.
Если нужна массовая оптимизация каталога, лучше вынести кастомный код в отдельный мини-плагин или mu-plugin. Так проще контролировать изменения и откатывать их без риска сломать тему.
Для магазинов с большим числом вариаций полезно также следить за чистотой админки: лишние метабоксы, дублирующиеся поля и тяжёлые SEO-расширения в карточке товара часто дают больше вреда, чем пользы. Если у вас уже накопилось много дублирующих элементов в админке, имеет смысл отдельно пересмотреть набор плагинов и убрать то, что дублирует функциональность.
Если нужно быстро навести порядок в служебных настройках сайта, иногда проще сначала убрать лишнее через инструменты вроде Clearfy Pro, а уже потом точечно разбирать медленные места в WooCommerce: https://wpshop.ru/plugins/clearfy?utm_source=wpdesk.ru&utm_medium=article&utm_campaign=woocommerce-otklyuchit-zaprosy-katalogov-variatsiy-v-admin
Главная идея простая: чем меньше WooCommerce делает в момент открытия и сохранения вариативного товара, тем стабильнее работает админка. Начинайте с диагностики, убирайте лишние запросы по одному и обязательно проверяйте результат на том же товаре, где проблема проявлялась изначально.