diff --git a/modules/ppcp-blocks/resources/js/checkout-block.js b/modules/ppcp-blocks/resources/js/checkout-block.js index dd324bd2c..1a10ddc7c 100644 --- a/modules/ppcp-blocks/resources/js/checkout-block.js +++ b/modules/ppcp-blocks/resources/js/checkout-block.js @@ -120,8 +120,13 @@ const PayPalComponent = ({ }; const createSubscription = async (data, actions) => { + let planId = config.scriptData.subscription_plan_id; + if (config.scriptData.variable_paypal_subscription_variation_from_cart !== '') { + planId = config.scriptData.variable_paypal_subscription_variation_from_cart; + } + return actions.subscription.create({ - 'plan_id': config.scriptData.subscription_plan_id + 'plan_id': planId }); }; diff --git a/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js b/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js index 4b7b20e9e..0400c8013 100644 --- a/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js +++ b/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js @@ -9,11 +9,11 @@ class CartActionHandler { this.errorHandler = errorHandler; } - subscriptionsConfiguration() { + subscriptionsConfiguration(subscription_plan_id) { return { createSubscription: (data, actions) => { return actions.subscription.create({ - 'plan_id': this.config.subscription_plan_id + 'plan_id': subscription_plan_id }); }, onApprove: (data, actions) => { diff --git a/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js b/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js index ed5926816..923c0b772 100644 --- a/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js +++ b/modules/ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler.js @@ -12,7 +12,7 @@ class CheckoutActionHandler { this.spinner = spinner; } - subscriptionsConfiguration() { + subscriptionsConfiguration(subscription_plan_id) { return { createSubscription: async (data, actions) => { try { @@ -22,7 +22,7 @@ class CheckoutActionHandler { } return actions.subscription.create({ - 'plan_id': this.config.subscription_plan_id + 'plan_id': subscription_plan_id }); }, onApprove: (data, actions) => { diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/CartBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/CartBootstap.js index c40e03ce1..bf8ad10ef 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/CartBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/CartBootstap.js @@ -90,7 +90,12 @@ class CartBootstrap { PayPalCommerceGateway.data_client_id.has_subscriptions && PayPalCommerceGateway.data_client_id.paypal_subscriptions_enabled ) { - this.renderer.render(actionHandler.subscriptionsConfiguration()); + let subscription_plan_id = PayPalCommerceGateway.subscription_plan_id + if(PayPalCommerceGateway.variable_paypal_subscription_variation_from_cart !== '') { + subscription_plan_id = PayPalCommerceGateway.variable_paypal_subscription_variation_from_cart + } + + this.renderer.render(actionHandler.subscriptionsConfiguration(subscription_plan_id)); if(!PayPalCommerceGateway.subscription_product_allowed) { this.gateway.button.is_disabled = true; diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/CheckoutBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/CheckoutBootstap.js index 26a278736..a14fa2f4b 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/CheckoutBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/CheckoutBootstap.js @@ -106,7 +106,11 @@ class CheckoutBootstap { PayPalCommerceGateway.data_client_id.has_subscriptions && PayPalCommerceGateway.data_client_id.paypal_subscriptions_enabled ) { - this.renderer.render(actionHandler.subscriptionsConfiguration(), {}, actionHandler.configuration()); + let subscription_plan_id = PayPalCommerceGateway.subscription_plan_id + if(PayPalCommerceGateway.variable_paypal_subscription_variation_from_cart !== '') { + subscription_plan_id = PayPalCommerceGateway.variable_paypal_subscription_variation_from_cart + } + this.renderer.render(actionHandler.subscriptionsConfiguration(subscription_plan_id), {}, actionHandler.configuration()); if(!PayPalCommerceGateway.subscription_product_allowed) { this.gateway.button.is_disabled = true; diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index d795d4950..83b8a3c3c 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -1111,6 +1111,7 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages 'subscription_plan_id' => $this->subscription_helper->paypal_subscription_id(), 'vault_v3_enabled' => $this->vault_v3_enabled, 'variable_paypal_subscription_variations' => $this->subscription_helper->variable_paypal_subscription_variations(), + 'variable_paypal_subscription_variation_from_cart' => $this->subscription_helper->paypal_subscription_variation_from_cart(), 'subscription_product_allowed' => $this->subscription_helper->checkout_subscription_product_allowed(), 'locations_with_subscription_product' => $this->subscription_helper->locations_with_subscription_product(), 'enforce_vault' => $this->has_subscriptions(), diff --git a/modules/ppcp-wc-subscriptions/src/Helper/SubscriptionHelper.php b/modules/ppcp-wc-subscriptions/src/Helper/SubscriptionHelper.php index 7a8d14a64..969727d63 100644 --- a/modules/ppcp-wc-subscriptions/src/Helper/SubscriptionHelper.php +++ b/modules/ppcp-wc-subscriptions/src/Helper/SubscriptionHelper.php @@ -315,4 +315,29 @@ class SubscriptionHelper { return ''; } + + /** + * Returns the variation subscription plan id from the cart. + * + * @return string + */ + public function paypal_subscription_variation_from_cart(): string { + $cart = WC()->cart ?? null; + if ( ! $cart || $cart->is_empty() ) { + return ''; + } + + $items = $cart->get_cart_contents(); + foreach ( $items as $item ) { + $variation_id = $item['variation_id'] ?? 0; + if ( $variation_id ) { + $variation_product = wc_get_product( $variation_id ) ?? ''; + if ( $variation_product && $variation_product->meta_exists( 'ppcp_subscription_plan' ) ) { + return $variation_product->get_meta( 'ppcp_subscription_plan' )['id']; + } + } + } + + return ''; + } }