基于服务自定义交付类型和 Woocommerce 中的项目总数的运费
Shipping rates based on service custom delivery type and items total in Woocommerce
我只需要一点帮助来在我的 WordPress 和 woocommerce 网站上显示正确的运费。
我将运费设置如下:
- 固定费率(送货):10 美元
- 免费送货(免费送货)
- 本地取件(Pickup):$0
当我下订单并进入结帐页面时,它为我提供了 select 从订单总计下方发货的选项。我不希望用户能够从选项中进行选择。
基本上我需要的是:
- 如果服务类型是自取,隐藏送货选项,只显示本地自取选项
- 如果服务类型是送货且订单总额为 60 美元或以下,则仅显示统一费率选项。
- 如果服务类型为送货且订单总额超过 60 美元,则仅
显示免费送货选项。
有人知道怎么设置吗?还有一点需要注意的是,当你加入购物车时,在菜单页面上,当你打开底部的订单审查容器时,它会自动添加一个运费,如果可以的话,最好不要在结账时才设置这个费用?
这是包含食品的网站:https://puffpastrydelights.com/order-online/
到目前为止我已经尝试过了,但它不起作用:
add_filter( 'woocommerce_package_rates', 'bbloomer_unset_shipping_when_free_is_available_in_zone');
function bbloomer_unset_shipping_when_free_is_available_in_zone( $rates ) {
$service = $_POST['wfs_service_type'];
if ($service == 'pickup') {
unset( $rates['flat_rate:1'] );
unset( $rates['free_shipping:3'] );
}else if ($service == 'delivery'){
unset( $rates['local_pickup:2'] );
if ( isset( $rates['free_shipping:3'] )) {
unset( $rates['flat_rate:1'] );
}
}
return $rates;
}
您的 service_type
保存在 cookie 中。您可以通过 $_COOKIE
检索。试试下面的代码。
add_filter( 'woocommerce_package_rates', 'unset_shipping_based_on_service_type_cart_total', 99 );
function unset_shipping_based_on_service_type_cart_total( $rates ) {
$total = WC()->cart->get_cart_contents_total();
$service = ( isset( $_COOKIE['service_type'] ) && $_COOKIE['service_type'] != '' ) ? $_COOKIE['service_type'] : 'pickup' ;
if ($service == 'pickup') {
unset( $rates['flat_rate:1'] );
unset( $rates['free_shipping:3'] );
}else if ( $service == 'delivery' && $total <= 60 ){
unset( $rates['local_pickup:2'] );
unset( $rates['free_shipping:3'] );
}else if ( $service == 'delivery' && $total > 60 ){
unset( $rates['local_pickup:2'] );
unset( $rates['flat_rate:1'] );
}
return $rates;
}
已更新
您需要先在 WC Session 变量中设置发布的交付类型。然后需要对您的代码进行如下更改:
add_action( 'init', 'set_service_type_in_a_wc_session' );
function set_service_type_in_a_wc_session() {
// Check that user session is set
if ( ! ( is_user_logged_in() || is_admin() )
&& isset(WC()->session) && ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
// Set a posted value in a WC Session variable
if ( isset($_POST['wfs_service_type']) ) {
WC()->session->set('service_type', sanitize_key($_POST['wfs_service_type']) );
}
}
add_filter( 'woocommerce_package_rates', 'unset_shipping_based_on_service_type_cart_total', 100, 2 );
function unset_shipping_based_on_service_type_cart_total( $rates, $package ) {
// Get discounted items subtotal for the current shipping package
$total = array_sum( wp_list_pluck( $package['contents'], 'line_total' ) );
$service = WC()->session->get('service_type');
if ( 'pickup' === $service ) {
unset($rates['flat_rate:1']);
unset($rates['free_shipping:3']);
}
elseif ( 'delivery' === $service ) {
unset($rates['local_pickup:2']);
if ( $total < 60 ){
unset($rates['free_shipping:3']);
} else {
unset($rates['flat_rate:1']);
}
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
不要忘记清空购物车以刷新运输缓存数据。
我只需要一点帮助来在我的 WordPress 和 woocommerce 网站上显示正确的运费。
我将运费设置如下:
- 固定费率(送货):10 美元
- 免费送货(免费送货)
- 本地取件(Pickup):$0
当我下订单并进入结帐页面时,它为我提供了 select 从订单总计下方发货的选项。我不希望用户能够从选项中进行选择。
基本上我需要的是:
- 如果服务类型是自取,隐藏送货选项,只显示本地自取选项
- 如果服务类型是送货且订单总额为 60 美元或以下,则仅显示统一费率选项。
- 如果服务类型为送货且订单总额超过 60 美元,则仅 显示免费送货选项。
有人知道怎么设置吗?还有一点需要注意的是,当你加入购物车时,在菜单页面上,当你打开底部的订单审查容器时,它会自动添加一个运费,如果可以的话,最好不要在结账时才设置这个费用?
这是包含食品的网站:https://puffpastrydelights.com/order-online/
到目前为止我已经尝试过了,但它不起作用:
add_filter( 'woocommerce_package_rates', 'bbloomer_unset_shipping_when_free_is_available_in_zone');
function bbloomer_unset_shipping_when_free_is_available_in_zone( $rates ) {
$service = $_POST['wfs_service_type'];
if ($service == 'pickup') {
unset( $rates['flat_rate:1'] );
unset( $rates['free_shipping:3'] );
}else if ($service == 'delivery'){
unset( $rates['local_pickup:2'] );
if ( isset( $rates['free_shipping:3'] )) {
unset( $rates['flat_rate:1'] );
}
}
return $rates;
}
您的 service_type
保存在 cookie 中。您可以通过 $_COOKIE
检索。试试下面的代码。
add_filter( 'woocommerce_package_rates', 'unset_shipping_based_on_service_type_cart_total', 99 );
function unset_shipping_based_on_service_type_cart_total( $rates ) {
$total = WC()->cart->get_cart_contents_total();
$service = ( isset( $_COOKIE['service_type'] ) && $_COOKIE['service_type'] != '' ) ? $_COOKIE['service_type'] : 'pickup' ;
if ($service == 'pickup') {
unset( $rates['flat_rate:1'] );
unset( $rates['free_shipping:3'] );
}else if ( $service == 'delivery' && $total <= 60 ){
unset( $rates['local_pickup:2'] );
unset( $rates['free_shipping:3'] );
}else if ( $service == 'delivery' && $total > 60 ){
unset( $rates['local_pickup:2'] );
unset( $rates['flat_rate:1'] );
}
return $rates;
}
已更新
您需要先在 WC Session 变量中设置发布的交付类型。然后需要对您的代码进行如下更改:
add_action( 'init', 'set_service_type_in_a_wc_session' );
function set_service_type_in_a_wc_session() {
// Check that user session is set
if ( ! ( is_user_logged_in() || is_admin() )
&& isset(WC()->session) && ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
// Set a posted value in a WC Session variable
if ( isset($_POST['wfs_service_type']) ) {
WC()->session->set('service_type', sanitize_key($_POST['wfs_service_type']) );
}
}
add_filter( 'woocommerce_package_rates', 'unset_shipping_based_on_service_type_cart_total', 100, 2 );
function unset_shipping_based_on_service_type_cart_total( $rates, $package ) {
// Get discounted items subtotal for the current shipping package
$total = array_sum( wp_list_pluck( $package['contents'], 'line_total' ) );
$service = WC()->session->get('service_type');
if ( 'pickup' === $service ) {
unset($rates['flat_rate:1']);
unset($rates['free_shipping:3']);
}
elseif ( 'delivery' === $service ) {
unset($rates['local_pickup:2']);
if ( $total < 60 ){
unset($rates['free_shipping:3']);
} else {
unset($rates['flat_rate:1']);
}
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
不要忘记清空购物车以刷新运输缓存数据。