| @@ -187,45 +187,50 @@ | ||
| 187 | 187 | continue; |
| 188 | 188 | } |
| 189 | 189 | |
| 190 | 190 | if ( ! empty( $element['category'] ) ) { |
| 191 | - $widget = false; | |
| 192 | - $import = apply_filters( 'rtsb_import_status', false ); | |
| 193 | - switch ( $element['category'] ) { | |
| 194 | - case 'product': | |
| 195 | - if ( BuilderFns::is_product() || $import ) { | |
| 191 | + try { | |
| 192 | + $widget = false; | |
| 193 | + $import = apply_filters( 'rtsb_import_status', false ); | |
| 194 | + switch ( $element['category'] ) { | |
| 195 | + case 'product': | |
| 196 | + if ( BuilderFns::is_product() || $import ) { | |
| 197 | + $widget = new $element['base_class'](); | |
| 198 | + } | |
| 199 | + break; | |
| 200 | + case 'shop': | |
| 201 | + if ( BuilderFns::is_archive() || BuilderFns::is_shop() || $import ) { | |
| 202 | + $widget = new $element['base_class'](); | |
| 203 | + } | |
| 204 | + break; | |
| 205 | + case 'archive': | |
| 206 | + if ( BuilderFns::is_archive() || $import ) { | |
| 207 | + $widget = new $element['base_class'](); | |
| 208 | + } | |
| 209 | + break; | |
| 210 | + case 'cart': | |
| 211 | + if ( BuilderFns::is_cart() || $import ) { | |
| 212 | + $widget = new $element['base_class'](); | |
| 213 | + } | |
| 214 | + break; | |
| 215 | + case 'checkout': | |
| 216 | + if ( BuilderFns::is_checkout() || $import ) { | |
| 217 | + $widget = new $element['base_class'](); | |
| 218 | + } | |
| 219 | + break; | |
| 220 | + case 'general': | |
| 196 | 221 | $widget = new $element['base_class'](); |
| 197 | - } | |
| 198 | - break; | |
| 199 | - case 'shop': | |
| 200 | - if ( BuilderFns::is_archive() || BuilderFns::is_shop() || $import ) { | |
| 201 | - $widget = new $element['base_class'](); | |
| 202 | - } | |
| 203 | - break; | |
| 204 | - case 'archive': | |
| 205 | - if ( BuilderFns::is_archive() || $import ) { | |
| 206 | - $widget = new $element['base_class'](); | |
| 207 | - } | |
| 208 | - break; | |
| 209 | - case 'cart': | |
| 210 | - if ( BuilderFns::is_cart() || $import ) { | |
| 211 | - $widget = new $element['base_class'](); | |
| 212 | - } | |
| 213 | - break; | |
| 214 | - case 'checkout': | |
| 215 | - if ( BuilderFns::is_checkout() || $import ) { | |
| 216 | - $widget = new $element['base_class'](); | |
| 217 | - } | |
| 218 | - break; | |
| 219 | - case 'general': | |
| 220 | - $widget = new $element['base_class'](); | |
| 221 | - break; | |
| 222 | - default: | |
| 223 | - } | |
| 224 | - $widget = apply_filters( 'rtsb/element/list/init/widgets', $widget, $element ); | |
| 222 | + break; | |
| 223 | + default: | |
| 224 | + } | |
| 225 | + $widget = apply_filters( 'rtsb/element/list/init/widgets', $widget, $element ); | |
| 225 | 226 | |
| 226 | - if ( $widget && is_object( $widget ) ) { | |
| 227 | - $widgets_manager->register( $widget ); | |
| 227 | + if ( $widget && is_object( $widget ) ) { | |
| 228 | + $widgets_manager->register( $widget ); | |
| 229 | + } | |
| 230 | + } catch ( \Throwable $e ) { | |
| 231 | + error_log( 'ShopBuilder widget error (' . $element['base_class'] . '): ' . $e->getMessage() ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log | |
| 232 | + continue; | |
| 228 | 233 | } |
| 229 | 234 | } |
| 230 | 235 | } |
| 231 | 236 | } |
| @@ -336,8 +341,29 @@ | ||
| 336 | 341 | if ( BuilderFns::is_checkout() ) { |
| 337 | 342 | if ( ! apply_filters( 'rtsb/multi/step/checkout/widget', true ) ) { |
| 338 | 343 | return; |
| 339 | 344 | } |
| 345 | + | |
| 346 | + $checkout = WC()->checkout(); | |
| 347 | + | |
| 348 | + // Temporarily remove callbacks that Elementor checkout | |
| 349 | + // handles via separate widgets to prevent duplicates. | |
| 350 | + remove_action( 'woocommerce_before_checkout_form', [ Hooks\ActionHooks::class, 'woocommerce_checkout_login_form' ], 10 ); | |
| 351 | + remove_action( 'woocommerce_before_checkout_form', [ Hooks\ActionHooks::class, 'woocommerce_checkout_coupon_form' ], 10 ); | |
| 352 | + remove_action( 'woocommerce_before_checkout_form', [ Fns::class, 'woocommerce_output_all_notices' ], 10 ); | |
| 353 | + | |
| 354 | + do_action( 'woocommerce_before_checkout_form', $checkout ); | |
| 355 | + | |
| 356 | + // Restore callbacks for non-Elementor contexts. | |
| 357 | + add_action( 'woocommerce_before_checkout_form', [ Hooks\ActionHooks::class, 'woocommerce_checkout_login_form' ], 10 ); | |
| 358 | + add_action( 'woocommerce_before_checkout_form', [ Hooks\ActionHooks::class, 'woocommerce_checkout_coupon_form' ], 10 ); | |
| 359 | + add_action( 'woocommerce_before_checkout_form', [ Fns::class, 'woocommerce_output_all_notices' ], 10 ); | |
| 360 | + | |
| 361 | + // If checkout registration is disabled and not logged in, the user cannot checkout. | |
| 362 | + if ( ! $checkout->is_registration_enabled() && $checkout->is_registration_required() && ! is_user_logged_in() ) { | |
| 363 | + echo esc_html( apply_filters( 'woocommerce_checkout_must_be_logged_in_message', __( 'You must be logged in to checkout.', 'shopbuilder' ) ) ); | |
| 364 | + return; | |
| 365 | + } | |
| 340 | 366 | ?> |
| 341 | 367 | <!-- |
| 342 | 368 | woocommerce-checkout added for fix issue with payment method ( Revolut Pay ) |
| 343 | 369 | --> |
| @@ -369,8 +395,9 @@ | ||
| 369 | 395 | } |
| 370 | 396 | ?> |
| 371 | 397 | </form> |
| 372 | 398 | <?php |
| 399 | + do_action( 'woocommerce_after_checkout_form', WC()->checkout() ); | |
| 373 | 400 | } |
| 374 | 401 | ?> |
| 375 | 402 | </div> |
| 376 | 403 | <!-- After Content end --> |