php - 从 Woocommerce 中的自定义运费折扣中排除用户角色
问题描述
基于在 Woocommerce 3 答案代码中以编程方式设置自定义运费,我对其进行了修改,以便为每个卖家添加运费折扣。
add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 10, 2 );
function custom_shipping_methods( $rates, $package ) {
$reduction_cost_percentage = 30; // Discount percentage
foreach( WC()->cart->get_cart() as $cart_item ){
$in_cart_product_id = $cart_item['product_id'];
$cart_seller_id = get_post_field('post_author', $in_cart_product_id);
$cart_seller_meta = get_userdata($cart_seller_id);
$cart_seller_roles = $cart_seller_meta->roles;
if($cart_seller_roles[0] == 'seller'){
foreach( $rates as $rate_key => $rate ){
if( $rate->method_id != 'free_shipping'){
$rates[$rate_key]->cost = $rates[$rate_key]->cost * ((100-$reduction_cost_percentage) / 100);
return $rates;
}
}
}
}
}
现在我想从某个角色中排除这个折扣,例如seller_2
。我怎样才能做到这一点?
解决方案
您的代码中存在一些错误和疏忽,请尝试以下操作:
add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 10, 2 );
function custom_shipping_methods( $rates, $package ) {
// Loop through cart items for the current package
foreach( $package['contents'] as $cart_item ){
$seller_id = get_post_field('post_author', $cart_item['product_id']);
$seller_data = get_userdata($seller_id);
// Excluding product 'seller' user role
if ( ! empty($seller_data) && is_array($seller_data->roles) && in_array('seller', $seller_data->roles) ) {
return $rates; // stop the loop and return normally the shipping rates
}
}
$percentage = 30; // <== Set your discount percentage
$discount_rate = $percentage / 100;
// Loop through shipping rates for the current package when seller user role is not found
foreach( $rates as $rate_key => $rate ){
// Not for free shipping
if( $rate->method_id != 'free_shipping' ){
// Change rate cost
$rates[$rate_key]->cost = $rate->cost * $discount_rate;
$taxes = array(); // Initializing
// change taxes rate cost (if enabled)
foreach ($rate->taxes as $key => $tax){
if( $tax > 0 ){
$taxes[$key] = $tax * $discount_rate;
$has_taxes = true;
}
}
// Change taxes cost
if( $has_taxes ) {
$rates[$rate_key]->taxes = $taxes;
}
}
}
return $rates;
}
代码在您的活动子主题(活动主题)的 function.php 文件中。它应该有效。
清除运输缓存:
- 您需要清空购物车,以清除缓存的运输数据
- 或者在运输设置中,您可以禁用/保存任何运输方式,然后启用返回/保存。
推荐阅读
- java - 如何在 Java 的电报机器人中发送本地照片
- windows-services - Qt5 远程对象作为 Windows 服务和普通进程之间的进程间通信
- javascript - 如何使用 CSV 文件内容创建嵌套菜单
- wso2 - 如何从 WSO2 中的邮件中读取附件文件?
- reactjs - git push heroku master:找不到文件
- sql-server - 更新同一列SQL Server的语句时如何有多个案例
- xml - XSLT 将 XML 转换为 JSON
- haskell - 如何使用注释自定义 HLint 并将我的 Haskell 包标记为安全?
- ethereum - 构建默克尔树时如何避免最后一个未配对元素的问题
- c# - ASP.net 核心控制器稍后在运行时添加或修改