/**
  * Validate the chosen recurring shipping methods for each recurring shipping package.
  * Ensures there is at least one chosen shipping method and that the chosen method is valid considering the available
  * package rates.
  *
  * @since 2.0.14
  */
 public static function validate_recurring_shipping_methods()
 {
     $shipping_methods = WC()->checkout()->shipping_methods;
     $added_invalid_notice = false;
     $standard_packages = WC()->shipping->get_packages();
     foreach (self::$recurring_shipping_packages as $recurring_cart_key => $packages) {
         foreach ($packages as $package_index => $package) {
             // remove our unique flag from the available rates so we can compare rates
             foreach ($package['rates'] as $rate) {
                 unset($rate->recurring_cart_key);
             }
             if (isset($standard_packages[$package_index]) && $package['rates'] == $standard_packages[$package_index]['rates'] && apply_filters('wcs_cart_totals_shipping_html_price_only', true, $package, WC()->cart->recurring_carts[$recurring_cart_key])) {
                 // the recurring package rates match the initial package rates, there won't be a selected shipping method for this recurring cart package
                 // move on to the next package
                 continue;
             }
             $recurring_shipping_package_key = WC_Subscriptions_Cart::get_recurring_shipping_package_key($recurring_cart_key, $package_index);
             if (!isset($package['rates'][$shipping_methods[$recurring_shipping_package_key]])) {
                 if (!$added_invalid_notice) {
                     wc_add_notice(__('Invalid recurring shipping method.', 'woocommerce-subscriptions'), 'error');
                     $added_invalid_notice = true;
                 }
                 WC()->checkout()->shipping_methods[$recurring_shipping_package_key] = '';
             }
         }
     }
 }
 /**
  * Stores shipping info on the subscription
  *
  * @param WC_Subscription $subscription instance of a subscriptions object
  * @param WC_Cart $cart A cart with recurring items in it
  */
 public static function add_shipping($subscription, $cart)
 {
     // We need to make sure we only get recurring shipping packages
     WC_Subscriptions_Cart::set_calculation_type('recurring_total');
     foreach ($cart->get_shipping_packages() as $package_index => $base_package) {
         $package = WC_Subscriptions_Cart::get_calculated_shipping_for_package($base_package);
         $recurring_shipping_package_key = WC_Subscriptions_Cart::get_recurring_shipping_package_key($cart->recurring_cart_key, $package_index);
         $shipping_method_id = isset(WC()->checkout()->shipping_methods[$package_index]) ? WC()->checkout()->shipping_methods[$package_index] : '';
         if (isset(WC()->checkout()->shipping_methods[$recurring_shipping_package_key])) {
             $shipping_method_id = WC()->checkout()->shipping_methods[$recurring_shipping_package_key];
             $package_key = $recurring_shipping_package_key;
         } else {
             $package_key = $package_index;
         }
         if (isset($package['rates'][$shipping_method_id])) {
             $item_id = $subscription->add_shipping($package['rates'][$shipping_method_id]);
             if (!$item_id) {
                 throw new Exception(__('Error: Unable to create subscription. Please try again.', 'woocommerce-subscriptions'));
             }
             // Allows plugins to add order item meta to shipping
             do_action('woocommerce_add_shipping_order_item', $subscription->id, $item_id, $package_key);
             do_action('woocommerce_subscriptions_add_recurring_shipping_order_item', $subscription->id, $item_id, $package_key);
         }
     }
     WC_Subscriptions_Cart::set_calculation_type('none');
 }
 /**
  * Validate the chosen recurring shipping methods for each recurring shipping package.
  * Ensures there is at least one chosen shipping method and that the chosen method is valid considering the available
  * package rates.
  *
  * @since 2.0.14
  */
 public static function validate_recurring_shipping_methods()
 {
     $shipping_methods = WC()->checkout()->shipping_methods;
     $added_invalid_notice = false;
     $standard_packages = WC()->shipping->get_packages();
     foreach (WC()->cart->recurring_carts as $recurring_cart_key => $recurring_cart) {
         if (false === $recurring_cart->needs_shipping() || 0 == $recurring_cart->next_payment_date) {
             continue;
         }
         $packages = $recurring_cart->get_shipping_packages();
         foreach ($packages as $package_index => $base_package) {
             $package = self::get_calculated_shipping_for_package($base_package);
             if (isset($standard_packages[$package_index]) && $package['rates'] == $standard_packages[$package_index]['rates'] && apply_filters('wcs_cart_totals_shipping_html_price_only', true, $package, WC()->cart->recurring_carts[$recurring_cart_key])) {
                 // the recurring package rates match the initial package rates, there won't be a selected shipping method for this recurring cart package
                 // move on to the next package
                 continue;
             }
             $recurring_shipping_package_key = WC_Subscriptions_Cart::get_recurring_shipping_package_key($recurring_cart_key, $package_index);
             if (!isset($package['rates'][$shipping_methods[$recurring_shipping_package_key]])) {
                 if (!$added_invalid_notice) {
                     wc_add_notice(__('Invalid recurring shipping method.', 'woocommerce-subscriptions'), 'error');
                     $added_invalid_notice = true;
                 }
                 WC()->checkout()->shipping_methods[$recurring_shipping_package_key] = '';
             }
         }
     }
 }