/** * After payment is completed on an order for switching a subscription, complete the switch. * * @param WC_Order|int $order A WC_Order object or ID of a WC_Order order. * @since 1.4 */ public static function maybe_complete_switch($order_id) { $original_subscription_key = get_post_meta($order_id, '_switched_subscription_key', true); if (!empty($original_subscription_key)) { $original_subscription = WC_Subscriptions_Manager::get_subscription($original_subscription_key); $original_order = new WC_Order($original_subscription['order_id']); if ('switched' !== $original_subscription['status']) { // Don't send "Cancelled Subscription" email to admins remove_action('cancelled_subscription', 'WC_Subscriptions_Email::send_subscription_email', 10, 2); // Cancel the existing subscription WC_Subscriptions_Manager::cancel_subscription($original_order->customer_user, $original_subscription_key); add_action('cancelled_subscription', 'WC_Subscriptions_Email::send_subscription_email', 10, 2); // Now set a custom status of "switched" $original_subscription['status'] = 'switched'; WC_Subscriptions_Manager::update_subscription($original_subscription_key, $original_subscription); wp_clear_scheduled_hook('scheduled_subscription_end_of_prepaid_term', array('user_id' => (int) $original_order->customer_user, 'subscription_key' => $original_subscription_key)); } } }
/** * Records the initial payment against a subscription. * * This function is called when a gateway calls @see WC_Order::payment_complete() and payment * is completed on an order. It is also called when an orders status is changed to completed or * processing for those gateways which never call @see WC_Order::payment_complete(), like the * core WooCommerce Cheque and Bank Transfer gateways. * * It will also set the start date on the subscription to the time the payment is completed. * * @param WC_Order|int $order A WC_Order object or ID of a WC_Order order. * @since 1.1.2 */ public static function maybe_record_order_payment($order) { if (!is_object($order)) { $order = new WC_Order($order); } $subscriptions_in_order = self::get_recurring_items($order); foreach ($subscriptions_in_order as $subscription_item) { $subscription_key = WC_Subscriptions_Manager::get_subscription_key($order->id, self::get_items_product_id($subscription_item)); $subscription = WC_Subscriptions_Manager::get_subscription($subscription_key); // No payments have been recorded yet if (empty($subscription['completed_payments'])) { // Don't duplicate orders remove_action('processed_subscription_payment', 'WC_Subscriptions_Renewal_Order::generate_paid_renewal_order', 10, 2); WC_Subscriptions_Manager::update_subscription($subscription_key, array('start_date' => gmdate('Y-m-d H:i:s'))); WC_Subscriptions_Manager::process_subscription_payments_on_order($order->id); WC_Subscriptions_Manager::safeguard_scheduled_payments($order->customer_user, $subscription_key); // Make sure orders are still generated for other payments in the same request add_action('processed_subscription_payment', 'WC_Subscriptions_Renewal_Order::generate_paid_renewal_order', 10, 2); } } }