2013-12-25 4 views
0

В настоящее время я работаю над интернет-магазином с WooCommerce. Я столкнулся с проблемой, что хочу предоставить скидку клиентам, которые выбрали конкретный метод доставки. Скидка составляет 0,50 для каждого отдельного продукта. Я в принципе решить эту проблему с помощью следующего кода в моем "functions.php„:обновление woocommerce cart после смены способа доставки

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

Это решение предназначено для 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... 
    } 
} 

Надеюсь, что это поможет!

0

Это очень старый, но я столкнулся с этим вопросом и решил разработать решение.

Woocommerce хранит в базе данных предварительно рассчитанные итоговые значения корзины, а не вычисляет их на лету. Но выбор метода доставки сохраняется как переменная сеанса. Таким образом, изменения доставки не отражаются сразу при оформлении заказа без посещения или обновления страницы корзины.

С исходным размещенным кодом изменения доставки не отражались, потому что они не пересчитываются и не сохраняются. Чтобы сделать это, функция должна быть обманута, чтобы подумать, что сначала это страница корзины, а затем пересчитывает итоговые суммы, которые нужно сохранить.

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

И затем в конце функции после того, как все необходимые изменения были сделаны обновлены и сохранены.

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

Смотрите также Codex для WC_AJAX :: update_shipping_method()

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

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_%')"); 
}