diff --git a/modules.php b/modules.php index 06a9f482d..3672dc515 100644 --- a/modules.php +++ b/modules.php @@ -18,8 +18,8 @@ return function ( string $root_dir ): iterable { ( require "$modules_dir/woocommerce-logging/module.php" )(), ( require "$modules_dir/ppcp-admin-notices/module.php" )(), ( require "$modules_dir/ppcp-api-client/module.php" )(), - ( require "$modules_dir/ppcp-button/module.php" )(), ( require "$modules_dir/ppcp-compat/module.php" )(), + ( require "$modules_dir/ppcp-button/module.php" )(), ( require "$modules_dir/ppcp-onboarding/module.php" )(), ( require "$modules_dir/ppcp-session/module.php" )(), ( require "$modules_dir/ppcp-status-report/module.php" )(), diff --git a/modules/ppcp-button/src/Helper/ContextTrait.php b/modules/ppcp-button/src/Helper/ContextTrait.php index 9b5874bfa..a034eda8b 100644 --- a/modules/ppcp-button/src/Helper/ContextTrait.php +++ b/modules/ppcp-button/src/Helper/ContextTrait.php @@ -95,47 +95,51 @@ trait ContextTrait { * @return string */ protected function context(): string { - if ( is_product() || wc_post_content_has_shortcode( 'product_page' ) ) { + // Default context. + $context = 'mini-cart'; - // Do this check here instead of reordering outside conditions. - // In order to have more control over the context. - if ( $this->is_checkout() && ! $this->is_paypal_continuation() ) { - return 'checkout'; - } + switch ( true ) { + case is_product() || wc_post_content_has_shortcode( 'product_page' ): + // Do this check here instead of reordering outside conditions. + // In order to have more control over the context. + if ( $this->is_checkout() && ! $this->is_paypal_continuation() ) { + $context = 'checkout'; + } else { + $context = 'product'; + } + break; - return 'product'; + // has_block may not work if called too early, such as during the block registration. + case has_block( 'woocommerce/cart' ): + $context = 'cart-block'; + break; + + case $this->is_cart(): + $context = 'cart'; + break; + + case is_checkout_pay_page(): + $context = 'pay-now'; + break; + + case has_block( 'woocommerce/checkout' ): + $context = 'checkout-block'; + break; + + case $this->is_checkout() && ! $this->is_paypal_continuation(): + $context = 'checkout'; + break; + + case $this->is_add_payment_method_page(): + $context = 'add-payment-method'; + break; + + case $this->is_block_editor(): + $context = 'block-editor'; + break; } - // has_block may not work if called too early, such as during the block registration. - if ( has_block( 'woocommerce/cart' ) ) { - return 'cart-block'; - } - - if ( $this->is_cart() ) { - return 'cart'; - } - - if ( is_checkout_pay_page() ) { - return 'pay-now'; - } - - if ( has_block( 'woocommerce/checkout' ) ) { - return 'checkout-block'; - } - - if ( $this->is_checkout() && ! $this->is_paypal_continuation() ) { - return 'checkout'; - } - - if ( $this->is_add_payment_method_page() ) { - return 'add-payment-method'; - } - - if ( $this->is_block_editor() ) { - return 'block-editor'; - } - - return 'mini-cart'; + return apply_filters( 'woocommerce_paypal_payments_context', $context ); } /** diff --git a/modules/ppcp-compat/src/CompatModule.php b/modules/ppcp-compat/src/CompatModule.php index 44cfd1988..a5772dccd 100644 --- a/modules/ppcp-compat/src/CompatModule.php +++ b/modules/ppcp-compat/src/CompatModule.php @@ -15,6 +15,7 @@ use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; use WooCommerce\PayPalCommerce\Compat\Assets\CompatAssets; use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException; +use WooCommerce\PayPalCommerce\WcGateway\Helper\CartCheckoutDetector; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; /** @@ -54,6 +55,7 @@ class CompatModule implements ModuleInterface { $this->migrate_smart_button_settings( $c ); $this->fix_page_builders(); + $this->set_elementor_checkout_context(); } /** @@ -329,4 +331,32 @@ class CompatModule implements ModuleInterface { $parent = $theme->parent(); return ( $parent && $parent->get( 'Name' ) === 'Divi' ); } + + /** + * Sets the context for the Elementor checkout page. + * + * @return void + */ + protected function set_elementor_checkout_context(): void { + add_action( + 'wp', + function() { + $page_id = get_the_ID(); + if ( $page_id ) { + if ( CartCheckoutDetector::has_elementor_checkout( $page_id ) ) { + add_filter( + 'woocommerce_paypal_payments_context', + function ( $context ): string { + // Default context. + if ( 'mini-cart' === $context ) { + return 'checkout'; + } + return $context; + } + ); + } + } + } + ); + } } diff --git a/modules/ppcp-wc-gateway/src/Helper/CartCheckoutDetector.php b/modules/ppcp-wc-gateway/src/Helper/CartCheckoutDetector.php index faac7f257..b66a8e8ff 100644 --- a/modules/ppcp-wc-gateway/src/Helper/CartCheckoutDetector.php +++ b/modules/ppcp-wc-gateway/src/Helper/CartCheckoutDetector.php @@ -57,12 +57,19 @@ class CartCheckoutDetector { /** * Check if the Checkout page is using Elementor. * + * @param int $page_id The ID of the page. + * * @return bool */ - public static function has_elementor_checkout(): bool { + public static function has_elementor_checkout( int $page_id = 0 ): bool { // Check if Elementor is installed and activated. if ( did_action( 'elementor/loaded' ) ) { - $elementor_widgets = self::get_elementor_widgets( wc_get_page_id( 'checkout' ) ); + if ( $page_id ) { + $elementor_widgets = self::get_elementor_widgets( $page_id ); + } else { + // Check the WooCommerce checkout page. + $elementor_widgets = self::get_elementor_widgets( wc_get_page_id( 'checkout' ) ); + } if ( $elementor_widgets ) { return in_array( 'woocommerce-checkout-page', $elementor_widgets, true );