/**
 * Get recurring shipping methods.
 *
 * @access public
 */
function wcs_cart_totals_shipping_html()
{
    $initial_packages = WC()->shipping->get_packages();
    $show_package_details = count(WC()->cart->recurring_carts) > 1 ? true : false;
    $show_package_name = true;
    // Create new subscriptions for each subscription product in the cart (that is not a renewal)
    foreach (WC()->cart->recurring_carts as $recurring_cart_key => $recurring_cart) {
        // Create shipping packages for each subscription item
        if (WC_Subscriptions_Cart::cart_contains_subscriptions_needing_shipping() && 0 !== $recurring_cart->next_payment_date) {
            // This will get a package with the 'recurring_cart_key' set to 'none' (because WC_Subscriptions_Cart::display_recurring_totals() set WC_Subscriptions_Cart::$calculation_type to 'recurring_total', but WC_Subscriptions_Cart::$recurring_cart_key has not been set), which ensures that it's a unique package, which we need in order to get all the available packages, not just the package for the recurring cart calculation we completed previously where WC_Subscriptions_Cart::filter_package_rates() removed all unchosen rates and which WC then cached
            $packages = $recurring_cart->get_shipping_packages();
            foreach ($packages as $i => $base_package) {
                $product_names = array();
                $package = WC_Subscriptions_Cart::get_calculated_shipping_for_package($base_package);
                $index = sprintf('%1$s_%2$d', $recurring_cart_key, $i);
                if ($show_package_details) {
                    foreach ($package['contents'] as $item_id => $values) {
                        $product_names[] = $values['data']->get_title() . ' ×' . $values['quantity'];
                    }
                    $package_details = implode(', ', $product_names);
                } else {
                    $package_details = '';
                }
                $chosen_initial_method = isset(WC()->session->chosen_shipping_methods[$i]) ? WC()->session->chosen_shipping_methods[$i] : '';
                $chosen_recurring_method = isset(WC()->session->chosen_shipping_methods[$recurring_cart_key . '_' . $i]) ? WC()->session->chosen_shipping_methods[$recurring_cart_key . '_' . $i] : $chosen_initial_method;
                if (1 === count($package['rates']) || isset($package['rates'][$chosen_initial_method]) && isset($initial_packages[$i]) && $package['rates'] == $initial_packages[$i]['rates'] && apply_filters('wcs_cart_totals_shipping_html_price_only', true, $package, $recurring_cart)) {
                    $shipping_method = 1 === count($package['rates']) ? current($package['rates']) : $package['rates'][$chosen_initial_method];
                    // packages match, display shipping amounts only
                    ?>
					<tr class="shipping recurring-total <?php 
                    echo esc_attr($recurring_cart_key);
                    ?>
">
						<th><?php 
                    echo esc_html(sprintf(__('Shipping via %s', 'woocommerce-subscriptions'), $shipping_method->label));
                    ?>
</th>
						<td>
							<?php 
                    echo wp_kses_post(wcs_cart_totals_shipping_method_price_label($shipping_method, $recurring_cart));
                    ?>
							<?php 
                    if (1 === count($package['rates'])) {
                        ?>
								<?php 
                        wcs_cart_print_shipping_input($index, $shipping_method);
                        ?>
								<?php 
                        do_action('woocommerce_after_shipping_rate', $shipping_method, $index);
                        ?>
							<?php 
                    }
                    ?>
							<?php 
                    if (!empty($show_package_details)) {
                        ?>
								<?php 
                        echo '<p class="woocommerce-shipping-contents"><small>' . esc_html($package_details) . '</small></p>';
                        ?>
							<?php 
                    }
                    ?>
						</td>
					</tr>
					<?php 
                } else {
                    // Display the options
                    $product_names = array();
                    if ($show_package_name) {
                        $package_name = apply_filters('woocommerce_shipping_package_name', sprintf(_n('Shipping', 'Shipping %d', $i + 1, 'woocommerce-subscriptions'), $i + 1), $i, $package);
                    } else {
                        $package_name = '';
                    }
                    wc_get_template('cart/cart-recurring-shipping.php', array('package' => $package, 'available_methods' => $package['rates'], 'show_package_details' => $show_package_details, 'package_details' => $package_details, 'package_name' => $package_name, 'index' => $index, 'chosen_method' => $chosen_recurring_method, 'recurring_cart_key' => $recurring_cart_key, 'recurring_cart' => $recurring_cart), '', plugin_dir_path(WC_Subscriptions::$plugin_file) . 'templates/');
                    $show_package_name = false;
                }
                do_action('woocommerce_subscriptions_after_recurring_shipping_rates', $index, $base_package, $recurring_cart, $chosen_recurring_method);
            }
        }
    }
}
 /**
  * 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');
 }