我通过挂钩到woocommerce_cart_calculate_fees
操作来向购物车添加自定义费用,如下所示:
if (isset($_GET['discount'])) {
add_action('woocommerce_cart_calculate_fees', 'add_loyalty_discounts');
}
function add_loyalty_discounts(WC_Cart $cart)
{
$total = 0;
global $woocommerce;
foreach (WC()->cart->get_cart() as $cart_item_key => $item) {
$total += $item['data']->regular_price;
$woocommerce->cart->cart_contents[$cart_item_key]['discount_amount'] = $_GET['discount'];
}
if ($total < $_GET['discount']) {
wc_add_notice('You must spend more than €' . $_GET['discount'] . ' to use your loyalty discount.', 'error');
} else {
$current_user = wp_get_current_user();
$loyalty_points = empty(get_user_meta($current_user->ID, 'loyalty_points', true)) ? 0 : get_user_meta($current_user->ID, 'loyalty_points', true);
$loyalty_points = 100;
if ($loyalty_points < $_GET['discount']) {
wc_add_notice('You do not have enough loyalty points to apply this discount.', 'error');
} else {
$cart->add_fee('Loyalty Discount', -intval($_GET['discount']), true);
}
}
}
字符串
费用显示在购物车页面上,但不会持续到结账和订单页面。
我试过使用$cart->set_session()
,但没有效果。
更新:我已经创建了一个新的WP网站与空白主题(blankslate),只有最新版本的WooCommerce安装,我仍然得到错误。
3条答案
按热度按时间qgzx9mmu1#
**更新 (基于您新添加的代码)
你不能在
woocommerce_cart_calculate_fees
钩子中使用$_GET
、$_POST
或$_REQUEST
,因为这些变量会丢失。相反,你应该将你的$_GET 'discount']存储在WC_Session变量中。现在,你的代码已经过时了,有一些错误和遗漏的东西。
请尝试以下重新访问的代码:
字符串
代码放在你的子主题的function.php文件中(或插件中)。它应该可以工作。
要仅在结账页面应用费用,您将使用:用途:
型
相关:
zf2sa74q2#
我测试,它的工作与我的购物车和结帐页面都很好
字符串
7gcisfzg3#
原因是没有添加费用是因为我只在购物车页面上添加了费用。
WC_Cart
类不持久化费用。