Задать вопрос
Ответы пользователя по тегу AJAX
  • Как заставить woocommerce_update_order_review_fragments передавать верную информацию?

    @alex1nd
    Да, ситуация, с которой вы столкнулись, действительно может быть связана с изменениями в WooCommerce или поведением кэша при AJAX-запросах. Такое поведение иногда проявляется, когда WooCommerce кэширует значения между обновлениями или когда не все обновления фрагментов происходят синхронно. Есть несколько идей и подходов, которые помогут вам разобраться с проблемой или минимизировать влияние устаревших данных:

    Проверка на наличие фрагментов. Функция woocommerce_update_order_review_fragments обновляет только те части страницы, которые передаются в массиве fragments. Если ваш кастомный блок не указан там, WooCommerce может не обновлять его при изменении способа доставки. Попробуйте добавить нужные селекторы к массиву fragments для обновления кастомных элементов.

    add_filter( 'woocommerce_update_order_review_fragments', 'custom_shipping_fragments' );
    function custom_shipping_fragments( $fragments ) {
        ob_start();
        wc_get_template( 'path/to/your/template.php' ); // Замените путь на нужный шаблон
        $fragments['.my-custom-shipping-table'] = ob_get_clean();
        return $fragments;
    }


    Отключение кэширования фрагментов. Если проблема заключается в кэшировании, можно отключить кэширование для этого фрагмента. Попробуйте включить в functions.php следующий код, чтобы обновлять данные на клиенте при каждом изменении формы:

    add_filter( 'woocommerce_checkout_update_order_review', '__return_true' );


    Ручная проверка способа доставки. Если WooCommerce по-прежнему не синхронизирует способ доставки, можно добавить JavaScript-код для ручной проверки и коррекции данных при каждом обновлении, как вы уже сделали. При этом убедитесь, что привязываете обработчик к событию updated_checkout, что позволит вам корректно обрабатывать и отображать изменения.

    jQuery(document).on('updated_checkout', function() {
        var selectedShippingMethod = jQuery('input[name="shipping_method[0]"]:checked').val();
        jQuery('.my-custom-shipping-table').find('input[name="shipping_method[0]"]').val(selectedShippingMethod).change();
    });


    Тестирование с отключенными плагинами и темой. Иногда поведение WooCommerce может нарушаться из-за конфликтов с плагинами или темой. Попробуйте переключиться на дефолтную тему WooCommerce и временно отключить другие плагины, чтобы исключить конфликт.

    Проверка на стороне WooCommerce. Если код не работает в текущей версии WooCommerce, обратите внимание на документацию и релиз-ноты для выявления возможных изменений в API.

    Ваш подход с костылем на событии updated_checkout выглядит рабочим решением, особенно если он корректно переключает выбранный способ доставки. В любом случае, вышеописанные шаги должны помочь либо решить проблему, либо минимизировать её влияние.
    Ответ написан