2017-02-17 20 views
5

С WooCommerce мне нужно иметь бесплатную доставку на определенное количество кроме тяжелых товаров, которые входят в корзину.Бесплатная доставка в зависимости от веса и количества минимальной корзины

Кто-нибудь знает, что я должен делать?

Спасибо.

+0

Таким образом, вы хотите бесплатную доставку некоторых предметов в корзину, но не для других? –

+1

, пожалуйста, отредактируйте ваш вопрос в соответствии с [mcve] –

+0

эй, там есть kinda.I нужна бесплатная доставка только для легких продуктов более 250. Мне нужно иметь тяжелые продукты с ценами на доставку свыше 250 лимитов. – spy

ответ

3

Этот пользовательский код будет держать свободный метод перевозкы груза и скроют другие методы доставки, когда количество корзинка до и если продукты не тяжелый (менее 20 кг здесь) ... Для того, чтобы не разрешайте Бесплатная доставка для заказов менее 250, вы можете установить это в woocommerce (см. в конце).

Сначала вы должны будете убедиться, что вес устанавливается в каждом тяжелом продукте (для простых или переменных продуктов (в каждой вариации). Телега субтотальная здесь Без учета налогов(и вы можете изменить его к включению . налоги легко)

enter image description here

Тогда вот что обычай закрученный функция woocommerce_package_rates фильтра крючке:

add_filter('woocommerce_package_rates', 'conditionally_hide_other_shipping_based_on_items_weight', 100, 1); 
function conditionally_hide_other_shipping_based_on_items_weight($rates) { 

    // Set HERE your targeted weight (here is 20 kg) <== <== <== <== <== 
    $target_product_weight = 20; 

    // Set HERE your targeted cart amount (here is 250) <== <== <== <== <== 
    $target_cart_amount = 250; 
    // For cart subtotal amount EXCLUDING TAXES 
    WC()->cart->subtotal_ex_tax >= $target_cart_amount ? $passed = true : $passed = false ; 
    // For cart subtotal amount INCLUDING TAXES (replace by this): 
    // WC()->cart->subtotal >= $target_cart_amount ? $passed = true : $passed = false ; 

    // Iterating trough cart items to get the weight for each item 
    foreach(WC()->cart->get_cart() as $cart_item){ 
     if($cart_item['variation_id'] > 0) 
      $item_id = $cart_item['variation_id']; 
     else 
      $item_id = $cart_item['product_id']; 

     // Getting the product weight 
     $product_weight = get_post_meta($item_id , '_weight', true); 

     if(!empty($product_weight) && $product_weight >= $target_cart_amount){ 
      $light_products_only = false; 
      break; 
     } 
     else $light_products_only = true; 
    } 

    // If 'free_shipping' method is available and if products are not heavy 
    // and cart amout up to the target limit, we hide other methods 
    $free = array(); 
    foreach ($rates as $rate_id => $rate) { 
     if ('free_shipping' === $rate->method_id && $passed && $light_products_only) { 
      $free[ $rate_id ] = $rate; 
      break; 
     } 
    } 

    return ! empty($free) ? $free : $rates; 
} 

Код находится в файле functions.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Этот код проверяется, и она работает для простых и переменных продуктов ...

Вы также должны в WooCommerce настройки> Судовые, для каждой зоны отгрузки и для метода "Free Shipping" минимальная сумма заказа:

enter image description here

Вам необходимо обновить данные кэширования доставки: отключить, сохранить и включить, сохранить связанные методы доставки для текущей зоны доставки в настройках доставки woocommerce.

+0

Большое вам спасибо за ваше время! Будет ли это давать только тяжелые предметы за 1 кг стоимости доставки за 250 в то время как «легкие» предметы, которые включены в корзину, будут бесплатной доставкой? – spy

+0

Я не понимаю, я думаю, извините за это ... так что будет с тяжелыми предметами, которые находятся на тележке со светлыми? стоимость доставки, как я хочу? – spy

0

Для бесплатной доставки по определенной сумме вы можете использовать встроенную опцию WooCommerce.

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

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

     function hide_shipping_method_if_particular_product_available_in_cart($available_shipping_methods) 
     { 
      global $woocommerce; 

      // products_array should be filled with all the products ids 
      // for which shipping method (stamps) to be restricted. 

      $products_array = array(
       101, 
       102, 
       103, 
       104 
      ); 

      // You can find the shipping service codes by doing inspect element using 
      // developer tools of chrome. Code for each shipping service can be obtained by 
      // checking 'value' of shipping option. 

      $shipping_services_to_hide = array(
       'free_shipping', 

      ); 

      // Get all products from the cart. 

      $products = $woocommerce->cart->get_cart(); 

      // Crawl through each items in the cart. 

      foreach($products as $key => $item) { 

       // If any product id from the array is present in the cart, 
       // unset all shipping method services part of shipping_services_to_hide array. 

       if (in_array($item['product_id'], $products_array)) { 
        foreach($shipping_services_to_hide as & $value) { 
         unset($available_shipping_methods[$value]); 
        } 

        break; 
       } 
      } 

      // return updated available_shipping_methods; 
    return 
     } 
+0

эй там и спасибо за фрагмент.Мне нужна бесплатная доставка только для легких продуктов более 250. Мне нужно иметь тяжелые продукты с ценами на доставку свыше 250 лимитов. Этот фрагмент включает в себя это? Большое спасибо – spy

+0

бесплатная доставка за определенную минимальную сумму может быть установлена ​​через Woocommerce. –

+0

Тяжелые идентификаторы продукта могут быть добавлены в сниппет и может управлять доставку с slght modificatio –