
在woocommerce中,商家经常需要根据特定商品收取额外的费用,例如服务费、包装费或处理费。然而,简单地为所有符合条件的商品添加一个统一的附加费,往往无法满足复杂业务需求。例如,如果希望产品a收取5元附加费,产品b收取10元附加费,而现有代码可能仅支持为多个产品id应用同一个附加费金额,这导致了灵活性不足。
原始代码示例:
add_action('woocommerce_cart_calculate_fees', 'add_fees_on_ids');
function add_fees_on_ids() {
if (is_admin() && !defined('DOING_AJAX')) {return;}
foreach( WC()->cart->get_cart() as $item_keys => $item ) {
if( in_array( $item['product_id'], fee_ids() )) {
WC()->cart->add_fee(__('ADDITIONAL FEE:'), 5);
}
}
}
function fee_ids() {
return array( 2179 ); // 只能指定一个产品ID或一组产品ID,但费用是固定的
}这段代码的局限性在于,WC()-youjiankuohaophpcncart->add_fee(__('ADDITIONAL FEE:'), 5); 中的 5 是一个固定值。即使 fee_ids() 返回多个产品ID,这些产品也只会应用相同的5元附加费。为了实现不同产品对应不同附加费的需求,我们需要一种更动态、更灵活的配置方式。
为了解决上述问题,最佳实践是利用PHP数组来建立商品ID与对应附加费的映射关系。这种方法避免了安装额外的插件,保持了网站的轻量级和高性能,并且易于管理和扩展。同时,我们应避免多次遍历购物车,以优化性能。
以下将介绍两种实现方案:
此方案适用于当您希望将购物车中所有符合条件的商品的附加费加起来,并以一个总金额显示给客户的情况。
原理说明: 我们创建一个配置数组,其中键代表附加费金额,值代表对应的商品ID。然后,遍历购物车中的每个商品,如果商品ID在我们的配置数组中,就将其对应的附加费累加到一个总变量中。最后,如果总附加费大于零,则一次性添加到购物车中。
示例代码:
/**
* 为购物车中特定商品添加汇总的附加费。
*
* @param WC_Cart $cart WooCommerce 购物车对象。
*/
function action_woocommerce_cart_calculate_fees_summed( $cart ) {
// 确保只在前台和非 AJAX 请求时执行
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
// 配置附加费与商品ID的映射关系。
// 格式为:附加费金额 => 商品ID
$settings = array(
10 => 1234, // 产品ID 1234 对应 10 单位的附加费
20 => 5678, // 产品ID 5678 对应 20 单位的附加费
5 => 30, // 产品ID 30 对应 5 单位的附加费
2 => 815, // 产品ID 815 对应 2 单位的附加费
);
// 初始化总附加费
$additional_fee_total = 0;
// 遍历购物车中的所有商品项
foreach ( $cart->get_cart_contents() as $cart_item ) {
$product_id = $cart_item['product_id'];
// 在 $settings 数组中查找当前商品的ID。
// 如果找到,array_search 会返回对应的键(即附加费金额)。
if ( false !== $fee_amount = array_search( $product_id, $settings ) ) {
$additional_fee_total += $fee_amount; // 累加附加费
}
}
// 如果总附加费大于 0,则将其添加到购物车中
if ( $additional_fee_total > 0 ) {
// 第三个参数为 false 表示该费用不含税
$cart->add_fee( __( '附加费用', 'woocommerce' ), $additional_fee_total, false );
}
}
add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees_summed', 10, 1 );代码解析:
此方案更具灵活性和用户友好性,因为它允许为每个符合条件的商品显示独立的附加费条目,让客户清楚地知道每笔额外费用来自何处。
原理说明: 我们使用一个多维数组来存储更详细的费用信息,包括 product_id、amount(金额)和 name(费用名称)。遍历购物车商品时,再嵌套循环遍历这个配置数组,如果商品ID匹配,则直接将该商品的附加费及其名称添加到购物车中。
示例代码:
/**
* 为购物车中每个特定商品添加单独的附加费。
*
* @param WC_Cart $cart WooCommerce 购物车对象。
*/
function action_woocommerce_cart_calculate_fees_individual( $cart ) {
// 确保只在前台和非 AJAX 请求时执行
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
// 配置:包含商品ID、金额和名称的多维数组
$settings = array(
array(
'product_id' => 30,
'amount' => 5,
'name' => __( '附加服务费', 'woocommerce' ),
),
array(
'product_id' => 813,
'amount' => 10,
'name' => __( '包装费', 'woocommerce' ),
),
array(
'product_id' => 815,
'amount' => 15,
'name' => __( '其他费用', 'woocommerce' ),
),
// 您可以根据需要添加更多配置
array(
'product_id' => 1234,
'amount' => 7.5,
'name' => __( '特殊处理费', 'woocommerce' ),
),
);
// 遍历购物车中的所有商品项
foreach ( $cart->get_cart_contents() as $cart_item ) {
$product_id = $cart_item['product_id'];
// 遍历设置数组,查找匹配的商品ID
foreach ( $settings as $setting ) {
if ( $setting['product_id'] == $product_id ) {
// 如果找到匹配项,则添加对应的费用
// 第三个参数为 false 表示该费用不含税
$cart->add_fee( $setting['name'], $setting['amount'], false );
// 如果一个产品只需要一种附加费,可以在这里添加 break; 语句
// break;
}
}
}
}
add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees_individual', 10, 1 );代码解析:
代码放置位置:
性能考量:
可翻译性:
调试与测试:
税费处理:
通过本文介绍的基于数组的PHP代码解决方案,您可以灵活且高效地在WooCommerce购物车中为不同的商品设置差异化的附加费。无论是选择汇总显示还是单独显示每笔费用,这些方法都比安装额外插件更轻量级,并能提供更好的性能和定制能力。正确地实施这些代码,将有助于您更好地管理WooCommerce商店的定价策略和用户体验。
以上就是在WooCommerce购物车中为不同商品添加差异化附加费的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号