2014-03-10 5 views
2

Я пытаюсь написать функцию, которая предложит бесплатную доставку (удалите все другие варианты), если заказ превышает 5 фунтов (80 унций), но он не работает, хотя код кажется правильным.WooCommerce Бесплатная доставка, если более 5 фунтов

Это то, что у меня есть:

// Hide ALL shipping options but FREe when over 80 ounches (5 pounds) 
add_filter('woocommerce_available_shipping_methods', 'ship_free_if_over_five_pounds' , 10, 1); 

/** 
* Hide ALL Shipping option but free if over 5 pounds 
* 
* @param array $available_methods 
*/ 
function ship_free_if_over_five_pounds($available_methods) { 
    global $woocommerce; 
    $whats_the_weight = $woocommerce->cart->cart_contents_weight; 

    if($whats_the_weight != 80) : 

     // Get Free Shipping array into a new array 
     $freeshipping = array(); 
     $freeshipping = $available_methods['free_shipping']; 

     // Empty the $available_methods array 
     unset($available_methods); 

     // Add Free Shipping back into $avaialble_methods 
     $available_methods = array(); 
     $available_methods[] = $freeshipping; 

    endif; 

    return $available_methods; 
} 

Есть мысли?

код основан на примере # 19 на этом сайте:
My 25 Best WooCommerce Snippets For WordPress Part 2

ответ

1

Я знаю, что это старый вопрос, но у меня есть этот недавний вариант ...

Во-первых, в вашем коде «, если заказ более 5 фунтов (80 унций)» ваш if заявление должно быть if($whats_the_weight > 80) вместо != ... Но я думаю, что ваш код немного устарел, если вы используете WooCommerce 2.6+.

После вместо использования global $woocommerce; с $woocommerce->cart->cart_contents_weight; вы можете использовать: WC()->cart->cart_contents_weight;

я это гораздо более свежий фрагмент кода based on this official thread для WooCommerce 2.6+. Вы должны попробовать:

add_filter('woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100); 

function my_hide_shipping_when_free_is_available($rates) { 

    $cart_weight = WC()->cart->cart_contents_weight; // Cart total weight 

    $free = array(); 
    foreach ($rates as $rate_id => $rate) { 
     if ('free_shipping' === $rate->method_id && $cart_weight > 80) { // <= your weight condition 
      $free[ $rate_id ] = $rate; 
      break; 
     } 
    } 
    return ! empty($free) ? $free : $rates; 
} 

Для WooCommerce 2,5, Вы должны попробовать это:

add_filter('woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2); 

function hide_shipping_when_free_is_available($rates, $package) { 

    $cart_weight = WC()->cart->cart_contents_weight; // Cart total weight 

    // Only modify rates if free_shipping is present 
    if (isset($rates['free_shipping']) && $cart_weight > 80) { // Here your weight condition 

     // To unset a single rate/method, do the following. This example unsets flat_rate shipping 
     unset($rates['flat_rate']); 

     // To unset all methods except for free_shipping, do the following 
     $free_shipping   = $rates['free_shipping']; 
     $rates     = array(); 
     $rates['free_shipping'] = $free_shipping; 
    } 

    return $rates; 
} 
Смежные вопросы