Member 7841300 Ответов: 1

Изменение способа доставки woocommerce на основе переключателей


У меня есть набор радиоприемников с доставкой и самовывозом в платежной форме. Мне нужно, чтобы способ доставки изменился с local_pickup на distance_rate_shipping, когда соответствующее радио будет проверено в форме.

Я смог использовать код из Установить способ доставки программно настраиваемые[^] чтобы изменить метод при загрузке. Я также попробовал ajax и уже настроил функцию, которая использует радио для добавления новой платы за туалет, опубликовал этот код ниже.

Что я уже пробовал:

add_action('wp_ajax_woocommerce_apply_collect', 'calculate2', 10);
add_action('wp_ajax_nopriv_woocommerce_apply_collect', 'calculate2', 10);

function calculate2() {
    if (isset($_POST['collect'])) {
        global $woocommerce;
        $district = $_POST['collect'];
        $user_role = get_user_role();        
        if ($district === "Return") {
          $val = 0;
        } elseif ($district === "Collect" && $user_role != 'business'){
          $val = 250;
        }
        session_start();
        $_SESSION['val2'] = $val;
    }
}

add_action('woocommerce_cart_calculate_fees', 'wpi_add_ship_fee2');

function wpi_add_ship_fee2() {
  @session_start();
  $user_role = get_user_role();
  $customshipcost = $_SESSION['val2'];
  if($customshipcost == 0) {
  } else {
    if(get_user_role() == 'business' || get_user_role() == 'administrator') {
        WC()->cart->add_fee('Collection Fee', 0, true,'');
    } else {
        WC()->cart->add_fee('Collection Fee', $customshipcost, true,'');
    }
  }
}


Я также попытался поместить функцию ajax и код 'WC()->session->set внутри действия 'woocommerce_before_checkout_shipping_form', но не смог использовать эти два подхода для изменения метода доставки.

Спасибо за вашу помощь

1 Ответов

Рейтинг:
2

Member 7841300

Я боролся с этим в течение 3 дней и решил сам... Я использовал ajax, чтобы определить, какое радио было выбрано и вызвать изменение на радио для способа доставки, а затем использовал $('body').trigger('update_checkout'); на ajax complete для обновления заказа

$('input[type=radio][name=billing_deliverypickup]').change(function () {
    billing_district = this.value;
    if (this.value == 'Delivery') {
    	$( "#shipping_method_0_distance_rate_shipping" ).trigger( "click" );
    }
    else if (this.value == 'Pickup') {
    	$( "#shipping_method_0_local_pickup3" ).trigger( "click" );
    }
    
    var data = {
        district: billing_district
    };
    
	  $.ajax({
	    url: 'http://pixelshowcase.co.za/kegtails/wp-content/themes/kegtails/update.php',
	    type: 'POST',
	    data: data,
	    beforeSend: function() {
	      $(".deltype").html(billing_district);
	    },
	    complete: function(data) {
	      $('body').trigger('update_checkout');
	    }
	  });
	  
    return false;
});


Надеюсь, что это поможет кому-то однажды, кто столкнется с той же проблемой