【问题标题】:Refresh shipping rates on city select field刷新城市选择字段的运费
【发布时间】:2021-05-31 08:43:08
【问题描述】:

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

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;
}

感谢您的帮助。 :-)

【问题讨论】:

    标签: wordpress woocommerce hook-woocommerce


    【解决方案1】:

    我已经设法解决了这个问题,这是我的解决方案,答案是在更正的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2018-01-30
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多