PluginProbe
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster / 2.7.0
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster v2.7.0
2.7.0 2.6.0 trunk 1.1.0 1.1.4 1.2.1 1.2.2 1.2.3 1.2.5 1.2.9 1.3.1 1.3.2 1.5.0 1.5.1 1.5.4 1.5.7 1.5.8 1.5.9 1.6.2 1.6.5 1.6.8 1.7.2 1.7.4 1.7.5 1.7.9 All 43 releases
← All changes | includes/elementor/modules/checkout/widgets/checkout.php +77 -9 1.7.92.7.0 View file →
@@ -9,8 +9,9 @@
9 9
10 10 /**
11 11 * Checkout class.
12 12 *
13 + * @SuppressWarnings(PHPMD.NPathComplexity)
13 14 * @since 1.1.0
14 15 */
15 16 class Sellkit_Elementor_Checkout_Widget extends Sellkit_Elementor_Base_Widget {
16 17
@@ -76,9 +77,16 @@
76 77 new Settings_Controls();
77 78 new Style_Controls();
78 79 }
79 80
81 + /**
82 + * @SuppressWarnings(PHPMD.CyclomaticComplexity)
83 + */
80 84 protected function render() {
85 + if ( ! function_exists( 'wc' ) ) {
86 + return;
87 + }
88 +
81 89 $settings = $this->get_settings_for_display();
82 90 $checkout_id = get_the_ID();
83 91 $step_data = get_post_meta( $checkout_id, 'step_data', true );
84 92 $global_checkout = apply_filters( 'sellkit_global_checkout_activated', false );
@@ -83,10 +91,56 @@
83 91 $step_data = get_post_meta( $checkout_id, 'step_data', true );
84 92 $global_checkout = apply_filters( 'sellkit_global_checkout_activated', false );
85 93 $global_checkout_id = get_option( Checkout::SELLKIT_GLOBAL_CHECKOUT_OPTION, 0 );
86 94 $current_funnel_id = ( ! empty( $step_data ) ) ? $step_data['funnel_id'] : -1;
95 + $empty_cart_msg = $settings['empty_cart']; // phpcs:ignore
87 96
97 + $order_key = ! empty( sellkit_htmlspecialchars( INPUT_GET, 'order-key' ) ) ? sellkit_htmlspecialchars( INPUT_GET, 'order-key' ) : sellkit_htmlspecialchars( INPUT_GET, 'key' );
98 +
88 99 if (
100 + $global_checkout &&
101 + is_wc_endpoint_url( 'order-received' ) &&
102 + ! empty( $order_key )
103 + ) {
104 + $order_id = wc_get_order_id_by_order_key( $order_key );
105 +
106 + if ( empty( $order_id ) ) {
107 + /* translators: %s: Empty cart message. */
108 + echo sprintf(
109 + '<div class="elementor-alert elementor-alert-info sellkit-checkout-empty-cart-message-box">%s</div>',
110 + esc_html( $empty_cart_msg )
111 + );
112 +
113 + return;
114 + }
115 +
116 + // Valid order on the order-received endpoint: render WooCommerce's thank-you
117 + // template instead of the checkout form. SellKit's redirect_after_purchase
118 + // already runs earlier on template_redirect, but express-checkout flows that
119 + // skip SellKit's hidden fields (so no sellkit_funnel_next_step_data meta is
120 + // saved) fall through to here and must not show a filled-in checkout form.
121 + echo '<div class="woocommerce">';
122 + wc_get_template( 'checkout/thankyou.php', [ 'order' => wc_get_order( $order_id ) ] );
123 + echo '</div>';
124 +
125 + return;
126 + }
127 +
128 + if (
129 + $global_checkout &&
130 + 0 === WC()->cart->get_cart_contents_count() &&
131 + ! is_wc_endpoint_url( 'order-received' )
132 + ) {
133 + /* translators: %s: Empty cart message. */
134 + echo sprintf(
135 + '<div class="elementor-alert elementor-alert-info sellkit-checkout-empty-cart-message-box">%s</div>',
136 + esc_html( $empty_cart_msg )
137 + );
138 +
139 + return;
140 + }
141 +
142 + if (
89 143 false === $global_checkout &&
90 144 intval( $global_checkout_id ) !== intval( $current_funnel_id ) &&
91 145 is_array( $step_data ) &&
92 146 (
@@ -96,9 +150,9 @@
96 150 ) {
97 151 /* translators: %s: Empty cart message. */
98 152 echo sprintf(
99 153 '<div class="elementor-alert elementor-alert-info sellkit-checkout-empty-cart-message-box">%s</div>',
100 - $settings['empty_cart']
154 + esc_html( $empty_cart_msg )
101 155 );
102 156 return;
103 157 }
104 158
@@ -107,12 +161,32 @@
107 161 }, 10 );
108 162
109 163 $this->clear_sellkit_checkout_custom_hooks( $settings );
110 164
165 + $shipping_destination = get_option( 'woocommerce_ship_to_destination', true );
166 +
111 167 if ( 'multi-step' === $settings['layout-type'] ) {
112 168 $this->apply_multi_step_design( $settings );
169 +
170 + remove_action( 'woocommerce_checkout_billing', [ WC()->checkout(), 'checkout_form_billing' ] );
171 +
172 + if ( 'billing_only' === $shipping_destination ) {
173 + remove_action( 'woocommerce_checkout_shipping', [ WC()->checkout(), 'checkout_form_shipping' ] );
174 + add_action( 'woocommerce_checkout_shipping', [ WC()->checkout(), 'checkout_form_billing' ], 10 );
175 + }
113 176 }
114 177
178 + if ( 'one-page' === $settings['layout-type'] ) {
179 + remove_action( 'woocommerce_checkout_billing', [ WC()->checkout(), 'checkout_form_billing' ] );
180 +
181 + if ( 'billing_only' === $shipping_destination ) {
182 + remove_action( 'woocommerce_checkout_shipping', [ WC()->checkout(), 'checkout_form_shipping' ] );
183 + add_action( 'woocommerce_checkout_shipping', [ WC()->checkout(), 'checkout_form_billing' ], 10 );
184 + } else {
185 + add_action( 'woocommerce_checkout_order_review', [ WC()->checkout(), 'checkout_form_billing' ], 10 );
186 + }
187 + }
188 +
115 189 $this->apply_local_hooks( $settings );
116 190
117 191 if ( 'one-page' === $settings['layout-type'] ) {
118 192 $this->add_render_attribute(
@@ -129,12 +203,11 @@
129 203 }
130 204
131 205 if ( Elementor::$instance->editor->is_edit_mode() ) {
132 206 $current_user = wp_get_current_user()->ID;
133 - wp_set_current_user( 0 );
134 207 }
135 208
136 - echo '<div ' . $this->get_render_attribute_string( 'wrapper' ) . ' >';
209 + echo '<div ' . $this->get_render_attribute_string( 'wrapper' ) . ' >'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Elementor-generated attributes.
137 210 echo do_shortcode( '[woocommerce_checkout]' );
138 211 echo do_shortcode( '[sellkit_checkout_widget_simulated]' );
139 212 echo '</div>';
140 213
@@ -168,18 +241,13 @@
168 241 remove_all_actions( 'sellkit-checkout-multistep-sidebar-begins' );
169 242 remove_all_actions( 'sellkit-checkout-multistep-sidebar-ends' );
170 243 remove_all_actions( 'sellkit-checkout-widget-breadcrumb-desktop' );
171 244 remove_all_actions( 'sellkit-checkout-widget-breadcrumb-mobile' );
172 -
173 245 remove_all_actions( 'sellkit_checkout_shipping_fields' );
174 246 remove_all_actions( 'sellkit_checkout_billing_fields' );
175 -
176 247 remove_all_actions( 'sellkit_checkout_after_shipping_section' );
177 -
178 248 remove_all_actions( 'sellkit_checkout_one_page_express_methods' );
179 -
180 249 remove_all_actions( 'sellkit-checkout-widget-custom-coupon-form' );
181 -
182 250 remove_all_filters( 'woocommerce_locate_template' );
183 251
184 252 // !TODO We can use this method to move / remove billing and shipping fields.
185 253 add_action( 'woocommerce_checkout_shipping', [ WC()->checkout(), 'checkout_form_shipping' ] ); // ! added for theme integration. Astra.
@@ -235,8 +303,8 @@
235 303 private function hide_items_in_editor( $class ) {
236 304 echo sprintf(
237 305 /** Translators : %s : class name */
238 306 '<style>.%s { display:none !important; }</style>',
239 - $class
307 + esc_attr( $class )
240 308 );
241 309 }
242 310 }