/** * Update the recurring payment method on a subscription order. * * @param array $available_gateways The payment gateways which are currently being allowed. * @since 1.4 */ public static function update_payment_method($subscription, $new_payment_method) { $old_payment_method = $subscription->payment_method; $old_payment_method_title = $subscription->payment_method_title; $available_gateways = WC()->payment_gateways->get_available_payment_gateways(); // Also inits all payment gateways to make sure that hooks are attached correctly do_action('woocommerce_subscriptions_pre_update_payment_method', $subscription, $new_payment_method, $old_payment_method); // Make sure the subscription is cancelled with the current gateway WC_Subscriptions_Payment_Gateways::trigger_gateway_status_updated_hook($subscription, 'cancelled'); // Update meta update_post_meta($subscription->id, '_old_payment_method', $old_payment_method); update_post_meta($subscription->id, '_payment_method', $new_payment_method); if (isset($available_gateways[$new_payment_method])) { $new_payment_method_title = $available_gateways[$new_payment_method]->get_title(); } else { $new_payment_method_title = ''; } update_post_meta($subscription->id, '_old_payment_method_title', $old_payment_method_title); update_post_meta($subscription->id, '_payment_method_title', $new_payment_method_title); if (empty($old_payment_method_title)) { $old_payment_method_title = $old_payment_method; } if (empty($new_payment_method_title)) { $new_payment_method_title = $new_payment_method; } // Log change on order $subscription->add_order_note(sprintf(_x('Payment method changed from "%1$s" to "%2$s" by the subscriber from their account page.', '%1$s: old payment title, %2$s: new payment title', 'woocommerce-subscriptions'), $old_payment_method_title, $new_payment_method_title)); do_action('woocommerce_subscription_payment_method_updated', $subscription, $new_payment_method, $old_payment_method); do_action('woocommerce_subscription_payment_method_updated_to_' . $new_payment_method, $subscription, $old_payment_method); do_action('woocommerce_subscription_payment_method_updated_from_' . $old_payment_method, $subscription, $new_payment_method); }
/** * Get the new payment data from POST and check the new payment method supports * the new admin change hook. * * @since 2.0 * @param $subscription WC_Subscription */ public static function save_meta($subscription) { if (empty($_POST['_wcsnonce']) || !wp_verify_nonce($_POST['_wcsnonce'], 'wcs_change_payment_method_admin')) { return; } $payment_gateways = WC()->payment_gateways->payment_gateways(); $payment_method = isset($_POST['_payment_method']) ? wc_clean($_POST['_payment_method']) : ''; $payment_method_meta = apply_filters('woocommerce_subscription_payment_meta', array(), $subscription); $payment_method_meta = !empty($payment_method_meta[$payment_method]) ? $payment_method_meta[$payment_method] : array(); $valid_payment_methods = self::get_valid_payment_methods($subscription); if (!isset($valid_payment_methods[$payment_method])) { throw new Exception(__('Please choose a valid payment gateway to change to.', 'woocommerce-subscriptions')); } if (!empty($payment_method_meta)) { foreach ($payment_method_meta as $meta_table => &$meta) { if (!is_array($meta)) { continue; } foreach ($meta as $meta_key => &$meta_data) { $meta_data['value'] = isset($_POST['_payment_method_meta'][$meta_table][$meta_key]) ? $_POST['_payment_method_meta'][$meta_table][$meta_key] : ''; } } } $payment_gateway = 'manual' != $payment_method ? $payment_gateways[$payment_method] : ''; if (!$subscription->is_manual() && property_exists($subscription->payment_gateway, 'id') && ('' == $payment_gateway || $subscription->payment_gateway->id != $payment_gateway->id)) { // Before updating to a new payment gateway make sure the subscription status is updated with the current gateway $gateway_status = apply_filters('wcs_gateway_status_payment_changed', 'cancelled', $subscription, $payment_gateway); WC_Subscriptions_Payment_Gateways::trigger_gateway_status_updated_hook($subscription, $gateway_status); } $subscription->set_payment_method($payment_gateway, $payment_method_meta); }