/**
  * 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);
 }