PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 1.0.0
ShopBuilder – WooCommerce Builder For Elementor v1.0.0
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
← All changes | app/Modules/QuickView/QuickViewFrontEnd.php +327 -348 3.4.21.0.0 View file →
@@ -1,348 +1,327 @@
1 -<?php
2 -/**
3 - * Quick View Module Class.
4 - *
5 - * @package RadiusTheme\SB
6 - */
7 -
8 -namespace RadiusTheme\SB\Modules\QuickView;
9 -
10 -use RadiusTheme\SB\Helpers\Fns;
11 -use RadiusTheme\SB\Traits\SingletonTrait;
12 -use WC_Product;
13 -
14 -// Do not allow directly accessing this file.
15 -if ( ! defined( 'ABSPATH' ) ) {
16 - exit( 'This script cannot be accessed directly.' );
17 -}
18 -
19 -/**
20 - * Quick View Module Class.
21 - */
22 -class QuickViewFrontEnd {
23 - use SingletonTrait;
24 -
25 - /**
26 - * Asset Handle
27 - *
28 - * @var string
29 - */
30 - private $handle = 'rtsb-quick-view';
31 -
32 - /**
33 - * Class constructor.
34 - */
35 - public function __construct() {
36 - add_action( 'wp_enqueue_scripts', [ $this, 'enqueue' ], 99 );
37 -
38 - // Gallery Plugin Support rtwpvg_disable_enqueue_scripts.
39 - add_filter( 'rtwpvg_disable_enqueue_scripts', '__return_false', 11 );
40 -
41 - // Template.
42 - add_action( 'rtsb/modules/quick_view/frontend/display', [ $this, 'button_hook' ] );
43 -
44 - add_action( 'rtsb/modules/quick_view/print_button', [ $this, 'print_button' ] );
45 -
46 - // Load action for product template.
47 - $this->quick_view_action_template();
48 -
49 - // ShortCode.
50 - add_shortcode( 'rtsb_quick_view_button', [ $this, 'button_shortcode' ] );
51 -
52 - // Quick view AJAX.
53 - add_action( 'wp_ajax_rtsb_load_product_quick_view', [ $this, 'product_quick_view_ajax' ] );
54 -
55 - add_action( 'wp_ajax_nopriv_rtsb_load_product_quick_view', [ $this, 'product_quick_view_ajax' ] );
56 -
57 - $this->attach_button();
58 - }
59 -
60 -
61 - /**
62 - * Load wc action for quick view product template
63 - *
64 - * @access public
65 - * @return void
66 - * @since 1.0.0
67 - */
68 - public function quick_view_action_template() {
69 - wp_enqueue_style( 'elementor-frontend' );
70 - // Image.
71 - add_action( 'rtsb/wcqv/product/image', 'woocommerce_show_product_sale_flash', 10 );
72 - add_action( 'rtsb/wcqv/product/image', 'woocommerce_show_product_images', 20 );
73 -
74 - // Summary.
75 - add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_title', 5 );
76 - add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_rating', 10 );
77 - add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_price', 15 );
78 - add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_excerpt', 20 );
79 - add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_add_to_cart', 25 );
80 - add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_meta', 30 );
81 - }
82 -
83 - /**
84 - * Quick View AJAX.
85 - *
86 - * @return void
87 - */
88 - public function product_quick_view_ajax() {
89 - $product_id = isset( $_REQUEST['product_id'] ) ? absint( $_REQUEST['product_id'] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
90 -
91 - if ( empty( $product_id ) || 'publish' !== get_post_status( $product_id ) ) {
92 - wp_send_json_error( esc_html__( 'Product Id not found', 'shopbuilder' ) );
93 - }
94 -
95 - global $sitepress;
96 -
97 - $lang = isset( $_REQUEST['lang'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['lang'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
98 - if ( defined( 'ICL_LANGUAGE_CODE' ) && $lang && isset( $sitepress ) ) {
99 - $sitepress->switch_lang( $lang, true );
100 - }
101 -
102 - // Set the main wp query for the product.
103 - wp( 'p=' . $product_id . '&post_type=product' );
104 -
105 - // Remove product thumbnails gallery.
106 - if ( defined( 'RTWPVG_VERSION' ) ) {
107 - remove_action( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
108 - }
109 -
110 - ob_start();
111 - Fns::load_template( 'quick-view/content' );
112 - $html = ob_get_contents(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
113 - ob_end_clean();
114 -
115 - wp_send_json_success( [ 'html' => $html ] );
116 - }
117 -
118 - /**
119 - * Add the "Add to Wishlist" button. Needed to use in wp_head hook.
120 - *
121 - * @return void
122 - * @since 1.0.0
123 - */
124 - public function attach_button() {
125 - $positions = apply_filters(
126 - 'rtsb/module/quick_view/loop_btn_position',
127 - [
128 -
129 - 'before_add_to_cart' => [
130 - 'hook' => 'woocommerce_after_shop_loop_item',
131 - 'priority' => 7,
132 - ],
133 - 'after_add_to_cart' => [
134 - 'hook' => 'woocommerce_after_shop_loop_item',
135 - 'priority' => 15,
136 - ],
137 - 'custom' => [
138 - 'hook' => Fns::get_option( 'modules', 'quick_view', 'loop_custom_hook_name', '' ),
139 - 'priority' => Fns::get_option( 'modules', 'quick_view', 'loop_custom_hook_priority', '' ),
140 - ],
141 - ]
142 - );
143 -
144 - // Add the link "Add to wishlist" in the loop.
145 - $loop_btn_position = Fns::get_option( 'modules', 'quick_view', 'loop_btn_position', 'after_add_to_cart' );
146 -
147 - if ( 'shortcode' !== $loop_btn_position && isset( $positions[ $loop_btn_position ]['hook'] ) ) {
148 - add_action(
149 - $positions[ $loop_btn_position ]['hook'],
150 - [
151 - $this,
152 - 'button_hook',
153 - ],
154 - isset( $positions[ $loop_btn_position ]['priority'] ) ? $positions[ $loop_btn_position ]['priority'] : ''
155 - );
156 - }
157 -
158 - // Add the link "Quick view" for Gutenberg blocks.
159 - add_filter( 'woocommerce_blocks_product_grid_item_html', [ $this, 'add_button_for_block' ], 10, 3 );
160 - }
161 -
162 - /**
163 - * Print "Add to compare" button
164 - *
165 - * @return void
166 - */
167 - public function button_hook() {
168 - if ( ! apply_filters( 'rtsb/module/quick_view/show_button', true ) ) {
169 - return;
170 - }
171 - global $product;
172 - if ( $product instanceof WC_Product ) {
173 - do_action( 'rtsb/modules/quick_view/print_button', $product->get_id() );
174 - }
175 - }
176 -
177 -
178 - /**
179 - * Print "Add to compare" button.
180 - *
181 - * @param int $product_id Product ID.
182 - *
183 - * @return void
184 - */
185 - public function print_button( $product_id = 0 ) {
186 - global $product;
187 -
188 - if ( ! $product instanceof WC_Product && $product_id ) {
189 - $product = wc_get_product( $product_id );
190 - }
191 -
192 - $classes = [];
193 - $button_text = Fns::get_option( 'modules', 'quick_view', 'button_text', esc_html__( 'Quick View', 'shopbuilder' ) );
194 - $has_button_text = ! empty( Fns::get_option( 'modules', 'quick_view', 'button_text', '' ) );
195 -
196 - if ( $has_button_text ) {
197 - $classes[] = 'has-text';
198 - }
199 -
200 - $icon_html = '<i class="rtsb-icon rtsb-icon-eye"></i>';
201 - // get product type.
202 - $product_type = $product->get_type();
203 - $params = [
204 - 'classes' => $classes,
205 - 'product_id' => $product->get_id(),
206 - 'product_type' => $product_type,
207 - 'button_text' => $button_text,
208 - 'has_button_text' => $has_button_text,
209 - 'left_text' => apply_filters( 'rtsb/module/quick_view/button_left_text', '' ),
210 - 'right_text' => apply_filters( 'rtsb/module/quick_view/button_right_text', '' ),
211 - ];
212 - // let third party developer filter options.
213 - $atts = apply_filters( 'rtsb/module/quick_view/button_params', $params );
214 - // set fragment options.
215 - $atts['icon_html'] = apply_filters( 'rtsb/module/quick_view/icon_html', $icon_html, $atts );
216 -
217 - Fns::load_template( 'quick-view/button', $atts );
218 - }
219 -
220 - /**
221 - * Wishlist button Shortcode callable function
222 - *
223 - * @return string
224 - */
225 - public function button_shortcode() {
226 - global $product;
227 -
228 - if ( ! $product instanceof WC_Product ) {
229 - return '';
230 - }
231 -
232 - ob_start();
233 - do_action( 'rtsb/modules/quick_view/print_button', $product->get_id() );
234 -
235 - return ob_get_clean();
236 - }
237 -
238 - /**
239 - * Enqueue assets.
240 - *
241 - * @return void
242 - */
243 - public function enqueue() {
244 - wp_enqueue_style( 'elementor-icons-fa-regular' );
245 - wp_enqueue_style( 'elementor-icons-fa-solid' );
246 - wp_enqueue_style( 'elementor-icons-shared-0' );
247 -
248 - if ( ! class_exists( 'WooProductVariationGallery' ) && current_theme_supports( 'wc-product-gallery-slider' ) ) {
249 - wp_enqueue_script( 'wc-flexslider' );
250 - }
251 -
252 - wp_enqueue_script( 'wc-add-to-cart-variation' );
253 -
254 - if ( version_compare( WC()->version, '3.0.0', '>=' ) ) {
255 - if ( current_theme_supports( 'wc-product-gallery-zoom' ) ) {
256 - wp_enqueue_script( 'wc-zoom' );
257 - }
258 -
259 - if ( current_theme_supports( 'wc-product-gallery-lightbox' ) ) {
260 - wp_enqueue_script( 'wc-photoswipe-ui-default' );
261 - wp_enqueue_style( 'photoswipe-default-skin' );
262 -
263 - if ( has_action( 'wp_footer', 'woocommerce_photoswipe' ) === false ) {
264 - add_action( 'wp_footer', 'woocommerce_photoswipe', 15 );
265 - }
266 - }
267 - wp_enqueue_script( 'wc-single-product' );
268 - }
269 - // Enqueue assets.
270 - $this->handle = Fns::enqueue_module_assets( $this->handle, 'quick-view' );
271 - // Allow user to load custom style and scripts!
272 - do_action( 'rtsb/modules/quick_view/custom_scripts' );
273 -
274 - $params = apply_filters(
275 - 'rtsb/module/quick_view/js_params',
276 - [
277 - 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
278 - 'lang' => defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : '',
279 - 'isLoggedIn' => is_user_logged_in(),
280 - ]
281 - );
282 -
283 - wp_localize_script( $this->handle, 'rtsbQvParams', $params );
284 - }
285 -
286 -
287 - /**
288 - * Add ATW button to Products block item
289 - *
290 - * @param string $item_html HTML of the single block item.
291 - * @param array $data Data used to render the item.
292 - * @param WC_Product $product Current product.
293 - *
294 - * @return string Filtered HTML.
295 - */
296 - public function add_button_for_block( $item_html, $data, $product ) {
297 - // Add the link "Add to wishlist" in the loop.
298 - $shop_btn_position = Fns::get_option( 'modules', 'quick_view', 'loop_btn_position', 'after_add_to_cart' );
299 - ob_start();
300 - $this->print_button( $product->get_id() );
301 - $button = ob_get_clean();
302 - $parts = [];
303 -
304 - preg_match( '/(<li class=".*?">)[\S|\s]*?(<a .*?>[\S|\s]*?<\/a>)([\S|\s]*?)(<\/li>)/', $item_html, $parts );
305 -
306 - if ( ! $parts || count( $parts ) < 5 ) {
307 - return $item_html;
308 - }
309 -
310 - // removes first match (entire match).
311 - array_shift( $parts );
312 -
313 - // removes empty parts.
314 - $parts = array_filter( $parts );
315 -
316 - // searches for index to cut parts array.
317 - switch ( $shop_btn_position ) {
318 -
319 - case 'before_add_to_cart':
320 - $index = 2;
321 - break;
322 - case 'after_add_to_cart':
323 - $index = 3;
324 - break;
325 - default:
326 - $index = 0;
327 - break;
328 - }
329 -
330 - // if index is found, stitch button in correct position.
331 - if ( $index ) {
332 - $first_set = array_slice( $parts, 0, $index );
333 - $second_set = array_slice( $parts, $index );
334 -
335 - $parts = array_merge(
336 - $first_set,
337 - (array) $button,
338 - $second_set
339 - );
340 -
341 - // replace li classes.
342 - $parts[0] = preg_replace( '/class="(.*)"/', 'class="$1 rtsb-quick-view-btn-' . $shop_btn_position . '"', $parts[0] );
343 - }
344 -
345 - // join all parts together and return item.
346 - return implode( '', $parts );
347 - }
348 -}
1 +<?php
2 +
3 +namespace RadiusTheme\SB\Modules\QuickView;
4 +
5 +use RadiusTheme\SB\Helpers\Fns;
6 +use RadiusTheme\SB\Traits\SingletonTrait;
7 +use WC_Product;
8 +
9 +// Do not allow directly accessing this file.
10 +if ( ! defined( 'ABSPATH' ) ) {
11 + exit( 'This script cannot be accessed directly.' );
12 +}
13 +
14 +class QuickViewFrontEnd {
15 + use SingletonTrait;
16 +
17 + public function __construct() {
18 + add_action( 'wp_enqueue_scripts', [ $this, 'enqueue' ] );
19 +
20 + // Template.
21 + add_action( 'init', [ $this, 'attach_button' ] );
22 +
23 + add_action( 'rtsb/modules/quick_view/frontend/display', [ $this, 'button_hook' ] );
24 + // Add do_action( 'rtsb/modules/quick_view/frontend/display' ); for display anywhere.
25 +
26 + add_action( 'rtsb/modules/quick_view/print_button', [ $this, 'print_button' ] );
27 +
28 + // Load action for product template.
29 + $this->quick_view_action_template();
30 +
31 + // ShortCode.
32 + add_shortcode( 'rtsb_quick_view_button', [ $this, 'button_shortcode' ] );
33 +
34 + // Quick view AJAX.
35 + add_action( 'wp_ajax_rtsb_load_product_quick_view', [ $this, 'product_quick_view_ajax' ] );
36 + add_action( 'wp_ajax_nopriv_rtsb_load_product_quick_view', [ $this, 'product_quick_view_ajax' ] );
37 +
38 + }
39 +
40 +
41 + /**
42 + * Load wc action for quick view product template
43 + *
44 + * @access public
45 + * @return void
46 + * @since 1.0.0
47 + */
48 + public function quick_view_action_template() {
49 +
50 + // Image.
51 + add_action( 'rtsb_wcqv_product_image', 'woocommerce_show_product_sale_flash', 10 );
52 + add_action( 'rtsb_wcqv_product_image', 'woocommerce_show_product_images', 20 );
53 +
54 + // Summary.
55 + add_action( 'rtsb_wcqv_product_summary', 'woocommerce_template_single_title', 5 );
56 + add_action( 'rtsb_wcqv_product_summary', 'woocommerce_template_single_rating', 10 );
57 + add_action( 'rtsb_wcqv_product_summary', 'woocommerce_template_single_price', 15 );
58 + add_action( 'rtsb_wcqv_product_summary', 'woocommerce_template_single_excerpt', 20 );
59 + add_action( 'rtsb_wcqv_product_summary', 'woocommerce_template_single_add_to_cart', 25 );
60 + add_action( 'rtsb_wcqv_product_summary', 'woocommerce_template_single_meta', 30 );
61 +
62 + }
63 +
64 + public function product_quick_view_ajax() {
65 + $product_id = absint( $_REQUEST['product_id'] );
66 +
67 + if ( empty( $product_id ) ) {
68 + wp_send_json_error( esc_html__( 'Product Id not found', 'shopbuilder' ) );
69 + }
70 +
71 + global $sitepress;
72 +
73 + $lang = isset( $_REQUEST['lang'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['lang'] ) ) : '';
74 + if ( defined( 'ICL_LANGUAGE_CODE' ) && $lang && isset( $sitepress ) ) {
75 + $sitepress->switch_lang( $lang, true );
76 + }
77 +
78 + // Set the main wp query for the product.
79 + wp( 'p=' . $product_id . '&post_type=product' );
80 +
81 + // Remove product thumbnails gallery.
82 + remove_action( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
83 + // Change template for variable products.
84 + // if ( isset( $GLOBALS['yith_wccl'] ) ) {
85 + // $GLOBALS['yith_wccl']->obj = new YITH_WCCL_Frontend();
86 + // $GLOBALS['yith_wccl']->obj->override();
87 + // } elseif ( defined( 'YITH_WCCL_PREMIUM' ) && YITH_WCCL_PREMIUM && class_exists( 'YITH_WCCL_Frontend' ) ) {
88 + // $attributes = YITH_WCCL_Frontend()->create_attributes_json( $product_id, true );
89 + // }
90 + ob_start();
91 + Fns::load_template( 'quick-view/content' );
92 + $html = ob_get_contents(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
93 + ob_end_clean();
94 +
95 + wp_send_json_success( [ 'html' => $html ] );
96 + }
97 +
98 + /**
99 + * Add the "Add to Wishlist" button. Needed to use in wp_head hook.
100 + *
101 + * @return void
102 + * @since 1.0.0
103 + */
104 + public function attach_button() {
105 +
106 + $positions = apply_filters(
107 + 'rtsb/module/quick_view/loop_btn_position',
108 + [
109 + 'top_thumbnail' => [
110 + 'hook' => 'woocommerce_before_shop_loop_item',
111 + 'priority' => 5,
112 + ],
113 + 'before_add_to_cart' => [
114 + 'hook' => 'woocommerce_after_shop_loop_item',
115 + 'priority' => 7,
116 + ],
117 + 'after_add_to_cart' => [
118 + 'hook' => 'woocommerce_after_shop_loop_item',
119 + 'priority' => 15,
120 + ],
121 + 'custom' => [
122 + 'hook' => Fns::get_option( 'modules', 'quick_view', 'loop_custom_hook_name', '' ),
123 + 'priority' => Fns::get_option( 'modules', 'quick_view', 'loop_custom_hook_priority', '' ),
124 + ],
125 + ]
126 + );
127 +
128 + // Add the link "Add to wishlist" in the loop.
129 +
130 + $loop_btn_position = Fns::get_option( 'modules', 'quick_view', 'loop_btn_position', 'after_add_to_cart' );
131 +
132 + if ( 'shortcode' !== $loop_btn_position && isset( $positions[ $loop_btn_position ]['hook'] ) ) {
133 + add_action(
134 + $positions[ $loop_btn_position ]['hook'],
135 + [
136 + $this,
137 + 'button_hook',
138 + ],
139 + isset( $positions[ $loop_btn_position ]['priority'] ) ? $positions[ $loop_btn_position ]['priority'] : ''
140 + );
141 + }
142 +
143 + // Add the link "Quick view" for Gutenberg blocks.
144 + add_filter( 'woocommerce_blocks_product_grid_item_html', [ $this, 'add_button_for_block' ], 10, 3 );
145 + }
146 +
147 + /**
148 + * Print "Add to compare" button
149 + *
150 + * @return void
151 + */
152 + public function button_hook() {
153 + if ( ! apply_filters( 'rtsb/module/quick_view/show_button', true ) ) {
154 + return;
155 + }
156 + global $product;
157 + if( $product instanceof WC_Product ) {
158 + do_action('rtsb/modules/quick_view/print_button', $product->get_id());
159 + }
160 + }
161 +
162 +
163 + /**
164 + * @return string|void
165 + */
166 + public function print_button( $product_id = 0 ) {
167 + global $product;
168 +
169 + // product object.
170 + $current_product = $product_id ? wc_get_product( $product_id ) : false;
171 + $current_product = $current_product ?: $product;
172 +
173 + if ( ! $current_product instanceof WC_Product ) {
174 + return '';
175 + }
176 +
177 + $classes = []; // button class.
178 + $button_text = Fns::get_option( 'modules', 'quick_view', 'button_text', esc_html__( 'Quick View', 'shopbuilder' ) );
179 +
180 + $icon_html = '<i class="rtsb-icon rtsb-icon-eye"></i>';
181 + // get product type.
182 + $product_type = $current_product->get_type();
183 + $params = [
184 + 'classes' => $classes,
185 + 'product_id' => $current_product->get_id(),
186 + 'product_type' => $product_type,
187 + 'button_text' => $button_text,
188 + 'left_text' => apply_filters( 'rtsb/module/quick_view/button_left_text', '' ),
189 + 'right_text' => apply_filters( 'rtsb/module/quick_view/button_right_text', '' ),
190 + ];
191 + // let third party developer filter options.
192 + $atts = apply_filters( 'rtsb/module/quick_view/button_params', $params );
193 + // set fragment options.
194 + $atts['icon_html'] = apply_filters( 'rtsb/module/quick_view/icon_html', $icon_html, $atts );
195 +
196 + Fns::load_template( 'quick-view/button', $atts );
197 + }
198 +
199 +
200 + /**
201 + * Wishlist button Shortcode callable function
202 + *
203 + * @param array $atts
204 + * @param string $content
205 + *
206 + * @return string [HTML]
207 + */
208 + public function button_shortcode( $atts, $content = '' ) {
209 + $this->enqueue();
210 + global $product;
211 + ob_start();
212 +
213 + do_action( 'rtsb/modules/quick_view/print_button', $product->get_id() );
214 +
215 + return ob_get_clean();
216 + }
217 +
218 + public function enqueue() {
219 + wp_enqueue_script( 'wc-add-to-cart-variation' );
220 + if ( version_compare( WC()->version, '3.0.0', '>=' ) ) {
221 + if ( current_theme_supports( 'wc-product-gallery-zoom' ) ) {
222 + wp_enqueue_script( 'zoom' );
223 + }
224 + if ( current_theme_supports( 'wc-product-gallery-lightbox' ) ) {
225 + wp_enqueue_script( 'photoswipe-ui-default' );
226 + wp_enqueue_style( 'photoswipe-default-skin' );
227 + if ( has_action( 'wp_footer', 'woocommerce_photoswipe' ) === false ) {
228 + add_action( 'wp_footer', 'woocommerce_photoswipe', 15 );
229 + }
230 + }
231 + wp_enqueue_script( 'wc-single-product' );
232 + }
233 +
234 + wp_register_style( 'rtsb-modules', rtsb()->get_assets_uri( 'modules/modules.css' ), [], RTSB_VERSION );
235 + wp_register_script(
236 + 'rtsb-quick-view',
237 + rtsb()->get_assets_uri( 'modules/quick-view.js' ),
238 + [
239 + 'jquery',
240 + 'rtsb-public',
241 + ],
242 + RTSB_VERSION,
243 + true
244 + );
245 + wp_enqueue_style( 'rtsb-modules' );
246 + wp_enqueue_script( 'rtsb-quick-view' );
247 +
248 + // Allow user to load custom style and scripts!
249 + do_action( 'rtsb/modules/quick_view/custom_scripts' );
250 +
251 + $params = apply_filters(
252 + 'rtsb/module/quick_view/js_params',
253 + [
254 + 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
255 + 'lang' => defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : '',
256 + 'isLoggedIn' => is_user_logged_in(),
257 + ]
258 + );
259 +
260 + wp_localize_script( 'rtsb-quick-view', 'rtsbQvParams', $params );
261 + }
262 +
263 +
264 + /**
265 + * Add ATW button to Products block item
266 + *
267 + * @param string $item_html HTML of the single block item.
268 + * @param array $data Data used to render the item.
269 + * @param WC_Product $product Current product.
270 + *
271 + * @return string Filtered HTML.
272 + */
273 + public function add_button_for_block( $item_html, $data, $product ) {
274 + // Add the link "Add to wishlist" in the loop.
275 + $shop_btn_position = Fns::get_option( 'modules', 'quick_view', 'loop_btn_position', 'after_add_to_cart' );
276 + ob_start();
277 + $this->print_button( $product->get_id() );
278 + $button = ob_get_clean();
279 + $parts = [];
280 +
281 + preg_match( '/(<li class=".*?">)[\S|\s]*?(<a .*?>[\S|\s]*?<\/a>)([\S|\s]*?)(<\/li>)/', $item_html, $parts );
282 +
283 + if ( ! $parts || count( $parts ) < 5 ) {
284 + return $item_html;
285 + }
286 +
287 + // removes first match (entire match).
288 + array_shift( $parts );
289 +
290 + // removes empty parts.
291 + $parts = array_filter( $parts );
292 +
293 + // searches for index to cut parts array.
294 + switch ( $shop_btn_position ) {
295 + case 'top_thumbnail':
296 + $index = 1;
297 + break;
298 + case 'before_add_to_cart':
299 + $index = 2;
300 + break;
301 + case 'after_add_to_cart':
302 + $index = 3;
303 + break;
304 + default:
305 + $index = 0;
306 + break;
307 + }
308 +
309 + // if index is found, stitch button in correct position.
310 + if ( $index ) {
311 + $first_set = array_slice( $parts, 0, $index );
312 + $second_set = array_slice( $parts, $index );
313 +
314 + $parts = array_merge(
315 + $first_set,
316 + (array) $button,
317 + $second_set
318 + );
319 +
320 + // replace li classes.
321 + $parts[0] = preg_replace( '/class="(.*)"/', 'class="$1 rtsb-quick-view-btn-' . $shop_btn_position . '"', $parts[0] );
322 + }
323 +
324 + // join all parts together and return item.
325 + return implode( '', $parts );
326 + }
327 +}