Да, ситуация, с которой вы столкнулись, действительно может быть связана с изменениями в 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 выглядит рабочим решением, особенно если он корректно переключает выбранный способ доставки. В любом случае, вышеописанные шаги должны помочь либо решить проблему, либо минимизировать её влияние.