0

我正在尝试更新/刷新城市变化的运费,到目前为止,我只能通过手动刷新页面来做到这一点。

add_action( 'woocommerce_package_rates', 'check_minimum_and_city', 10, 2 );
function check_minimum_and_city($rates, $package){
    $selected_city = WC()->checkout->get_value('billing_city');
    $price_thirty = array('bat-yam','hulon','azur','tel-aviv-yafo','givatayim','ramat-gan','bnei-brak','rishon-letzion','netaim','yavne','kfar-nagid','galiya','ben-zakai','beit-gamliel');
    $price_fifty = array('einot','gan-shlomo','beit-oved','aseret','givat-brener','irus','misgav-dov','givton','kerem-yavne','beit-raban','rehovot','beit-elezri','beit-hanan','kvuzat-yavne','kfar-bilu','bnei-darom','nir-galim','kiryat-ekron','gedera','nes-tziona','kanot','gan-darom','netayim','mishmar-hashiva','gan-sorek','beit-dagan','ganot','beit-hanan-irus','hemed');
    $price_sixty = array('savion','ganei-tikva','or-yehuda','kiryat-ono','yehud','petah-tikva','ramat-hasharon','herzliya','kfar-shmariyahu','rishpon','raanana','kfar-saba','tsafria','beer-yaakov','netser-sireni','nir-tzvi','ramla','matsliax','bnaya','kfar-aviv');
    if(WC()->session->get( 'chosen_shipping_methods' )[0] == 'local_pickup:13'){            
        $minimum = 0;       
    }else{      
        $minimum_thirty = 100;
        $minimum_fifty = 150;
        $minimum_sixty = 200;
        if(in_array($selected_city, $price_thirty)){
            unset( $rates['flat_rate:18']);
            unset( $rates['flat_rate:19']);
            if(WC()->cart->subtotal < $minimum_thirty){
                throw new Exception( 
                    sprintf( 'סכום ההזמנה הנוכחית שלך עומד על %s, מינימום הזמנה לפני משלוח הינו %s.' , 
                        wc_price( WC()->cart->subtotal ),
                        wc_price( $minimum_thirty )
                    )
                );  
            }           
        }elseif(in_array($selected_city, $price_fifty)){
            unset( $rates['flat_rate:9']);
            unset( $rates['flat_rate:19']);
            if(WC()->cart->subtotal < $minimum_fifty){
                throw new Exception( 
                    sprintf( 'סכום ההזמנה הנוכחית שלך עומד על %s, מינימום הזמנה לפני משלוח הינו %s.' , 
                        wc_price( WC()->cart->subtotal ),
                        wc_price( $minimum_fifty )
                    )
                );
            }
        }elseif(in_array($selected_city, $price_sixty)){
            unset( $rates['flat_rate:9']);
            unset( $rates['flat_rate:18']);
            if(WC()->cart->subtotal < $minimum_sixty){
                throw new Exception( 
                    sprintf( 'סכום ההזמנה הנוכחית שלך עומד על %s, מינימום הזמנה לפני משלוח הינו %s.' , 
                        wc_price( WC()->cart->subtotal ),
                        wc_price( $minimum_sixty )
                    )
                );
            }
        }       
        return $rates;
    }   
}

当我选择一个城市字段(下拉自定义列表)时,我会通过 woocommerce 设置获得运费,但是当我更改它时,它不会更新费率。

add_filter( 'woocommerce_checkout_fields', 'city_dropdown_field' );
function city_dropdown_field( $fields ) {

    $city_args = wp_parse_args( array(
        'type' => 'select',
        'options' => array(
            ''                  => '',
            'yavne'             => 'יבנה',
            'kfar-nagid'        => 'כפר הנגיד',
            'galiya'            => 'גאליה',
            'ben-zakai'         => 'בן זכאי',
            'beit-gamliel'      => 'בית גמליאל',
            'bnaya'             => 'בניה',
            'einot'             => 'עינות',
            'kfar-aviv'         => 'כפר אביב',
            'gan-shlomo'        => 'גן שלמה',
            'beit-oved'         => 'בית עובד',
            'aseret'            => 'עשרת',
            'givat-brener'      => 'גבעת ברנר',
            'irus'              => 'אירוס',
            'misgav-dov'        => 'משגב דב',
            'givton'            => 'גיבתון',
            'kerem-yavne'       => 'כרם יבנה',
            'beit-raban'        => 'בית רבן',
            'rehovot'           => 'רחובות',
            'beit-elezri'       => 'בית אלעזרי',
            'beit-hanan'        => 'בית חנן',
            'kvuzat-yavne'      => 'קבוצת יבנה',
            'kfar-bilu'         => 'כפר בילו',
            'bnei-darom'        => 'בני דרום',
            'nir-galim'         => 'ניר גלים',
            'kiryat-ekron'      => 'קרית עקרון',
            'gedera'            => 'גדרה',
            'nes-tziona'        => 'נס ציונה',
            'kanot'             => 'כנות',
            'netayim'           => 'נטעים',
            'gan-darom'         => 'גן דרום',
            'givatayim'         => 'גבעתיים',
            'ramat-gan'         => 'רמת גן',
            'tel-aviv-yafo'     => 'תל אביב - יפו',
            'bnei-brak'         => 'בני ברק',
            'ramat-hasharon'    => 'רמת השרון',
            'herzliya'          => 'הרצליה',
            'kfar-shmariyahu'   => 'כפר שמריהו',
            'rishpon'           => 'רישפון',
            'raanana'           => 'רעננה',
            'kfar-saba'         => 'כפר סבא',
            'bat-yam'           => 'בת ים',
            'hulon'             => 'חולון',
            'azur'              => 'אזור',
            'savion'            => 'סביון',
            'ganei-tikva'       => 'גני תקווה',
            'or-yehuda'         => 'אור יהודה',
            'kiryat-ono'        => 'קרית אונו',
            'yehud'             => 'יהוד',
            'petah-tikva'       => 'פתח תקווה',
            'rishon-letzion'    => 'ראשון לציון',
            'mishmar-hashiva'   => 'משמר השבעה',
            'gan-sorek'         => 'גן שורק',
            'beit-dagan'        => 'בית דגן',
            'ganot'             => 'גנות',
            'beit-hanan-irus'   => 'בית חנן אירוס',
            'hemed'             => 'חמד',
            'tsafria'           => 'צפריה',
            'beer-yaakov'       => 'באר יעקב',
            'netser-sireni'     => 'נצר סירני',
            'nir-tzvi'          => 'ניר צבי',
            'ramla'             => 'רמלה',
            'matsliax'          => 'מצליח',
            'clear'             => true 
        ),
    ), $fields['shipping']['shipping_city'] );

    $fields['shipping']['shipping_city'] = $city_args;
    $fields['billing']['billing_city'] = $city_args;

    return $fields;

}

尝试使用此 jQuery,但没有任何效果

add_action( 'wp_footer', 'checkout_shipping_city_refresh_display' );
function checkout_shipping_city_refresh_display() {
    // On checkout
    if ( is_checkout() && ! is_wc_endpoint_url() ) :
    ?><script type="text/javascript">
    jQuery( function($){
        // Shipping fias code change & input events
        $(document.body).on( 'change', 'select[name=billing_city]', function() {
            console.log($(this).val());
        });
    });
    </script>
    <?php
    endif;
}

帮助表示赞赏。:-)

4

1 回答 1

0

我已经设法解决了这个问题,这是我的解决方案,答案是在更正的 AJAX 调用中,从多个运费更改为一个,并通过代码更改费率。

add_action('woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 );
function refresh_shipping_methods( $post_data ){    
    WC()->cart->calculate_shipping();
}

add_action( 'wp_footer', 'checkout_shipping_city_refresh_display' );
function checkout_shipping_city_refresh_display() {
    // On checkout
    if ( is_checkout() && ! is_wc_endpoint_url() ) :
    ?><script type="text/javascript">

    jQuery(document).on('change', 'select[name=billing_city]', function(){
         var requested_city = jQuery(this).val();
         ajaxurl = '<?php echo admin_url( 'admin-ajax.php' ) ?>'; // get ajaxurl

            var data = {
                    'action': 'get_and_set_shipping_rate',
                    'city': requested_city
                };
    
                jQuery.ajax({
                    type: "POST",
                    url: ajaxurl, // this will point to admin-ajax.php
                    data: data,
                    async: false,
                    success: function (response) {
                        console.log(response);
                        setTimeout(function (){
                            jQuery('.shipping_method:checked').trigger('change');
                        });
                    }
                });
    });
    </script>
    <?php
    endif;
}
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;
    wp_die();
}

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' );

function get_shipping_cost_by_city( $city ) {
    $cost = 30;
        $price_thirty = array('bat-yam','hulon','azur','tel-aviv-yafo','givatayim','ramat-gan','bnei-brak','rishon-letzion','netaim','yavne','kfar-nagid','galiya','ben-zakai','beit-gamliel');
        $price_fifty = array('einot','gan-shlomo','beit-oved','aseret','givat-brener','irus','misgav-dov','givton','kerem-yavne','beit-raban','rehovot','beit-elezri','beit-hanan','kvuzat-yavne','kfar-bilu','bnei-darom','nir-galim','kiryat-ekron','gedera','nes-tziona','kanot','gan-darom','netayim','mishmar-hashiva','gan-sorek','beit-dagan','ganot','beit-hanan-irus','hemed');
        $price_sixty = array('savion','ganei-tikva','or-yehuda','kiryat-ono','yehud','petah-tikva','ramat-hasharon','herzliya','kfar-shmariyahu','rishpon','raanana','kfar-saba','tsafria','beer-yaakov','netser-sireni','nir-tzvi','ramla','matsliax','bnaya','kfar-aviv');
    
        // SET HERE the default cost (when "calculated cost" is not yet defined)
        if(in_array($city, $price_thirty)){
            $cost = 30;
        }elseif(in_array($city, $price_fifty)){
            $cost = 50;
        }elseif(in_array($city, $price_sixty)){
            $cost = 60;
        }
    return $cost;
}


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 ){
    $selected_city = WC()->checkout->get_value('billing_city');
    $calculated_cost = get_shipping_cost_by_city($selected_city);

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    // SET HERE the default cost (when "calculated cost" is not yet defined)
    $cost = '30';

    // Iterating though Shipping Methods
    foreach ( $rates as $rate_key => $rate_values ) {
        $method_id = $rate_values->method_id;
        $rate_id = $rate_values->id;

        // For "Flat rate" Shipping" Method only
        if ( 'flat_rate' === $method_id ) {
            if( ! empty( $calculated_cost ) ) {
                $cost = $calculated_cost;
            }
            // Set the rate cost
            $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cost, 2);
            
            WC()->session->set( 'shipping_calculated_cost', $rates[$rate_id]->cost );
            
            // Taxes rate cost (if enabled)
            foreach ($rates[$rate_id]->taxes as $key => $tax){
                if( $rates[$rate_id]->taxes[$key] > 0 ){ // set the new tax cost
                    $taxes[$key] = number_format( $rates[$rate_id]->taxes[$key] * $cost, 2 );
                    $has_taxes = true;
                } else {
                    $has_taxes = false;
                }
            }
            if( $has_taxes )
                $rates[$rate_id]->taxes = $taxes;
        }
    }
    return $rates;
}
于 2021-06-01T08:07:38.530 回答