2017-05-19 19 views
0

エンドユーザーが都市、日時を選択できるカスタムコードがあります。配達率は都市によって変わるはずです。都市選択ボックスはチェックアウトページにあります。WooCommerceサイトのチェックアウトページで送料を更新する

都市を変更すると、オーダーレビューセクションに表示された配達の料金が正常に変更されます。ここまでは順調ですね。 残念ながら、注文後に価格が注文に達しません。それはどこかで失われる。

ヒントは、同じ都市選択ボックスも商品ページに表示されている可能性があります。ユーザーがカートに追加するときに選択してチェックアウトに行くと、配信レートが表示され、注文を提出するときに失われていません。

出荷レートを更新するためにリフレッシュする必要がありますか?

(成功した)レートを更新機能

function adjust_shipping_rate($rates){ 
    global $woocommerce; 

     foreach ($rates as $rate) { 
      $cost = $rate->cost; 
      $rate->cost = $_COOKIE['shipping_city_cost']; 
     } 
     return $rates; 
} 
add_filter('woocommerce_package_rates', 'adjust_shipping_rate', 50, 1); 

UPDATE 21-05-2017

これはクッキーが更新される方法です:選択ボックスが変更されると、非同期ajaxコールが起動され、次のPHPコードが実行されます。ここで

function get_and_set_shipping_rate(){ 
    $shipping_city = $_POST['city']; 
    $shipping_cost = get_shipping_cost_by_city($shipping_city); 
    setcookie('shipping_city_cost', $shipping_cost, time() + (86400 * 30), '/'); 
    $_COOKIE['shipping_city_cost'] = $shipping_cost; 
    echo 'Shipping cost updated: '.$shipping_city.' : '.$shipping_cost; 
} 

add_action('wp_ajax_get_and_set_shipping_rate', 'get_and_set_shipping_rate'); 
add_action('wp_ajax_nopriv_get_and_set_shipping_rate', 'get_and_set_shipping_rate'); 

は、AJAX呼び出しです:これにより

jQuery(document).on('change', '#shipping_delivery_city', function(){ 
    var requested_city = jQuery(this).val(); 
     var data = { 
       'action': 'get_and_set_shipping_rate', 
       'city': requested_city 
      }; 

      jQuery.ajax({ 
       type: "POST", 
       url: shipping_dates.ajax_url, 
       data: data, 
       async: false, 
       success: function (response) { 
        console.log(response); 
       } 
      }); 
}); 
+0

はどのように '$の_COOKIE [ 'shipping_city_costを']'に設定されていますか? – Reigel

+0

@Reigelここでお手伝いしてくれてありがとう。上記のアップデートをご覧ください。 –

+0

これらのコードはチェックアウトページでのみ必要ですか? – Reigel

答えて

0

、私は2つの仮定を持っています。 1.)チェックアウトページでこのコードを使用しています。 2.)あなたはすでに、独自の機能get_shipping_cost_by_city

add_action('woocommerce_checkout_update_order_review', 'woocommerce_checkout_update_order_review'); 
function woocommerce_checkout_update_order_review($post_data){ 

    $data = array(); 
    $vars = explode('&', $post_data); 
    foreach ($vars as $k => $value){ 
     $v = explode('=', urldecode($value)); 
     $data[$v[0]] = $v[1]; 
    } 
    $shipping_cost = get_shipping_cost_by_city($data['billing_city']); 
    WC()->session->set('shipping_city_cost', $shipping_cost); 
    foreach (WC()->cart->get_shipping_packages() as $package_key => $package) { 
     // this is needed for us to remove the session set for the shipping cost. Without this, we can't set it on the checkout page. 
     WC()->session->set('shipping_for_package_' . $package_key, false); 
    } 

} 

add_filter('woocommerce_package_rates', 'adjust_shipping_rate', 50); 
function adjust_shipping_rate($rates){ 

    foreach ($rates as $rate) { 
     $cost = $rate->cost; 
     $rate->cost = WC()->session->get('shipping_city_cost'); 
    } 
    return $rates; 
} 

設定は/ shipping_city_costの取得がWC()->session->setWC()->session->getによって行われています。私はajax関数を置く必要はありませんwoocommerce_checkout_update_order_reviewは、チェックアウトページで更新が行われるたびにajaxコール内のアクションフックです。このテストのための

は、私はこの機能を使用します。

function get_shipping_cost_by_city($city) { 
    if ($city == 'Ormoc City'){ 
     return 100; 
    } 
    return 130; 
} 
関連する問題