@castetus

Как динамически изменить цену доставки на checkout?

Здравствуйте все!
Цена доставки формируется с помощью API курьерской компании при выборе населенного пункта, т.е. заранее она не известна. Нужно в момент, когда цена определяется, подставлять ее в заказ и пересчитывать сумму, и вот с этим проблема.
Что я сделал:
1) по запросу с клиента запускается calculate_shipping_for_package()
add_action('wp_ajax_set_shipping_price', 'set_shipping_price');
add_action('wp_ajax_nopriv_set_shipping_price', 'set_shipping_price');

function set_shipping_price(){
	$packages = WC()->cart->get_shipping_packages();
	foreach ($packages as $package_key => $package){
		$session_key  = 'shipping_for_package_'.$package_key;
		$stored_rates = WC()->session->__unset( $session_key );
		$WC_Shipping = new WC_Shipping();
		$WC_Shipping->calculate_shipping_for_package( $package, $package_key = 0);
		WC()->cart->calculate_shipping();
		WC()->cart->calculate_totals();
	}
	wp_die();
}

2) в хуке woocommerce_package_rates пытаюсь получить новую цену из $_POST:
add_filter( 'woocommerce_package_rates', 'custom_shipping_costs', 20, 2 );
	function custom_shipping_costs( $rates, $package ) {

		if (isset($_POST['cost'])){
			$new_cost = $_POST['cost'];
		}
		$new_cost = 0;
		$tax_rate = 0.2;

		foreach( $rates as $rate_key => $rate ){
			if( $rate->method_id != 'free_shipping'){
				$rates[$rate_key]->cost = $new_cost;
				$taxes = array();
				foreach ($rates[$rate_key]->taxes as $key => $tax){
					if( $rates[$rate_key]->taxes[$key] > 0 )
						$taxes[$key] = $new_cost * $tax_rate;
				}
				$rates[$rate_key]->taxes = $taxes;
			}
		}
		return $rates;
	}

Хук прекрасно срабатывает при загрузке, но по аяксу не хочет.
Что не так?
  • Вопрос задан
  • 203 просмотра
Решения вопроса 1
@castetus Автор вопроса
Решение найдено, да здравствует Гугл всемогущий :)
Может, пригодится кому:
add_action('wp_ajax_set_shipping_price', 'set_shipping_price');
add_action('wp_ajax_nopriv_set_shipping_price', 'set_shipping_price');

function set_shipping_price(){
	if (isset($_POST['cost'])){
		$new_cost = $_POST['cost'];
	}

	WC()->session->set( 'shipping_calculated_cost', $new_cost );

	wp_die();
}

add_filter('woocommerce_package_rates', 'update_shipping_costs_based_on_cart_session_custom_data', 10, 2);
function update_shipping_costs_based_on_cart_session_custom_data( $rates, $package ){

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;
    $cost = '0';
    $calculated_cost = WC()->session->get( 'shipping_calculated_cost');
    foreach ( $rates as $rate_key => $rate ) { 
		$method_id = $rate->method_id; 
		$rate_id = $rate->id;
        if ( 'flat_rate' === $method_id ) {
            if( ! empty( $calculated_cost ) ) {
                $cost = $calculated_cost;
            }
            $rates[$rate_id]->cost = $calculated_cost;
        }
    }
    return $rates;
}

И на клиенте update_checkout по саксессу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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