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

マークの答えはうまくいきましたが、コードを実行する前に一時的な値をすべて削除する必要がありました。それ以外の場合は、保存された値を復元するだけです。

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 に答える