WooCommerce 中特定运输类别、最低金额和地理定位国家/地区的购物车消息

Posted

技术标签:

【中文标题】WooCommerce 中特定运输类别、最低金额和地理定位国家/地区的购物车消息【英文标题】:Cart Message for specific shipping class, minimum amount and geolocated country in WooCommerce 【发布时间】:2021-04-01 21:23:02 【问题描述】:

我试图使来自Cart Message for a specific shipping class and a minimal cart total in Woocommerce 的代码与我最近的代码Free shipping cart message for a specific shipping class, a minimal amount and a specific Country in Woocommerce 共存,并附加了多个条件:

add_action( 'woocommerce_before_calculate_totals', 'cart_items_shipping_class_message', 20, 1 );
function cart_items_shipping_class_message( $cart )
    if ( ! is_cart() || ( is_admin() && ! defined('DOING_AJAX') ) )
        return;    
    $shipping_class = 'supplier';
    $min_amout      = 20;
    $free_shipping  = 50;
    $amout_incl_tax = 0;
    foreach( $cart->get_cart() as $cart_item )     
        if( $cart_item['data']->get_shipping_class() === $shipping_class )            
            $amout_incl_tax += $cart_item['line_subtotal'] + $cart_item['line_subtotal_tax'];
               
    
    if( $amout_incl_tax > 0 && $amout_incl_tax < $min_amout && is_cart() && WC_Geolocation::geolocate_ip()['country'] === 'IT' )               
        remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );       
        wc_add_notice( sprintf( '<p><strong><font color="#cc1602">20 € of minimum amount on products SUPPLIER</font></strong></p><a href="/brand/supplier-slug" class="button">Add %s of products</a><span class="sub-button">' . wc_price($free_shipping - $amout_incl_tax) . 'for free shipping!</span>',
            wc_price($min_amout - $amout_incl_tax) ), 'error' );
    
    elseif( $amout_incl_tax > 0 && $amout_incl_tax < $min_amout && is_cart() && ! WC_Geolocation::geolocate_ip()['country'] === 'IT' )             
        remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );       
        wc_add_notice( sprintf( '<p><strong><font color="#cc1602">20 € of minimum amount on products SUPPLIER</font></strong></p><a href="/brand/supplier-slug" class="button">Add %s of products</a>',
            wc_price($min_amout - $amout_incl_tax) ), 'error' );
    
    elseif( $amout_incl_tax >= $min_amout && $amout_incl_tax < $free_shipping && is_cart() && WC_Geolocation::geolocate_ip()['country'] === 'IT' )             
        wc_add_notice( sprintf( '<p><strong><font color="green">FREE SHIPPING on products SUPPLIER width at least 50 €</font></strong></p><a href="/brand/supplier-slug" class="button free">Add %s of products for free shipping!</a>',
            wc_price($free_shipping - $amout_incl_tax) ), 'notice' );
    

购物车“Ajax 更新”似乎变慢了。也许可以减轻代码?

【问题讨论】:

【参考方案1】:

我替换了旧的&lt;font&gt; html 标签,使代码可翻译并且更加模块化。

“ajax 更新”速度变慢是由于 remove_action() 执行时“供应商”项目小计小于最低要求数量,并且无法改进。

您重新访问的代码:

add_action( 'woocommerce_before_calculate_totals', 'cart_items_shipping_class_message', 20, 1 );
function cart_items_shipping_class_message( $cart )
    if ( ( is_admin() && ! defined('DOING_AJAX' ) ) || ! is_cart() )
        return;

    $shipping_class = 'supplier';
    $min_amount      = 20;
    $free_shipping  = 50;
    $items_subtotal = 0;

    // Getting non discounted "supplier" cart items subtotal including taxes 
    foreach( $cart->get_cart() as $cart_item )
        // Targeting our defined shipping class only
        if( $cart_item['data']->get_shipping_class() === $shipping_class )
            // Add each subtotal from our defined shipping class only
            $items_subtotal += $cart_item['line_subtotal'] + $cart_item['line_subtotal_tax'];
        
    

    $is_geo_ip_italy = WC_Geolocation::geolocate_ip()['country'] === 'IT';

    if( $items_subtotal > 0 && $items_subtotal < $min_amount )
        remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );

        $free_message =  sprintf( ' <span class="sub-button">%s %s</span>',
            wc_price( $free_shipping - $items_subtotal ),
            __('for free shipping!', 'woocommerce')
        );

        wc_add_notice( sprintf( '<p><strong style="color:#cc1602;">%s %s</strong></p><a href="%s" class="button">%s</a>%s',
            wc_price( $min_amout ),
            __('of minimum amount on products SUPPLIER', 'woocommerce'),
            home_url('/brand/supplier-slug'),
            sprintf( __('Add %s of products', 'woocommerce'), wc_price($min_amount - $items_subtotal) ),
            $is_geo_ip_italy ? $free_message : '',
        ), 'error' );
    
    elseif( $items_subtotal >= $min_amount && $items_subtotal < $free_shipping && $is_geo_ip_italy )
        wc_add_notice( sprintf( '<p><strong style="color:green">%s %s</strong></p><a href="%s" class="button free">%s</a>',
            __('FREE SHIPPING on products SUPPLIER width at least', 'woocommerce'),
            wc_price( $free_shipping ),
            home_url('/brand/supplier-slug'),
            sprintf( __('Add %s of products for free shipping!', 'woocommerce'), wc_price($free_shipping - $items_subtotal) ),
        ), 'notice' );
    

代码进入活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

【讨论】:

看起来很完美,谢谢!或许您可以检查一下“子按钮”是否出现在不从意大利浏览的您面前? 必须将 $amout_incl_tax 替换为 $items_subtotal,最后一个 $min_amout 替换为 $free_shipping。 ;-)

以上是关于WooCommerce 中特定运输类别、最低金额和地理定位国家/地区的购物车消息的主要内容,如果未能解决你的问题,请参考以下文章

在 Woocommerce Shipping 方法费率中设置最低项目成本

根据运输类别和商品数量添加 Woocommerce 费用

当 WooCommerce 3 中提供免费送货时,隐藏细节统一费率

Magento:从最低订单金额中排除类别

WooCommerce 中特定产品类别的最低购物车数量

在 WooCommerce 中为特定邮政编码设置最低订购量