/** * 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] = ''; } } } }