Intereting Posts
CodeIgniter настраивает разные IP-адреса для данных READ и WRITE MySQL в ATK4 Могу ли я определить другой шаблон от frontend до back end? Как запустить несколько PHP-скриптов из PHP-скрипта (например, пакетного файла)? «пройти через» загрузку php на s3 амазонки? Обновление Composer Laravel PHP не может создать каталог с mkdir Существует ли стандартный скелет или инструкции для создания пакета Symfony2 с открытым исходным кодом в комплекте с travis-ci и композитором? Как декодировать что-то, начинающееся с «\ u» с помощью PHP Проще чем использовать корпус переключателя для изменения цвета Сохранение IP-адреса в базе данных MySQL с использованием PHP PHPMailer: ошибка SMTP: не удалось подключиться к SMTP-хосту Как сделать MD5 более безопасным? Или это действительно необходимо? Просмотр рендеринга CakePHP в Shell не работает PHP: array_map на объекте? WordPress: скрипт JQuery с одной страницей не работает?

Отгрузка рассчитывается по весу и количеству товаров

На веб-сайте клиента WooCommerce доступен способ бесплатной доставки для заказов объемом до 250. Я использую код ниже (из этого ответа ) , чтобы скрыть другие тарифы доставки, когда сумма заказа превышает 250, за исключением случаев, когда есть тяжелые предметы в корзина.

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 ) { // targeted weight $target_product_weight = 12; $target_cart_amount = 250; WC()->cart->subtotal_ex_tax >= $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; } 

Но теперь я хотел бы установить переменную стоимость доставки, которая будет рассчитана двумя способами:

  • Когда количество заказов ниже 250, расчет будет составлять 1 евро за килограмм от общего веса предметов заказа.
  • Когда количество заказов достигает 250, расчет будет производиться только по весу тяжелых предметов (1 евро за килограмм). Если нет тяжелых предметов, доступен бесплатный тариф доставки.

Как я могу достичь этого, так как это немного сложно?
Любой трек?

Я пробовал некоторые существующие связанные плагины, но они не подходят для этого случая.

Благодарю.

    Да, это возможно без плагина с пользовательским платежом за доставку , рассчитанным на вес корзины и количество корзины … Но вам нужно будет установить способ доставки 'Flat rate' с минимальной суммой . Обычно это должно работать с кодом, который вы используете.

    Вот этот код (прокомментировал) :

     //Adding a custom Shipping Fee to cart based conditionaly on weight and cart amount add_action('woocommerce_cart_calculate_fees', 'custom_conditional_shipping_fee', 10, 1); function custom_conditional_shipping_fee( $cart_object ){ #### YOUR SETTINGS #### // Your targeted "heavy" product weight $target_weight = 20; // Your targeted cart amount $target_cart_amount = 250; // Price by Kg; $price_kg = 1; // Amount set in 'flat rate' shipping method; $flat_rate_price; // Initializing variables $fee = 0; $calculated_weight = 0; // 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 through each cart items foreach( $cart_object->get_cart() as $cart_item ){ // Item id ($product ID or variation ID) 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); // Line item weight $line_item_weight = $cart_item['quantity'] * $product_weight; // When cart amount is up to 250, Adding weight of heavy items if($passed && $product_weight > $target_weight) $calculated_weight += $line_item_weight; } #### Making the fee calculation #### // Cart is up to 250 with heavy items if ( $passed && $calculated_weight != 0 ) { // Fee is based on cumlated weight of heavy items $fee = ($calculated_weight * $price_kg) - $flat_rate_price; } // Cart is below 250 elseif ( !$passed ) { // Fee is based on cart total weight $fee = ($cart_object->get_cart_contents_weight( ) * $price_kg) - $flat_rate_price; } #### APPLYING THE CALCULATED FEE #### // When cart is below 250 or when there is heavy items if ($fee > 0){ // Rounding the fee $fee = round($fee); // This shipping fee is taxable (You can have it not taxable changing last argument to false) $cart_object->add_fee( __('Shipping weight fee', 'woocommerce'), $fee, true); } } 

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

    Этот код проверен и работает

    Минимальная сумма «Единой ставки» вычитается из расчета платы, таким образом, клиент оплачивает правильную цену .