Краткий ответ: WooCommerce долго оформляет заказ чаще всего из-за медленного запроса wc-ajax=checkout, платёжного шлюза, расчёта доставки, внешнего API, SMTP-отправки писем, тяжёлых плагинов, медленной базы данных, слабого хостинга, PHP-ошибок, блокировки checkout кешем или кастомного кода на хуках оформления заказа.
Если покупатель нажимает “Оформить заказ”, кнопка долго крутится, заказ создаётся через 10–30 секунд или checkout заканчивается ошибкой 504, нужно смотреть не только скорость страницы. Самая важная часть — серверная обработка заказа после клика: валидация полей, создание заказа, расчёт доставки, оплата, списание склада, купоны, письма, webhooks, CRM, Telegram, аналитика и сторонние интеграции.
Страница checkout может открываться быстро, но сам заказ оформляться долго. Это разные вещи. Открытие страницы зависит от темы, CSS, JS, кеша и изображений. А оформление заказа зависит от PHP, WooCommerce hooks, базы данных, платёжного шлюза, доставки, email и внешних сервисов.
На практике задержку часто создаёт не WooCommerce сам по себе, а код, который запускается во время оформления заказа.
Если заказ вообще не создаётся или кнопка “Place order” зависает без результата, это уже ближе к проблеме WooCommerce не оформляет заказ. Если заказ создаётся, но письма приходят с задержкой или не приходят совсем, отдельно стоит проверить, почему WooCommerce не отправляет письма.
| Участок | Что происходит | Почему может быть медленно |
|---|---|---|
| wc-ajax=update_order_review | Пересчёт доставки, налогов, купонов и итогов | Медленная доставка, геолокация, купоны, тяжёлые хуки |
| wc-ajax=checkout | Финальное оформление заказа | Оплата, создание заказа, письма, API, CRM, webhooks |
| Платёжный шлюз | Проверка оплаты или редирект | Медленный API банка, callback, webhook, 3DS |
| Доставка | Расчёт стоимости и доступных методов | Внешний API, много зон, тяжёлые условия |
| Отправка писем клиенту и администратору | Медленный SMTP, DNS, вложения, кастомные шаблоны | |
| CRM/API | Передача заказа во внешнюю систему | Синхронный запрос, таймаут, повторные попытки |
| Склад | Списание остатков, проверка наличия | Много вариаций, внешняя система, тяжёлые запросы |
| База данных | Запись заказа, order meta, сессии, transients | Большие таблицы, нет оптимизации, медленный MySQL |
| Кастомный код | Действия на checkout hooks | Циклы, API-запросы, генерация PDF, тяжёлые отчёты |
Главная задача диагностики — понять, какой запрос тормозит: загрузка страницы checkout, пересчёт заказа или финальная отправка формы.
| Ситуация | Где искать причину | Комментарий |
|---|---|---|
| Весь сайт медленный | Хостинг, тема, плагины, база, кеш | Это общая оптимизация WordPress/WooCommerce |
| Checkout открывается медленно | Скрипты, поля, доставка, плагины checkout | Проверять загрузку страницы и update_order_review |
| После клика “Оформить заказ” долго думает | wc-ajax=checkout, оплата, письма, API | Проверять серверную обработку заказа |
| Заказ создаётся, но ответ долго не возвращается | Письма, webhooks, CRM, Telegram, платёжный шлюз | Часть действий нужно выносить в фон |
| Заказ не создаётся и ошибка 500 | PHP fatal error | Смотреть debug.log |
| Ошибка 504 после ожидания | Таймаут сервера или внешнего API | Нужно искать долгий процесс |
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Исправлять долгий checkout нужно не одной настройкой, а по слоям: сначала найти медленный запрос, затем отключить лишнее на checkout, проверить оплату, доставку, письма, внешние API, базу и сервер.
Если медленный запрос — wc-ajax=update_order_review, проблема часто в доставке, налогах, купонах или пересчёте итогов. Если медленный запрос — wc-ajax=checkout, проблема чаще в финальной обработке заказа: оплата, письма, webhooks, CRM, склад, кастомные hooks.
Платёжный плагин может сильно задерживать оформление заказа, если он ждёт внешний API или неправильно обрабатывает статус.
Медленный расчёт доставки часто виден до финального оформления заказа, когда WooCommerce пересчитывает итоговую сумму.
Если во время оформления заказа сайт отправляет данные в CRM, Telegram, Google Sheets, складскую систему или ERP, это может задерживать покупателя. Лучше сначала создать заказ, а тяжёлую синхронизацию выполнять через Action Scheduler, cron или очередь.
Для магазинов с CRM особенно важно не делать долгий API-запрос до ответа пользователю. Логика похожа на интеграцию WordPress с CRM/API, но для checkout нужно добавлять очередь и повторные попытки.
WooCommerce может отправлять письма сразу после создания заказа. Если SMTP отвечает медленно, checkout может выглядеть зависшим.
На checkout часто подключаются скрипты и хуки плагинов, которые там не нужны: слайдеры, popups, аналитика, виджеты, формы, рекомендации, чаты, upsell-блоки, тяжёлые конструкторы.
Медленная база может тормозить создание заказа, запись order meta, проверку купонов, сессии и обновление остатков.
Если медленный не только checkout, а весь магазин, полезно провести общую диагностику по статье как ускорить WooCommerce.
Важно: код ниже предназначен для диагностики. Не вставляйте все сниппеты сразу на рабочий магазин. Сначала сделайте бэкап и проверьте на staging-копии. Ошибки в checkout hooks могут повлиять на оплату, создание заказа, письма, сессии и статусы заказов.
Куда вставлять: в файл wp-config.php перед строкой /* That’s all, stop editing! */.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Куда вставлять: во временный служебный плагин или в functions.php дочерней темы только на время диагностики.
<?php
if (!defined('ABSPATH')) {
exit;
}
add_action('init', 'sc_checkout_time_start');
function sc_checkout_time_start() {
if (empty($_GET['wc-ajax'])) {
return;
}
$wc_ajax = sanitize_text_field($_GET['wc-ajax']);
if ($wc_ajax !== 'checkout' && $wc_ajax !== 'update_order_review') {
return;
}
$GLOBALS['sc_wc_ajax_start_time'] = microtime(true);
$GLOBALS['sc_wc_ajax_action'] = $wc_ajax;
add_action('shutdown', 'sc_checkout_time_finish');
}
function sc_checkout_time_finish() {
if (empty($GLOBALS['sc_wc_ajax_start_time']) || empty($GLOBALS['sc_wc_ajax_action'])) {
return;
}
$duration = microtime(true) - $GLOBALS['sc_wc_ajax_start_time'];
error_log('================ SC WC AJAX TIME ================');
error_log('Action: ' . $GLOBALS['sc_wc_ajax_action']);
error_log('Duration: ' . round($duration, 4) . ' sec');
error_log('Memory usage: ' . size_format(memory_get_peak_usage(true)));
error_log('Request URI: ' . (isset($_SERVER['REQUEST_URI']) ? sanitize_text_field($_SERVER['REQUEST_URI']) : ''));
error_log('=================================================');
}
Этот код помогает понять, доходит ли процесс до создания заказа и оплаты.
<?php
add_action('woocommerce_before_checkout_process', 'sc_log_before_checkout_process');
function sc_log_before_checkout_process() {
error_log('SC CHECKOUT STEP: before_checkout_process');
}
add_action('woocommerce_checkout_process', 'sc_log_checkout_process');
function sc_log_checkout_process() {
error_log('SC CHECKOUT STEP: checkout_process');
}
add_action('woocommerce_checkout_order_processed', 'sc_log_checkout_order_processed', 10, 3);
function sc_log_checkout_order_processed($order_id, $posted_data, $order) {
error_log('SC CHECKOUT STEP: order_processed. Order ID: ' . (int) $order_id);
}
add_action('woocommerce_payment_complete', 'sc_log_payment_complete');
function sc_log_payment_complete($order_id) {
error_log('SC CHECKOUT STEP: payment_complete. Order ID: ' . (int) $order_id);
}
add_action('woocommerce_thankyou', 'sc_log_thankyou');
function sc_log_thankyou($order_id) {
error_log('SC CHECKOUT STEP: thankyou. Order ID: ' . (int) $order_id);
}
Важно: этот код может писать много строк в лог. Используйте временно и только для диагностики.
<?php
add_filter('pre_http_request', 'sc_http_request_start_log', 10, 3);
function sc_http_request_start_log($preempt, $parsed_args, $url) {
if (!sc_is_checkout_ajax_request()) {
return $preempt;
}
error_log('SC HTTP REQUEST START: ' . esc_url_raw($url));
return $preempt;
}
add_filter('http_response', 'sc_http_request_response_log', 10, 3);
function sc_http_request_response_log($response, $parsed_args, $url) {
if (!sc_is_checkout_ajax_request()) {
return $response;
}
$code = wp_remote_retrieve_response_code($response);
error_log('SC HTTP REQUEST END: ' . esc_url_raw($url) . ' | CODE: ' . $code);
return $response;
}
function sc_is_checkout_ajax_request() {
if (empty($_GET['wc-ajax'])) {
return false;
}
$wc_ajax = sanitize_text_field($_GET['wc-ajax']);
return $wc_ajax === 'checkout' || $wc_ajax === 'update_order_review';
}
Куда вставлять: временно в служебный плагин или functions.php дочерней темы.
<?php
add_action('woocommerce_before_checkout_process', 'sc_log_checkout_cart_info');
function sc_log_checkout_cart_info() {
if (!function_exists('WC') || !WC()->cart) {
error_log('SC CHECKOUT CART: WC cart not available');
return;
}
$payment_method = isset($_POST['payment_method']) ? sanitize_text_field($_POST['payment_method']) : '';
error_log('SC CHECKOUT CART ITEMS: ' . WC()->cart->get_cart_contents_count());
error_log('SC CHECKOUT CART TOTAL: ' . WC()->cart->get_total('edit'));
error_log('SC CHECKOUT PAYMENT METHOD: ' . $payment_method);
}
Важно: это не заменяет настройки кеш-плагина, Nginx, Cloudflare или серверного кеша. Исключения нужно настроить на всех уровнях кеширования.
<?php
add_action('template_redirect', 'sc_no_cache_for_woocommerce_checkout_pages');
function sc_no_cache_for_woocommerce_checkout_pages() {
if (!function_exists('is_cart') || !function_exists('is_checkout') || !function_exists('is_account_page')) {
return;
}
if (is_cart() || is_checkout() || is_account_page()) {
nocache_headers();
}
}
После правильного исправления checkout должен обрабатывать заказ без долгого зависания. Покупатель нажимает кнопку, заказ создаётся, оплата или редирект запускается нормально, письма уходят без блокировки checkout, а внешние интеграции выполняются в фоне или с контролируемым таймаутом.
Подходит, если форма перегружена лишними полями, проверками, масками, блоками и скриптами.
Плюсы: меньше полей, меньше валидации, проще покупателю.
Минусы: не решит проблему медленного API, оплаты или базы.
Подходит, если заказ отправляется в CRM, Telegram, Google Sheets, ERP или склад прямо во время оформления.
Плюсы: покупатель быстрее получает ответ после клика.
Минусы: нужна очередь, логи и повторные попытки.
Подходит, если тормозит update_order_review при смене адреса, города или способа доставки.
Плюсы: ускоряет пересчёт итогов и работу checkout.
Минусы: нужно проверять правила доставки, зоны, API и купоны.
Подходит, если тормоз начинается после нажатия “Оформить заказ” или при редиректе на оплату.
Плюсы: часто быстро показывает реальную причину.
Минусы: может потребоваться доступ к логам банка или провайдера оплаты.
Подходит не всем. HPOS может помочь большим магазинам с большим количеством заказов, но перед включением нужно проверить совместимость темы, плагинов оплаты, доставки, CRM и отчётов.
Плюсы: в некоторых проектах снижает нагрузку на старые post/postmeta-таблицы.
Минусы: несовместимые плагины могут сломать обработку заказов.
Checkout связан с оплатой, заказами, персональными данными и сессиями. Нельзя чинить долгую обработку заказа случайными сниппетами без тестов.
Checkout нельзя ускорять только кешем. Это динамический процесс, где важнее убрать лишние операции во время оформления заказа.
PageSpeed может показывать хорошую страницу checkout, но не видеть долгий серверный запрос после клика “Оформить заказ”. Нужно смотреть Network и время wc-ajax=checkout.
Checkout должен быть динамическим. Полный page cache может ломать сессии, nonce, доставку, оплату и корзину.
Если внешний сервис отвечает медленно, покупатель ждёт. Лучше сохранить заказ, а интеграцию выполнить в фоне с логом и повторной попыткой.
Медленная отправка писем может задерживать заказ. Особенно если письмо содержит тяжёлый шаблон, PDF или отправляется через нестабильный SMTP.
Если доставка считается через внешний API, тормоз может появляться ещё до нажатия финальной кнопки, при каждом изменении адреса.
Один платёжный метод может работать быстро, другой — зависать из-за API, callback, webhook или проверки статуса.
Ошибка PHP может не выводиться на экран, но тормозить или ломать checkout. Лог часто показывает настоящую причину.
Так можно сломать оплату, доставку или заказы. Для диагностики нужен staging или период низкой активности.
WooCommerce долго оформляет заказ из-за медленного wc-ajax=checkout, платёжного шлюза, доставки, SMTP, CRM/API, Telegram, webhooks, тяжёлых плагинов, медленной базы, PHP-ошибок или неправильного кеширования checkout.
Сначала откройте DevTools → Network и проверьте, какой запрос тормозит: wc-ajax=checkout или wc-ajax=update_order_review. Потом смотрите debug.log, WooCommerce logs, оплату, доставку, SMTP и внешние API.
Этот запрос обрабатывает финальное оформление заказа. Его могут задерживать создание заказа, оплата, письма, CRM, webhooks, генерация PDF, склад, кастомные hooks и медленная база данных.
Checkout нельзя кешировать как обычную страницу. Кеш помогает обычным страницам магазина, но оформление заказа нужно ускорять через оптимизацию PHP, базы, плагинов, доставки, оплаты и внешних API.
Потому что после клика WooCommerce запускает серверную обработку: проверку полей, создание заказа, оплату, доставку, письма, webhooks, CRM и другие хуки. Один медленный этап задерживает весь ответ.
Это AJAX-запрос WooCommerce, который отправляется при оформлении заказа. Именно он часто показывает реальное время обработки заказа после клика на кнопку.
Это AJAX-запрос, который пересчитывает итог заказа, доставку, налоги и купоны на checkout. Если он медленный, чаще всего проблема в доставке, налогах, купонах или checkout hooks.
Да. Если WooCommerce отправляет письма сразу после создания заказа, а SMTP отвечает медленно, покупатель может ждать завершения checkout дольше.
Да. Если заказ отправляется в CRM синхронно во время оформления, медленный API CRM задержит ответ покупателю. Лучше использовать очередь и фоновую отправку.
Да. Платёжный шлюз может долго ждать API, callback, webhook или неправильно менять статус заказа. Нужно проверить gateway logs и сравнить с другим способом оплаты.
Можно отключать только лишние скрипты и только после проверки. Нельзя отключать WooCommerce scripts, оплату, доставку и важные хуки, которые нужны для заказа.
В некоторых магазинах с большим количеством заказов HPOS может помочь снизить нагрузку на старые таблицы post/postmeta. Но перед включением нужно проверить совместимость всех плагинов.
Причина может быть в мобильном кеше, тяжёлом JavaScript, popups, мобильной мини-корзине, delay JS или отдельном мобильном шаблоне темы.
Нужно смотреть server logs, debug.log, max_execution_time, внешние API, оплату, доставку, SMTP и кастомные hooks. 504 обычно означает, что сервер не дождался завершения процесса.
Если WooCommerce долго оформляет заказ, причина почти всегда находится в серверной цепочке checkout: wc-ajax=checkout, оплата, доставка, письма, CRM, webhooks, база данных, PHP или кастомные хуки. Простая оценка PageSpeed здесь не поможет, потому что проблема возникает после клика “Оформить заказ”.
Правильный порядок такой: найти медленный AJAX-запрос в Network, включить debug.log, проверить WooCommerce logs, протестировать простую оплату и доставку, отключить тяжёлые интеграции на staging, проверить SMTP, базу и кеш. После этого можно точно понять, что задерживает покупателя, и ускорить checkout без риска сломать оплату, корзину и заказы.
Об авторе