add_action( 'woocommerce_before_calculate_totals', function( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( ! function_exists( 'is_checkout' ) || ! is_checkout() ) return; if ( ! $cart || is_wp_error( $cart ) ) return; static $processing = false; if ( $processing ) return; $processing = true; // --- זיהוי שיטת משלוח שנבחרה --- $delivery_methods_base = array( 'flat_rate', 'courier' ); // משלוח עד הבית $pickup_methods_base = array( 'local_pickup' ); // איסוף עצמי $chosen = WC()->session && is_array( WC()->session->get('chosen_shipping_methods') ) ? WC()->session->get('chosen_shipping_methods') : array(); $chosen_base = null; $chosen_rate_id = null; if ( ! empty( $chosen ) ) { $chosen_rate_id = $chosen[0]; // למשל "flat_rate:3" $parts = explode( ':', $chosen_rate_id ); $chosen_base = $parts[0]; // "flat_rate" / "local_pickup" } $is_delivery = in_array( $chosen_base, $delivery_methods_base, true ); $is_pickup = in_array( $chosen_base, $pickup_methods_base, true ); if ( ! $is_delivery && ! $is_pickup ) { $is_pickup = true; // ברירת מחדל } // --- סה"כ יחידות בסל --- $total_qty = 0; foreach ( $cart->get_cart() as $ci ) { $total_qty += (int) $ci['quantity']; } if ( $total_qty < 1 ) { $processing = false; return; } // --- יעד מחיר סופי (כולל משלוח) לפי הכמות --- if ( $is_pickup ) { $desired_total_including_shipping = 110 * $total_qty; } else { if ( $total_qty <= 5 ) { $map = array( 1 => 126, 2 => 236, 3 => 346, 4 => 460, 5 => 576, ); $desired_total_including_shipping = $map[ $total_qty ]; } else { $desired_total_including_shipping = 110 * $total_qty; } } // --- חישוב משלוח "כפוי" לפני שליפה (חשוב! אחרת נקבל 0) --- $shipping_cost = 0; if ( $is_delivery ) { // מייצרים את החבילות לפי העגלה הנוכחית $packages = WC()->cart->get_shipping_packages(); // מחשבים משלוח עכשיו כדי שה־rates יתמלאו WC()->shipping()->calculate_shipping( $packages ); // כעת שולפים את ה־rates המחושבים $calc_packages = WC()->shipping()->get_packages(); if ( ! empty( $calc_packages ) && isset( $calc_packages[0]['rates'] ) ) { $rates = $calc_packages[0]['rates']; if ( $chosen_rate_id && isset( $rates[ $chosen_rate_id ] ) ) { $rate = $rates[ $chosen_rate_id ]; // עלות + מיסים (אם יש) $shipping_cost = floatval( $rate->cost ); if ( ! empty( $rate->taxes ) && is_array( $rate->taxes ) ) { $shipping_cost += array_sum( array_map( 'floatval', $rate->taxes ) ); } } } } // --- עכשיו היעד ל-Subtotal של המוצרים בלבד --- $target_items_total = max( 0, $desired_total_including_shipping - $shipping_cost ); // --- חלוקת המחיר לפריטים: base + remainder --- $base = intdiv( $target_items_total, $total_qty ); $remainder = $target_items_total - ( $base * $total_qty ); if ( $remainder === 0 ) { foreach ( $cart->get_cart() as $item ) { if ( ! empty( $item['data'] ) ) { $item['data']->set_price( $base ); } } $processing = false; return; } $cart_object = WC()->cart; $existing_items = $cart->get_cart(); foreach ( $existing_items as $cart_item_key => $cart_item ) { if ( $remainder <= 0 ) break; if ( empty( $cart_item['data'] ) ) continue; $product = $cart_item['data']; $product_id = $cart_item['product_id']; $variation_id = isset( $cart_item['variation_id'] ) ? (int) $cart_item['variation_id'] : 0; $variation_data= isset( $cart_item['variation'] ) ? $cart_item['variation'] : array(); $quantity = (int) $cart_item['quantity']; if ( $quantity <= 0 ) continue; $q_plus = min( $remainder, $quantity ); $q_base = $quantity - $q_plus; if ( $q_plus === 0 || $q_base === $quantity ) { $product->set_price( $base ); continue; } // עדכון שורה מקורית כ-base if ( $q_base > 0 ) { $cart->cart_contents[ $cart_item_key ]['quantity'] = $q_base; $cart->cart_contents[ $cart_item_key ]['data']->set_price( $base ); } else { unset( $cart->cart_contents[ $cart_item_key ] ); } // שורת "+1" $unique_key = wp_generate_uuid4(); $new_item_data= array( 'mb_tier_split' => $unique_key ); $new_key = $cart_object->add_to_cart( $product_id, $q_plus, $variation_id, $variation_data, $new_item_data ); if ( $new_key ) { $cart->cart_contents[ $new_key ]['data']->set_price( $base + 1 ); } $remainder -= $q_plus; } if ( $remainder > 0 ) { foreach ( array_reverse( array_keys( $cart->cart_contents ) ) as $key ) { if ( $remainder <= 0 ) break; $q = (int) $cart->cart_contents[ $key ]['quantity']; if ( $q === 1 ) { $cart->cart_contents[ $key ]['data']->set_price( $base + 1 ); $remainder -= 1; } } } $processing = false; }, 9999 ); https://siddurariel.com/post-sitemap.xml 2025-07-30T15:45:06+00:00 https://siddurariel.com/page-sitemap.xml 2025-10-30T11:58:01+00:00 https://siddurariel.com/product-sitemap.xml 2025-10-05T11:57:37+00:00 https://siddurariel.com/category-sitemap.xml 2025-07-30T15:45:06+00:00 https://siddurariel.com/product_cat-sitemap.xml 2025-10-05T11:57:37+00:00 https://siddurariel.com/author-sitemap.xml 2025-11-02T13:22:40+00:00