Задать вопрос
Varikweru
@Varikweru

Как заставить woocommerce_update_order_review_fragments передавать верную информацию?

Всем привет!
Столкнулся со странной проблемой. Мне нужно было перенести способы доставки на странице Оформления заказа выше.
Вроде все работает, но неадекватно. При переключении способов они иногда возвращаются в предыдущее положение, поле "Адрес" (которое должно скрываться и открываться в зависимости от способа доставки) тоже живет своей жизнью.

Полез в ajax-запрос и ответ, который приходит от него.
  • В payload запроса есть поле shipping_method[0] и там указан верный способ доставки.
  • В ответе, если оставить блок способов доставки и в старом и в новом месте, то внутри строки woocommerce-checkout-review-order-table указан верный способ, но внутри строки my-custom-shipping-table (в ней как раз мой новый блок доставки) иногда висит предыдущий способ доставки. А иногда тот, что нужен. "Адрес", как я говорил выше, тоже то верно отображается, то нет.


То есть AJAX-запрос, инициированный woocommerce_update_order_review_fragments отдает неверный ответ. Такое чувство, что эта функция захватывает устаревшую информацию и после обновления подставляет её вновь.

Пробовал делать и как тут и как тут

Кто-нибудь сталкивался с подобным? Делал похожее 2 года назад, проблем не было. Может, в новой версии Woocommerce что-то поменяли?
  • Вопрос задан
  • 50 просмотров
Подписаться 1 Сложный Комментировать
Решения вопроса 1
@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 выглядит рабочим решением, особенно если он корректно переключает выбранный способ доставки. В любом случае, вышеописанные шаги должны помочь либо решить проблему, либо минимизировать её влияние.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Varikweru
@Varikweru Автор вопроса
В общем, я свою проблему решил костылем - по событию updated checkout запускается функция, которая вытаскивает из скрытого поля в review order значение актуального способа доставки и переключает выбор на него. В принципе, так как проблема касается чисто фронтенда (в заказ падает верный способ доставки с правильно рассчитанной стоимостью), то в целом на этом можно остановиться. Но интересен опыт тех, кто с этим еще сталкивался
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы