0

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

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

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

4

3 回答 3

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...
    }
}

希望有帮助!

于 2014-02-27T11:40:19.297 回答
0

这已经很老了,但我自己遇到了这个问题,不得不找出解决方案。

Woocommerce 在数据库中存储预先计算的购物车总数,而不是即时计算它们。但是运输方式选择存储为会话变量。因此,如果不访问或刷新购物车页面,运输更改不会在结账时立即反映出来。

使用原始发布的代码,运输更改没有反映,因为它们没有重新计算和存储。为此,需要先让函数认为它是购物车页面,然后重新计算要存储的总数。

GLOBAL $woocommerce;
if ( ! defined('WOOCOMMERCE_CART') ) {
  define( 'WOOCOMMERCE_CART', true );
}

然后在函数结束时,在完成所有所需的更改后刷新并存储。

WC()->cart->calculate_totals();

另见 WC_AJAX::update_shipping_method() 的 CODEX

http://docs.woothemes.com/wc-apidocs/source-class-WC_AJAX.html#148-174

于 2015-03-24T23:33:32.630 回答
0

马克的回答对我有用,但是我必须在运行代码之前删除所有瞬态值。否则,它只会恢复保存的值。

public function clear_shipping_transients() {
  global $wpdb;

  $wpdb->query( "DELETE FROM `$wpdb->options` WHERE `option_name` LIKE ('_transient_cp_quote_%') OR `option_name` LIKE ('_transient_timeout_cp_quote_%') OR `option_name` LIKE ('_transient_wc_ship_%')" );
}
于 2015-08-18T23:16:12.183 回答