我目前正在与WooCommerce合作开设网上商店。我遇到了一个问题,我想给选择特定送货方式的客户打折。每个产品的折扣为0.50。我基本上用“ functions.php ”中的以下代码解决了这个问题:
add_action('woocommerce_before_calculate_totals', 'woo_add_cart_fee');
function woo_add_cart_fee() {
global $woocommerce;
$cart = $woocommerce->cart->get_cart();
//Calculating Quantity
foreach ($cart as $cart_val => $cid) {
$qty += $cid['quantity'];
}
if ($woocommerce->cart->shipping_label == "specific shipping method") {
$woo_fee = $qty * (-0.5);
$woo_name = "discount for specific shipping method";
}
$woocommerce->cart->add_fee(__($woo_name, 'woocommerce'), $woo_fee, true);
}
代码在技术上有效,我现在唯一的问题是,如果客户更改运输方式,即从“特定运输方式”改为“正常运输方式”(没有任何折扣)或反过来,它总是显示并计算先前选择的送货方式的折扣值。换句话说,它总是退一步,因此向客户显示错误的总金额。
有没有人有想法解决这个问题?
答案 0 :(得分:3)
此解决方案适用于Woocommerce 2.1.X!
我不确定这是否有帮助。我遇到了类似的问题,我需要检索所选的送货方式。在文件\wp-content\plugins\woocommerce\includes\wc-cart-functions.php
中,我找到了一个名为wc_cart_totals_shipping_html()
的方法。
在此方法中,检查当前选定的送货方法,其中包含以下代码:
$packages = WC()->shipping->get_packages();
foreach ( $packages as $i => $package ) {
$chosen_method = isset( WC()->session->chosen_shipping_methods[ $i ] ) ? WC()->session->chosen_shipping_methods[ $i ] : '';
}
我在自己的functions.php
中使用此代码来检查当前选择的送货方式,但是它有效。例如:
add_filter( 'woocommerce_billing_fields', 'wc_change_required_fields');
function wc_change_required_fields($address_fields) {
$packages = WC()->shipping->get_packages();
foreach ( $packages as $i => $package ) {
$chosen_method = isset( WC()->session->chosen_shipping_methods[ $i ] ) ? WC()->session->chosen_shipping_methods[ $i ] : '';
}
if ($chosen_method == 'local_delivery') {
$address_fields['billing_address_1']['required'] = true;
// place your changes that depend on the shipping method here...
}
}
希望有所帮助!
答案 1 :(得分:0)
这是非常古老的,但我自己遇到了这个问题并且必须解决这个问题。
Woocommerce将预先计算的购物车总数存储在数据库中,而不是在运行中计算它们。但是运输方法选择存储为会话变量。因此,如果没有访问或刷新购物车页面,则不会在结帐时立即反映出货变更。
使用原始发布的代码,未反映发货更改,因为它们未重新计算和存储。要做到这一点,需要先欺骗该功能,先将其视为购物车页面,然后重新计算要存储的总数。
GLOBAL $woocommerce;
if ( ! defined('WOOCOMMERCE_CART') ) {
define( 'WOOCOMMERCE_CART', true );
}
然后在函数结束时,在完成所有所需的更改后刷新并存储。
WC()->cart->calculate_totals();
另请参阅WC_AJAX的CODEX :: update_shipping_method()
http://docs.woothemes.com/wc-apidocs/source-class-WC_AJAX.html#148-174
答案 2 :(得分:0)
Mark的回答对我有用,但是我必须在运行代码之前删除所有瞬态值。否则,它只会恢复保存的值。
var bar = $('.foo').data('jsp-variable')