WooCommerce 中特定运费 class、最低金额和地理位置国家/地区的购物车消息
Cart Message for specific shipping class, minimum amount and geolocated country in WooCommerce
我尝试从 Cart Message for a specific shipping class and a minimal cart total in Woocommerce coexist with my recent code 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 更新”似乎变慢了。也许可以简化代码?
我替换了旧的 <font>
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 文件。已测试并有效。
我尝试从 Cart Message for a specific shipping class and a minimal cart total in Woocommerce coexist with my recent code 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 更新”似乎变慢了。也许可以简化代码?
我替换了旧的 <font>
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 文件。已测试并有效。