更改运输方式后更新woocommerce购物车

时间:2013-12-25 10:57:53

标签: php wordpress woocommerce shipping discount

我目前正在与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);
}

代码在技术上有效,我现在唯一的问题是,如果客户更改运输方式,即从“特定运输方式”改为“正常运输方式”(没有任何折扣)或反过来,它总是显示并计算先前选择的送货方式的折扣值。换句话说,它总是退一步,因此向客户显示错误的总金额。

有没有人有想法解决这个问题?

3 个答案:

答案 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')