PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.2.1
ShopBuilder – WooCommerce Builder For Elementor v3.2.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 / Controllers / Hooks / ActionHooks.php

ActionHooks.php in ShopBuilder – WooCommerce Builder For Elementor 3.2.1, at app/Controllers/Hooks/ActionHooks.php

482 lines 17.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Main ActionHooks class.
4 *
5 * @package RadiusTheme\SB
6 */
7
8 namespace RadiusTheme\SB\Controllers\Hooks;
9
10 use RadiusTheme\SB\Helpers\Fns;
11 use RadiusTheme\SB\Helpers\Cache;
12 use RadiusTheme\SB\Models\GeneralList;
13 use RadiusTheme\SB\Helpers\BuilderFns;
14 use RadiusTheme\SB\Models\TemplateSettings;
15 use RadiusTheme\SB\Elementor\Render\Render;
16 use RadiusTheme\SB\Elementor\Helper\RenderHelpers;
17
18 defined( 'ABSPATH' ) || exit();
19
20 /**
21 * Main ActionHooks class.
22 */
23 class ActionHooks {
24 /**
25 * Init Hooks.
26 *
27 * @return void
28 */
29 public static function init_hooks() {
30 add_action( 'rtsb/before/save/options', [ __CLASS__, 'clear_cron_schedule' ], 10, 3 );
31 add_action( 'wp_head', [ __CLASS__, 'og_metatags_for_sharing' ], 1 );
32 add_action( 'woocommerce_share', [ __CLASS__, 'shopbuilder_share' ], 20 );
33 add_action( 'rtsb/wcqv/product/summary', [ __CLASS__, 'shopbuilder_share' ], 40 );
34 add_action( 'rtsb/shop/product/image', [ __CLASS__, 'render_image' ], 10, 2 );
35
36 add_action(
37 'admin_init',
38 function () {
39 remove_post_type_support( BuilderFns::$post_type_tb, 'revisions' );
40 }
41 );
42 add_action( 'deleted_post', [ __CLASS__, 'deleted_post' ], 10, 2 );
43 add_action( 'rtsb/elements/render/before_query', [ __CLASS__, 'modify_wc_query_args' ] );
44 add_action( 'rtsb/elements/render/after_query', [ __CLASS__, 'reset_wc_query_args' ] );
45 // Cart Table.
46 remove_action( 'woocommerce_cart_is_empty', 'wc_empty_cart_message', 10 );
47 add_action( 'woocommerce_cart_is_empty', [ __CLASS__, 'cart_is_empty' ], 10 );
48 /**
49 * Notices.
50 */
51 remove_action( 'woocommerce_cart_is_empty', 'woocommerce_output_all_notices', 5 );
52 remove_action( 'woocommerce_shortcode_before_product_cat_loop', 'woocommerce_output_all_notices', 10 );
53 remove_action( 'woocommerce_before_shop_loop', 'woocommerce_output_all_notices', 10 );
54 remove_action( 'woocommerce_before_single_product', 'woocommerce_output_all_notices', 10 );
55 remove_action( 'woocommerce_before_cart', 'woocommerce_output_all_notices', 10 );
56 remove_action( 'woocommerce_before_checkout_form_cart_notices', 'woocommerce_output_all_notices', 10 );
57 remove_action( 'woocommerce_before_checkout_form', 'woocommerce_output_all_notices', 10 );
58 remove_action( 'woocommerce_account_content', 'woocommerce_output_all_notices', 5 );
59 remove_action( 'woocommerce_before_customer_login_form', 'woocommerce_output_all_notices', 10 );
60 remove_action( 'woocommerce_before_lost_password_form', 'woocommerce_output_all_notices', 10 );
61 remove_action( 'before_woocommerce_pay', 'woocommerce_output_all_notices', 10 );
62 remove_action( 'woocommerce_before_reset_password_form', 'woocommerce_output_all_notices', 10 );
63
64 /**
65 * Notices.
66 */
67 add_action( 'woocommerce_shortcode_before_product_cat_loop', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
68 add_action( 'woocommerce_before_shop_loop', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
69 add_action( 'woocommerce_before_single_product', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
70 add_action( 'woocommerce_before_cart', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
71 add_action( 'woocommerce_before_checkout_form_cart_notices', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
72 add_action( 'woocommerce_before_checkout_form', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
73 add_action( 'woocommerce_account_content', [ Fns::class, 'woocommerce_output_all_notices' ], 5 );
74 add_action( 'woocommerce_before_customer_login_form', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
75 add_action( 'woocommerce_before_lost_password_form', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
76 add_action( 'before_woocommerce_pay', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
77 add_action( 'woocommerce_before_reset_password_form', [ Fns::class, 'woocommerce_output_all_notices' ], 10 );
78
79 // Checkout Page.
80 remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_login_form', 10 );
81 remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
82 add_action( 'woocommerce_before_checkout_form', [ __CLASS__, 'woocommerce_checkout_login_form' ], 10 );
83 add_action( 'woocommerce_before_checkout_form', [ __CLASS__, 'woocommerce_checkout_coupon_form' ], 10 );
84 // My Account Order Page.
85 add_action( 'woocommerce_before_account_orders', [ __CLASS__, 'before_account_orders' ], 10 );
86 add_action( 'woocommerce_after_account_orders', [ __CLASS__, 'after_account_orders' ], 10 );
87
88 // Product Filter Widget Hooks.
89 add_action( 'rtsb/before/archive/default/filter/items', [ __CLASS__,'default_filter_header' ], 10 );
90 add_action( 'rtsb/before/archive/default/filter/items', [ __CLASS__,'default_filter_search' ], 15 );
91
92 // WC Query modifier.
93 if ( ! rtsb()->has_pro() ) {
94 add_action( 'woocommerce_product_query', [ __CLASS__, 'query_modifier' ], 15 );
95 }
96
97 add_action( 'switch_theme', [ __CLASS__, 'clear_cache' ] );
98 }
99 /**
100 * Clear scheduled cron events when a module is deactivated.
101 *
102 * Checks the given block ID against predefined schedules and clears
103 * related cron hooks if the corresponding module is turned off.
104 *
105 * @param string $section_id Section identifier (not used in this function).
106 * @param string $block_id Module/block identifier to check scheduled hooks.
107 * @param array $rawOptions Module options array containing 'active' status.
108 *
109 * @return void
110 */
111 public static function clear_cron_schedule( $section_id, $block_id, $rawOptions ) {
112 $schedule = [
113 'abandoned_cart_recovery' => [
114 'rtsb_abandoned_cart_recovery_action',
115 'rtsb_send_abandoned_cart_emails',
116 ],
117 'currency_switcher' => [
118 'update_exchange_rates_hourly',
119 ],
120 ];
121 if ( ! isset( $schedule[ $block_id ] ) ) {
122 return;
123 }
124 if ( ! isset( $rawOptions['active'] ) ) {
125 return;
126 }
127 if ( 'on' === $rawOptions['active'] ) {
128 return;
129 }
130 // CLear All Custom Schedule If module disabled.
131 foreach ( $schedule[ $block_id ] as $hook ) {
132 wp_clear_scheduled_hook( $hook );
133 }
134 }
135
136 /**
137 * @param boolen $has_orders Order exist or not.
138 *
139 * @return void
140 */
141 public static function after_account_orders( $has_orders ) {
142 if ( ! $has_orders ) {
143 echo '</div>';
144 }
145 }
146
147 /**
148 * @param boolen $has_orders Order exist or not.
149 *
150 * @return void
151 */
152 public static function before_account_orders( $has_orders ) {
153 if ( ! $has_orders ) {
154 echo '<div class="rtsb-notice">';
155 }
156 }
157
158
159 /**
160 * @return void
161 */
162 public static function woocommerce_checkout_coupon_form() {
163 echo '<div class="rtsb-notice">';
164 woocommerce_checkout_coupon_form();
165 echo '</div>';
166 }
167
168 /**
169 * @return void
170 */
171 public static function woocommerce_checkout_login_form() {
172 echo '<div class="rtsb-notice">';
173 woocommerce_checkout_login_form();
174 echo '</div>';
175 }
176
177 /**
178 * @return void
179 */
180 public static function cart_is_empty() {
181 echo '<div class="rtsb-notice">';
182 wc_empty_cart_message();
183 echo '</div>';
184 }
185
186 /**
187 * @param int $post_id Post Ids.
188 * @param object $post Post Object.
189 *
190 * @return void
191 */
192 public static function deleted_post( $post_id, $post ) {
193 if ( BuilderFns::$post_type_tb !== $post->post_type ) {
194 return;
195 }
196
197 $options = BuilderFns::option_name_for_specific_product_set_default( $post_id );
198 TemplateSettings::instance()->delete_option( $options );
199
200 $template_options = BuilderFns::option_name_by_template_id( $post_id );
201 TemplateSettings::instance()->delete_option( $template_options );
202
203 $archive_options = BuilderFns::archive_option_name_by_template_id( $post_id );
204 TemplateSettings::instance()->delete_option( $archive_options );
205
206 $category_options = BuilderFns::option_name_for_specific_category_set_default( $post_id );
207 TemplateSettings::instance()->delete_option( $category_options );
208
209 $selected_category_options = BuilderFns::archive_option_name_by_template_id( $post_id );
210 TemplateSettings::instance()->delete_option( $selected_category_options );
211
212 // Delete Data From Options.
213 $options_product_selected_cat = BuilderFns::option_name_product_page_selected_cat( $post_id );
214 $cat_list = TemplateSettings::instance()->get_option( $options_product_selected_cat );
215 if ( ! empty( $cat_list ) ) {
216 foreach ( $cat_list as $old_slug ) {
217 $OldcatList = get_term_by( 'slug', $old_slug, 'product_cat' );
218 if ( ! empty( $OldcatList ) && ! is_wp_error( $OldcatList ) ) {
219 delete_term_meta( $OldcatList->term_id, BuilderFns::$categories_product_page_template, $post_id );
220 }
221 }
222 }
223 TemplateSettings::instance()->delete_option( $options_product_selected_cat );
224
225 $set_default_option = BuilderFns::option_name_product_page_specific_cat_set_default( $post_id );
226 TemplateSettings::instance()->delete_option( $set_default_option );
227
228 // Tags Remove.
229 $options_product_selected_tag = BuilderFns::option_name_product_page_selected_tag( $post_id );
230 $tag_list = TemplateSettings::instance()->get_option( $options_product_selected_tag );
231 if ( ! empty( $tag_list ) ) {
232 foreach ( $tag_list as $old_slug ) {
233 $OldTagList = get_term_by( 'slug', $old_slug, 'product_tag' );
234 if ( ! empty( $OldTagList ) && ! is_wp_error( $OldTagList ) ) {
235 delete_term_meta( $OldTagList->term_id, BuilderFns::$tags_product_page_template, $post_id );
236 }
237 }
238 }
239 TemplateSettings::instance()->delete_option( $options_product_selected_tag );
240
241 // Tag Set Default Option.
242 $tag_set_default_option = BuilderFns::option_name_product_page_specific_tag_set_default( $post_id );
243 TemplateSettings::instance()->delete_option( $tag_set_default_option );
244
245 global $wpdb;
246 // Prepare and execute the SQL query.
247 $sql = $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value = %d", BuilderFns::$view_template_for_products_meta, $post_id );
248 $wpdb->query( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching
249
250 // Prepare and execute the SQL query.
251 $sql = $wpdb->prepare( "DELETE FROM $wpdb->termmeta WHERE meta_key = %s AND meta_value = %d", BuilderFns::$view_template_for_archive_meta, $post_id );
252 $wpdb->query( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching
253 }
254 /**
255 * Meta tags for social sharing.
256 *
257 * @return void
258 */
259 public static function shopbuilder_share() {
260 $generalList = GeneralList::instance()->get_data();
261
262 if (
263 empty( $generalList['social_share']['share_platforms_to_product_page'] ) ||
264 'on' !== $generalList['social_share']['share_platforms_to_product_page'] ||
265 empty( $generalList['social_share']['share_platforms'] )
266 ) {
267 return;
268 }
269
270 $share_platforms = [];
271
272 foreach ( $generalList['social_share']['share_platforms'] as $value ) {
273 $share_platforms[ $value ] = [
274 'share_items' => $value,
275 'share_text' => ucwords( $value ),
276 ];
277 }
278
279 $settings['share_platforms'] = $share_platforms;
280 $settings['layout'] = ! empty( $generalList['social_share']['share_icon_layout'] ) ? $generalList['social_share']['share_icon_layout'] : 1;
281 $settings['show_share_icon'] = 1;
282
283 /**
284 * Implement Later ! empty( $generalList['social_share']['share_icon_show_to_product_page'] ) && 'on' === $generalList['social_share']['share_icon_show_to_product_page'];
285 */
286 Fns::print_html( Render::instance()->social_share_view( 'elementor/general/social-share', $settings ), true );
287 }
288
289 /**
290 * Meta tags for social sharing.
291 *
292 * @return void
293 */
294 public static function og_metatags_for_sharing() {
295 global $post;
296
297 if ( ! isset( $post ) ) {
298 return;
299 }
300
301 if ( ! is_singular( 'product' ) ) {
302 return;
303 }
304
305 Fns::print_html( '<meta property="og:url" content="' . get_the_permalink() . '" />', true );
306 Fns::print_html( '<meta property="og:type" content="article" />', true );
307 Fns::print_html( '<meta property="og:title" content="' . $post->post_title . '" />', true );
308 Fns::print_html( '<meta property="og:description" content="' . wp_trim_words( $post->post_content, 150 ) . '" />' );
309
310 $attachment = get_the_post_thumbnail_url();
311
312 if ( ! empty( $attachment ) ) {
313 Fns::print_html( '<meta property="og:image" content="' . $attachment . '" />', true );
314 }
315
316 Fns::print_html( '<meta property="og:site_name" content="' . get_bloginfo( 'name' ) . '" />', true );
317 Fns::print_html( '<meta name="twitter:card" content="summary" />', true );
318 }
319
320 /**
321 * Render image.
322 *
323 * @param array $args Image args.
324 *
325 * @return void
326 */
327 public static function render_image( $args ) {
328 if ( $args['image_link'] ) {
329 $aria_label = esc_attr(
330 /* translators: Product Name */
331 sprintf( __( 'Image link for Product: %s', 'shopbuilder' ), $args['title'] )
332 );
333 ?>
334 <figure>
335 <a class="woocommerce-LoopProduct-link rtsb-img-link" href="<?php echo esc_url( $args['p_link'] ); ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>">
336 <?php
337 Fns::get_product_image( $args['img_html'], $args['hover_img_html'] );
338 ?>
339 </a>
340 </figure>
341 <?php
342 } else {
343 echo '<figure class="rtsb-img-link">';
344 Fns::get_product_image( $args['img_html'], $args['hover_img_html'] );
345 echo '</figure>';
346 }
347 }
348
349 /**
350 * Modify WooCommerce query arguments for product retrieval.
351 *
352 * @param array $settings The settings array.
353 *
354 * @return void
355 */
356 public static function modify_wc_query_args( $settings ) {
357 if ( ( isset( $settings['tax_relation'] ) && 'OR' === $settings['tax_relation'] ) ||
358 ( isset( $settings['relation'] ) && 'OR' === $settings['relation'] ) ) {
359 add_filter( 'woocommerce_product_data_store_cpt_get_products_query', [ FilterHooks::class, 'extra_query_args' ], 10, 2 );
360 }
361
362 if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
363 add_filter( 'woocommerce_product_data_store_cpt_get_products_query', [ FilterHooks::class, 'extra_query_args_outofstock' ] );
364 }
365 }
366
367 /**
368 * Reset WooCommerce query arguments for product retrieval.
369 *
370 * @param array $settings The settings array.
371 *
372 * @return void
373 */
374 public static function reset_wc_query_args( $settings ) {
375 if ( ( isset( $settings['tax_relation'] ) && 'OR' === $settings['tax_relation'] ) ||
376 ( isset( $settings['relation'] ) && 'OR' === $settings['relation'] ) ) {
377 remove_filter( 'woocommerce_product_data_store_cpt_get_products_query', [ FilterHooks::class, 'extra_query_args' ] );
378 }
379
380 if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
381 remove_filter( 'woocommerce_product_data_store_cpt_get_products_query', [ FilterHooks::class, 'extra_query_args_outofstock' ] );
382 }
383 }
384 /**
385 * Display a filter header.
386 *
387 * @param array $settings The settings.
388 *
389 * @return void
390 */
391 public static function default_filter_header( $settings ) {
392 if ( empty( $settings['show_filter_header'] ) && empty( $settings['filter_header_text'] ) ) {
393 return;
394 }
395
396 $wrapper_class = 'rtsb-default-filter-header ';
397
398 ?>
399
400 <div class="<?php echo esc_attr( $wrapper_class ); ?>">
401 <h3><?php echo esc_html( $settings['filter_header_text'] ); ?></h3>
402 </div>
403
404 <?php
405 }
406 /**
407 * Display a filter search form.
408 *
409 * @param array $settings The settings.
410 *
411 * @return void
412 */
413 public static function default_filter_search( $settings ) {
414 if ( empty( $settings['search_form'] ) ) {
415 return;
416 }
417
418 $title = [
419 'title' => ! empty( $settings['search_title'] ) ? $settings['search_title'] : '',
420 'show_icon' => ! empty( $settings['show_search_title_icon'] ),
421 'icon' => ! empty( $settings['filter_search_title_icon'] ) ? $settings['filter_search_title_icon'] : [],
422 ];
423 $placeholder = ! empty( $settings['search_placeholder'] ) ? $settings['search_placeholder'] : '';
424 $btn_icon = ! empty( $settings['search_title_icon'] ) ? $settings['search_title_icon'] : [];
425 $wrapper_class = 'rtsb-default-filter-search rtsb-default-product-search';
426 $unique_id = substr( uniqid(), -6 );
427 $search_term = isset( $_REQUEST['s'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['s'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
428 ?>
429
430 <div class="<?php echo esc_attr( $wrapper_class ); ?>">
431 <?php
432 Fns::print_html( RenderHelpers::get_default_filter_title( $title ) );
433 ?>
434 <div class="default-search-content">
435 <div class="woocommerce-product-search<?php echo ! empty( $search_term ) ? ' active' : ''; ?>">
436 <div class="search-input">
437 <label class="screen-reader-text" for="rtsb-product-default-search-form-<?php echo esc_attr( $unique_id ); ?>"><?php echo esc_html( $placeholder ); ?></label>
438 <input type="search" id="rtsb-product-default-search-form-<?php echo esc_attr( $unique_id ); ?>" class="rtsb-default-search-field" placeholder="<?php echo esc_html( $placeholder ); ?>" value="<?php echo esc_attr( $search_term ); ?>" name="s" autocomplete="off">
439 </div>
440 <button class="rtsb-search-submit">
441 <?php
442
443 Fns::print_html( Fns::icons_manager( $btn_icon, 'search-icon' ) );
444
445 ?>
446 <span></span>
447 </button>
448 </div>
449 </div>
450 </div>
451
452 <?php
453 }
454 /**
455 * Query modifier.
456 *
457 * @param object $query Query.
458 * @return object
459 */
460 public static function query_modifier( $query ) {
461 $onsale_filter = isset( $_GET['sale_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['sale_filter'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
462 $on_sale_products = wc_get_product_ids_on_sale();
463
464 if ( 'onsale' === $onsale_filter ) {
465 $query->set( 'post__in', ! empty( $on_sale_products ) ? $on_sale_products : [ 0 ] );
466 } elseif ( 'regular' === $onsale_filter ) {
467 $query->set( 'post__not_in', $on_sale_products );
468 }
469
470 return $query;
471 }
472
473 /**
474 * Delete cache when switching to another theme.
475 *
476 * @return void
477 */
478 public static function clear_cache() {
479 Cache::clear_all_cache();
480 }
481 }
482