PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 1.0.1
ShopBuilder – WooCommerce Builder For Elementor v1.0.1
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
shopbuilder / app / Modules / QuickView / QuickViewFrontEnd.php

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

328 lines 10.0 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 // 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 }
328