При добавлении выбора радиокнопок к каждому элементу в корзине WooCommerce на странице оформления заказа Ajax, кажется, не всегда проходит правильный выбор радиокнопок. Он работает 75% времени, в другой раз он просто проходит предыдущий выбор.
В таблице представлены только два параметра для каждого элемента, по умолчанию для пользователя выбран верхний вариант по умолчанию. ,Я добавляю несколько отредактированное изображение, чтобы вы поняли идею. Таблица может содержать 1 элемент, как показано, или 20+, но всегда есть один набор вариантов для каждого элемента в корзине.
https://i.imgur.com/XkcDChP.jpg
До сих пор я пробовал разные вариантыиз кода AJAX и переработал эту вещь дважды за последние 4 дня, у меня действительно нет идей. Я действительно начал с этого вопроса (ссылка ниже), который заставил его работать большую часть пути. Я просто не понимаю, почему это работает только в 75% случаев. Кстати, когда я говорю 75% времени, я имею в виду, что у меня есть один предмет, который я выбираю, и я нажимаю взад-вперед по двум вариантам, я тоже не говорю здесь быстро, возможно, раз в 5 или 6 секунд.
Плата за обновление динамически на основе переключателей в кассе Woocommerce
/***** Code to add radio buttons to site for guarantees ****/
// Customizing Woocommerce radio form field
add_action( 'woocommerce_form_field_radio', 'custom_form_field_radio', 20, 4 );
function custom_form_field_radio( $field, $key, $args, $value ) {
if ( ! empty( $args['options'] ) && is_checkout() ) {
$field = str_replace( '</label><input ', '</label><br><input ', $field );
$field = str_replace( '<label ', '<label style="display:inline;margin-left:8px;" ', $field );
}
return $field;
}
// ---------------------------
add_action( 'woocommerce_cart_calculate_fees' , 'multiple_radio_switch_fees', 20, 1 );
function multiple_radio_switch_fees( $cart ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
if ( ! is_checkout() ) return;
foreach ( $cart->get_cart() as $cart_item ) {
$id = $cart_item['data']->get_id();
$fee = WC()->session->get( 'chosen_guarantee' . $id );
if ( (substr_count($fee, '_0')) ) {
$cart->add_fee( 'Included Guarantee: ' . $itemname, 0.00 );
} else {
$cart->add_fee( 'Upgraded Guarantee: ' . $itemname, 9.00 );
}
}
}
}
// Add a custom radio fields for packaging selection
add_action( 'woocommerce_after_order_notes', 'checkout_guarantee_addition', 20 );
function checkout_guarantee_addition( ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
global $woocommerce;
$tbl .= '<div class="divTable">';
$tbl .= '<div class="divTableBody">';
$tbl .= '<div class="divTableRow">';
$tbl .= '<div class="divTableCell"><span class="freeshipping-cart-notice">Item</span></div>';
$tbl .= '<div class="divTableCell"><span class="freeshipping-cart-notice">Upgrade Guarantee</span></div>';
$tbl .= '</div>';
foreach ( $woocommerce->cart->get_cart() as $cart_item ) {
$itemname = null;
// get the product id (or the variation id)
$id = $cart_item['data']->get_id();
// Get the pricing we will need
$itemname = $cart_item['data']->get_name();
$quantity = $cart_item['quantity'];
$tbl .= '<div class="divTableRow">';
$lsitem = sprintf('<div class="divTableCell">%s <strong class="product-quantity">× %s</strong></div>', $itemname, $quantity);
$tbl .= $lsitem;
$chosen = WC()->session->get('chosen_guarantee' . $id);
$chosen = empty($chosen) ? WC()->checkout->get_value('radio_guarantee' . $id) : $chosen;
$chosen = empty($chosen) ? $id . '_0' : $chosen;
$radios = woocommerce_form_field( 'radio_guarantee' . $id, array(
'type' => 'radio',
'class' => array( 'radio_guarantee' . $id, 'form-row-wide' ),
'options' => array(
$id . '_0' => __('Included Guarantee '.wc_price(0.00), $domain),
$id . '_1' => __('Upgraded Guarantee '.wc_price(9.00), $domain),
),
'default' => $chosen,
), $chosen );
$lspricedif = sprintf('<div class="divTableCell">%s</div>', $radios );
$tbl .= $lspricedif; // 14day $tbl .= '</div>';
$tbl .= '</div>';
}
$domain = 'woocommerce';
$tbl .= '</div>';
$tbl .= '</div>';
$tbl2 .= '</div>';
$tbl2 .= '</div>';
echo '</br><h3><span class="blueTextCheckout">'.__('Guarantee Options').'</span></h3>';
echo $tbl;
}
// jQuery - Ajax script
add_action( 'wp_footer', 'checkout_shipping_packing_script' );
function checkout_shipping_packing_script() {
if ( ! is_checkout() )
return; // Only checkout page
?>
<script type="text/javascript">
jQuery( function($){
// Added ^ to try to get what we need
$('form.checkout').on('change', 'input[name^=radio_guarantee]', function(e){
e.preventDefault();
var p = $(this).val();
$.ajax({
type: 'POST',
dataType: 'json',
url: wc_checkout_params.ajax_url,
data: {
'action': 'woo_get_ajax_data',
'guarantee': p,
},
success: function (result) {
$('body').trigger('update_checkout');
},
error: function(error){
}
});
});
});
</script>
<?php
}
// Php Ajax (Receiving request and saving to WC session)
add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' );
function woo_get_ajax_data() {
if ( isset( $_POST['guarante'] ) ){
$guarantee = sanitize_key( $_POST['guarantee'] );
$id = strtok( $guarantee, '_' ); // Trying to ensure that we set the correct item radio buttons
WC()->session->set('chosen_guarantee' . $id, $guarantee );
echo json_encode( $guarantee );
}
die();
}
Каков наилучший способ решить эту проблему? Это даже правильный путь решения проблемы?
Я вставил несколько строк отладки старой школы и завел файл, и он всегда проходил один из двух вариантов выбора для элемента каждый раз. Просто 75% времени это было то, что я выбрал, а остальные 25% - информация о предыдущих переключателях, а не та, которую я только что выбрал.
Работающая система - это последняя версия wordpress и woocommerce. и сервер запускает php 7.3 под litespeed.