PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.1.15
ShopBuilder – WooCommerce Builder For Elementor v2.1.15
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 2.3.0 All 62 releases
shopbuilder / app / Modules / QuickView / QuickViewFrontEnd.php

QuickViewFrontEnd.php in ShopBuilder – WooCommerce Builder For Elementor 2.1.15, at app/Modules/QuickView/QuickViewFrontEnd.php

363 lines 10.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 // Gallery Plugin Support rtwpvg_disable_enqueue_scripts.
21 add_filter( 'rtwpvg_disable_enqueue_scripts', '__return_false', 11 );
22
23 // Template.
24
25 add_action( 'rtsb/modules/quick_view/frontend/display', [ $this, 'button_hook' ] );
26 // Add do_action( 'rtsb/modules/quick_view/frontend/display' ); for display anywhere.
27
28 add_action( 'rtsb/modules/quick_view/print_button', [ $this, 'print_button' ] );
29
30 // Load action for product template.
31 $this->quick_view_action_template();
32
33 // ShortCode.
34 add_shortcode( 'rtsb_quick_view_button', [ $this, 'button_shortcode' ] );
35
36 // Quick view AJAX.
37 add_action( 'wp_ajax_rtsb_load_product_quick_view', [ $this, 'product_quick_view_ajax' ] );
38
39 add_action( 'wp_ajax_nopriv_rtsb_load_product_quick_view', [ $this, 'product_quick_view_ajax' ] );
40
41 $this->attach_button();
42 }
43
44
45 /**
46 * Load wc action for quick view product template
47 *
48 * @access public
49 * @return void
50 * @since 1.0.0
51 */
52 public function quick_view_action_template() {
53
54 // Image.
55 add_action( 'rtsb/wcqv/product/image', 'woocommerce_show_product_sale_flash', 10 );
56 add_action( 'rtsb/wcqv/product/image', 'woocommerce_show_product_images', 20 );
57
58 // Summary.
59 add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_title', 5 );
60 add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_rating', 10 );
61 add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_price', 15 );
62 add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_excerpt', 20 );
63 add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_add_to_cart', 25 );
64 add_action( 'rtsb/wcqv/product/summary', 'woocommerce_template_single_meta', 30 );
65 }
66
67 public function product_quick_view_ajax() {
68 $product_id = isset( $_REQUEST['product_id'] ) ? absint( $_REQUEST['product_id'] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
69
70 if ( empty( $product_id ) || 'publish' !== get_post_status( $product_id ) ) {
71 wp_send_json_error( esc_html__( 'Product Id not found', 'shopbuilder' ) );
72 }
73
74 global $sitepress;
75
76 $lang = isset( $_REQUEST['lang'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['lang'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
77 if ( defined( 'ICL_LANGUAGE_CODE' ) && $lang && isset( $sitepress ) ) {
78 $sitepress->switch_lang( $lang, true );
79 }
80
81 // Set the main wp query for the product.
82 wp( 'p=' . $product_id . '&post_type=product' );
83
84 // Remove product thumbnails gallery.
85 if ( defined( 'RTWPVG_VERSION' ) ) {
86 remove_action( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
87 }
88 if ( ! defined( 'RTWPVG_VERSION' ) ) {
89 //add_action( 'woocommerce_product_thumbnails', [ $this, 'woocommerce_product_thumbnails_before' ], 1 );
90 //add_action( 'woocommerce_product_thumbnails', [ $this, 'woocommerce_product_thumbnails_after' ], 25 );
91 }
92
93 ob_start();
94 Fns::load_template( 'quick-view/content' );
95 $html = ob_get_contents(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
96 ob_end_clean();
97
98 wp_send_json_success( [ 'html' => $html ] );
99 }
100
101 /**
102 * Add the "Add to Wishlist" button. Needed to use in wp_head hook.
103 *
104 * @return void
105 * @since 1.0.0
106 */
107 public function attach_button() {
108
109 $positions = apply_filters(
110 'rtsb/module/quick_view/loop_btn_position',
111 [
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 // TODO:: Maybe this hooks is not working. Need to Check gutenberg compatibility.
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 woocommerce_product_thumbnails_before() {
153 ?>
154 <div class="rtsb-gallery-images-wrapper">
155 <?php
156 }
157 /**
158 * Print "Add to compare" button
159 *
160 * @return void
161 */
162 public function woocommerce_product_thumbnails_after() {
163
164 ?>
165 </div>
166 <?php
167 }
168
169 /**
170 * Print "Add to compare" button
171 *
172 * @return void
173 */
174 public function button_hook() {
175 if ( ! apply_filters( 'rtsb/module/quick_view/show_button', true ) ) {
176 return;
177 }
178 global $product;
179 if ( $product instanceof WC_Product ) {
180 do_action( 'rtsb/modules/quick_view/print_button', $product->get_id() );
181 }
182
183 }
184
185
186 /**
187 * @return string|void
188 */
189 public function print_button( $product_id = 0 ) {
190 global $product;
191
192 if ( ! $product instanceof WC_Product && $product_id ) {
193 $product = wc_get_product( $product_id );
194 }
195
196 // if ( ! $current_product instanceof WC_Product ) {
197 // return '';
198 // }
199
200 $classes = []; // button class.
201 $button_text = Fns::get_option( 'modules', 'quick_view', 'button_text', esc_html__( 'Quick View', 'shopbuilder' ) );
202
203 $icon_html = '<i class="rtsb-icon rtsb-icon-eye"></i>';
204 // get product type.
205 $product_type = $product->get_type();
206 $params = [
207 'classes' => $classes,
208 'product_id' => $product->get_id(),
209 'product_type' => $product_type,
210 'button_text' => $button_text,
211 'left_text' => apply_filters( 'rtsb/module/quick_view/button_left_text', '' ),
212 'right_text' => apply_filters( 'rtsb/module/quick_view/button_right_text', '' ),
213 ];
214 // let third party developer filter options.
215 $atts = apply_filters( 'rtsb/module/quick_view/button_params', $params );
216 // set fragment options.
217 $atts['icon_html'] = apply_filters( 'rtsb/module/quick_view/icon_html', $icon_html, $atts );
218
219 Fns::load_template( 'quick-view/button', $atts );
220 }
221
222
223 /**
224 * Wishlist button Shortcode callable function
225 *
226 * @param array $atts
227 * @param string $content
228 *
229 * @return string [HTML]
230 */
231 public function button_shortcode( $atts, $content = '' ) {
232 $this->enqueue();
233 global $product;
234 if ( ! $product instanceof WC_Product ) {
235 return '';
236 }
237 ob_start();
238
239 do_action( 'rtsb/modules/quick_view/print_button', $product->get_id() );
240
241 return ob_get_clean();
242 }
243
244 public function enqueue() {
245
246 wp_enqueue_style( 'elementor-icons-fa-regular' );
247
248 wp_enqueue_style( 'elementor-icons-fa-solid' );
249 wp_enqueue_style( 'elementor-icons-shared-0' );
250 // wp_enqueue_style( 'elementor-frontend' );
251
252 if ( ! class_exists('WooProductVariationGallery') && current_theme_supports( 'wc-product-gallery-slider' ) ) {
253 wp_enqueue_script( 'flexslider' );
254 }
255
256 wp_enqueue_script( 'wc-add-to-cart-variation' );
257 if ( version_compare( WC()->version, '3.0.0', '>=' ) ) {
258 if ( current_theme_supports( 'wc-product-gallery-zoom' ) ) {
259 wp_enqueue_script( 'zoom' );
260 }
261 if ( current_theme_supports( 'wc-product-gallery-lightbox' ) ) {
262 wp_enqueue_script( 'photoswipe-ui-default' );
263 wp_enqueue_style( 'photoswipe-default-skin' );
264 if ( has_action( 'wp_footer', 'woocommerce_photoswipe' ) === false ) {
265 add_action( 'wp_footer', 'woocommerce_photoswipe', 15 );
266 }
267 }
268 wp_enqueue_script( 'wc-single-product' );
269 }
270
271 wp_register_style( 'rtsb-modules', rtsb()->get_assets_uri( 'modules/modules.css' ), [], RTSB_VERSION );
272 wp_register_script(
273 'rtsb-quick-view',
274 rtsb()->get_assets_uri( 'modules/quick-view.js' ),
275 [
276 'jquery',
277 'rtsb-public',
278 ],
279 RTSB_VERSION,
280 true
281 );
282 wp_enqueue_style( 'rtsb-modules' );
283 wp_enqueue_script( 'rtsb-quick-view' );
284
285 // Allow user to load custom style and scripts!
286 do_action( 'rtsb/modules/quick_view/custom_scripts' );
287
288 $params = apply_filters(
289 'rtsb/module/quick_view/js_params',
290 [
291 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
292 'lang' => defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : '',
293 'isLoggedIn' => is_user_logged_in(),
294 ]
295 );
296
297 wp_localize_script( 'rtsb-quick-view', 'rtsbQvParams', $params );
298 }
299
300
301 /**
302 * Add ATW button to Products block item
303 *
304 * @param string $item_html HTML of the single block item.
305 * @param array $data Data used to render the item.
306 * @param WC_Product $product Current product.
307 *
308 * @return string Filtered HTML.
309 */
310 public function add_button_for_block( $item_html, $data, $product ) {
311 // Add the link "Add to wishlist" in the loop.
312 $shop_btn_position = Fns::get_option( 'modules', 'quick_view', 'loop_btn_position', 'after_add_to_cart' );
313 ob_start();
314 $this->print_button( $product->get_id() );
315 $button = ob_get_clean();
316 $parts = [];
317
318 preg_match( '/(<li class=".*?">)[\S|\s]*?(<a .*?>[\S|\s]*?<\/a>)([\S|\s]*?)(<\/li>)/', $item_html, $parts );
319
320 if ( ! $parts || count( $parts ) < 5 ) {
321 return $item_html;
322 }
323
324 // removes first match (entire match).
325 array_shift( $parts );
326
327 // removes empty parts.
328 $parts = array_filter( $parts );
329
330 // searches for index to cut parts array.
331 switch ( $shop_btn_position ) {
332
333 case 'before_add_to_cart':
334 $index = 2;
335 break;
336 case 'after_add_to_cart':
337 $index = 3;
338 break;
339 default:
340 $index = 0;
341 break;
342 }
343
344 // if index is found, stitch button in correct position.
345 if ( $index ) {
346 $first_set = array_slice( $parts, 0, $index );
347 $second_set = array_slice( $parts, $index );
348
349 $parts = array_merge(
350 $first_set,
351 (array) $button,
352 $second_set
353 );
354
355 // replace li classes.
356 $parts[0] = preg_replace( '/class="(.*)"/', 'class="$1 rtsb-quick-view-btn-' . $shop_btn_position . '"', $parts[0] );
357 }
358
359 // join all parts together and return item.
360 return implode( '', $parts );
361 }
362 }
363