WooCommerce: как добавить корзину в flyout в GeneratePress

Почему стоит использовать flyout корзину в GeneratePress с WooCommerce?

Flyout корзина — это удобный способ показать содержимое корзины покупателю без перехода на отдельную страницу. В GeneratePress, которая оптимизирована для скорости и простоты, flyout корзина позволяет повысить удобство пользователя и конверсию. WooCommerce по умолчанию не включает flyout корзину, поэтому нужно добавить эту функцию через кастомный код или плагины.

Диагностика: как проверить, есть ли flyout корзина на вашем сайте

Откройте любой товар на сайте и добавьте его в корзину. Если корзина отображается только через переход на страницу корзины или в виде мини-иконки без раскрывающегося меню, значит flyout корзина не реализована.

Для проверки можно использовать инструменты разработчика браузера (F12): на элементе корзины проверьте наличие выпадающего меню с товарами. Если его нет — flyout корзина отсутствует.

Пошаговое решение: добавляем flyout корзину в GeneratePress с помощью кода

1. Добавляем HTML-разметку flyout корзины

add_action('wp_footer', function() {
    ?>
    <div id="gp-flyout-cart" style="display:none; position:fixed; top:60px; right:20px; width:300px; background:#fff; border:1px solid #ccc; box-shadow:0 2px 8px rgba(0,0,0,0.1); z-index:9999;">
        <div class="gp-flyout-cart-header" style="padding:10px; border-bottom:1px solid #eee; font-weight:bold;">Корзина</div>
        <div class="gp-flyout-cart-content" style="max-height:400px; overflow-y:auto; padding:10px;"></div>
        <div class="gp-flyout-cart-footer" style="padding:10px; border-top:1px solid #eee; text-align:center;">
            <a href="<?php echo wc_get_cart_url(); ?>" class="button">Перейти в корзину</a>
        </div>
    </div>
    <?php
});

2. Добавляем кнопку открытия flyout корзины в хедер

add_action('generate_after_header', function() {
    ?>
    <button id="gp-flyout-cart-button" style="position:fixed; top:20px; right:20px; background:#0073aa; color:#fff; border:none; padding:8px 12px; cursor:pointer; z-index:10000;">
        Корзина (<span id="gp-cart-count"><?php echo WC()->cart->get_cart_contents_count(); ?></span>)
    </button>
    <?php
});

3. Добавляем JavaScript для открытия/закрытия и динамического обновления содержимого

add_action('wp_footer', function() {
    if (!is_cart() && !is_checkout()) : ?>
    <script>
    (function($) {
        function updateFlyoutCart() {
            $.ajax({
                url: wc_add_to_cart_params.ajax_url,
                type: 'POST',
                data: {
                    action: 'gp_get_flyout_cart'
                },
                success: function(response) {
                    $('.gp-flyout-cart-content').html(response);
                    $('#gp-cart-count').text($('.gp-flyout-cart-content .cart_item').length);
                }
            });
        }

        $('#gp-flyout-cart-button').on('click', function() {
            $('#gp-flyout-cart').toggle();
            if ($('#gp-flyout-cart').is(':visible')) {
                updateFlyoutCart();
            }
        });

        // Закрываем по клику вне блока
        $(document).on('click', function(e) {
            if (!$(e.target).closest('#gp-flyout-cart, #gp-flyout-cart-button').length) {
                $('#gp-flyout-cart').hide();
            }
        });

        // Обновляем корзину при добавлении товара
        $(document.body).on('added_to_cart', function() {
            updateFlyoutCart();
        });
    })(jQuery);
    </script>
    <?php endif;
});

4. Добавляем AJAX обработчик для вывода содержимого корзины

add_action('wp_ajax_gp_get_flyout_cart', 'gp_get_flyout_cart_callback');
add_action('wp_ajax_nopriv_gp_get_flyout_cart', 'gp_get_flyout_cart_callback');

function gp_get_flyout_cart_callback() {
    if (WC()->cart->is_empty()) {
        echo '<p>Корзина пуста.</p>';
    } else {
        foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
            $product = $cart_item['data'];
            $quantity = $cart_item['quantity'];
            echo '<div class="cart_item" style="border-bottom:1px solid #eee; padding:5px 0;">';
            echo '<strong>' . esc_html($product->get_name()) . '</strong> × ' . intval($quantity);
            echo '</div>';
        }
    }
    wp_die();
}

Проверка результата после внедрения

  • На фронтенде должна появиться кнопка «Корзина (N)» в правом верхнем углу.
  • При клике на кнопку появляется flyout корзина с товарами и ссылкой на страницу корзины.
  • Добавление товара через стандартные кнопки WooCommerce обновляет содержимое flyout без перезагрузки страницы.
  • При клике вне flyout корзина закрывается автоматически.

Частые ошибки и как их исправить

  • Flyout не появляется или не открывается. Проверьте, подключен ли jQuery, нет ли ошибок в консоли браузера.
  • Корзина не обновляется при добавлении товара. Убедитесь, что событие added_to_cart срабатывает, а AJAX-обработчик зарегистрирован.
  • Стиль flyout нарушен. Возможно, конфликт CSS GeneratePress или других плагинов — используйте изолированные стили с префиксом gp-flyout-cart.
  • Проблемы с кэшированием. Если используется плагин кэширования, отключите его кэш для AJAX-запросов или страницы с корзиной.

Практические советы по безопасности и производительности

  • AJAX-обработчик не должен выводить избыточных данных — ограничьтесь только необходимым для flyout содержимым.
  • Используйте nonce для AJAX-запросов, если планируете расширять функционал, чтобы предотвратить CSRF.
  • Оптимизируйте CSS и JS, чтобы flyout не влиял на скорость загрузки.
  • Если сайт на WooCommerce с большим трафиком, рассмотрите использование специализированных плагинов для flyout корзин, чтобы избежать проблем с масштабированием.

Сравнение вариантов реализации flyout корзины

МетодПлюсыМинусыРекомендации
Кастомный код (как в статье)Легко адаптировать, не требует сторонних плагинов, полное управлениеНужны знания PHP и JS, требует тестированияДля разработчиков с опытом, небольшие сайты
Плагины (например, WooCommerce Fly Cart)Быстрая установка, поддержка, готовый функционалМогут замедлять сайт, конфликты с темойДля пользователей без навыков кодирования
Использование GenerateBlocks + кастомных блоковГибкость, визуальное редактированиеСложнее динамически обновлять корзинуЕсли уже используете GenerateBlocks
Как автоматизировать создание резервных копий в GeneratePress на WordPress
27.03.2026
Как организовать каскадные стили в GeneratePress без конфликтов
30.01.2026
WooCommerce: как изменить текст подтверждения заказа в GeneratePress
17.05.2026
WooCommerce: как изменить шаблон страницы товара для зарегистрированных пользователей в GeneratePress
30.06.2026
Как добавить поддержку JavaScript-модулей в GeneratePress для улучшения производительности
07.04.2026