PluginProbe ʕ •ᴥ•ʔ
Premium Addons for Elementor – Powerful Elementor Templates & Widgets / 4.11.78
Premium Addons for Elementor – Powerful Elementor Templates & Widgets v4.11.78
4.11.79 4.11.78 4.11.77 4.11.76 4.11.75 3.20.5 4.11.69 3.20.6 4.11.7 3.20.7 4.11.70 3.20.8 4.11.71 3.20.9 4.11.72 3.21.1 4.11.73 3.21.2 4.11.74 3.21.3 4.11.8 3.21.4 4.11.9 3.21.5 4.2.0 3.21.6 4.2.1 3.3.0 4.2.2 3.3.1 4.2.3 3.3.2 4.2.4 3.3.3 4.2.5 3.3.4 4.2.6 3.3.5 4.2.7 3.3.6 4.2.8 3.3.7 4.2.9 3.3.8 4.3.0 3.3.9 4.3.1 3.4.0 4.3.2 3.4.1 4.3.3 3.4.2 4.3.4 3.4.3 4.3.5 3.4.4 4.3.6 3.4.5 4.3.7 3.4.6 4.3.8 3.4.7 4.3.9 3.4.8 4.4.0 3.4.9 4.4.1 3.5.0 4.4.2 3.5.1 4.4.3 3.5.2 4.4.4 3.5.3 4.4.5 3.5.4 4.4.6 3.5.5 4.4.7 3.5.6 4.4.8 3.5.7 4.4.9 3.5.8 4.5.0 3.5.9 4.5.1 3.6.0 4.5.2 3.6.1 4.5.3 3.6.2 4.5.4 3.6.3 4.5.5 3.6.4 4.5.6 3.6.5 4.5.7 3.6.6 4.5.8 3.6.7 4.5.9 3.6.8 4.6.0 3.6.9 4.6.1 3.7.0 4.7.0 3.7.1 4.7.1 3.7.2 4.7.2 3.7.3 4.7.3 3.7.4 4.7.4 3.7.5 4.7.5 3.7.6 4.7.6 3.7.7 4.7.7 3.7.8 4.7.8 3.7.9 4.7.9 3.8.0 4.8.0 3.8.1 4.8.1 3.8.2 4.8.10 3.8.3 4.8.11 3.8.4 4.8.2 3.8.5 4.8.3 3.8.6 4.8.4 3.8.7 4.8.5 3.8.8 4.8.6 3.8.9 4.8.7 3.9.0 4.8.8 3.9.1 4.8.9 3.9.2 4.9.0 3.9.3 4.9.0-beta1 3.9.4 4.9.0-beta2 3.9.5 4.9.1 3.9.6 4.9.10 3.9.7 4.9.11 3.9.8 4.9.12 3.9.9 4.9.13 4.0.1 4.9.14 4.0.3 4.9.15 4.0.4 4.9.16 4.0.5 4.9.17 4.0.6 4.9.18 4.0.7 4.9.19 4.0.8 4.9.2 4.0.9 4.9.20 4.1.0 4.9.21 4.1.1 4.9.22 4.1.2 4.9.23 4.1.3 4.9.24 trunk 4.1.4 4.9.25 1.0 4.1.5 4.9.26 1.01 4.1.6 4.9.27 1.02 4.1.7 4.9.28 1.03 4.1.8 4.9.29 1.04 4.1.9 4.9.3 1.05 4.10.0 4.9.30 1.06 4.10.1 4.9.31 1.07 4.10.10 4.9.32 1.08 4.10.11 4.9.33 1.09 4.10.12 4.9.34 2.0 4.10.13 4.9.35 2.0.1 4.10.14 4.9.36 2.0.2 4.10.15 4.9.37 2.0.3 4.10.16 4.9.38 2.0.4 4.10.17 4.9.39 2.0.5 4.10.18 4.9.4 2.0.6 4.10.19 4.9.40 2.0.7 4.10.2 4.9.41 2.0.8 4.10.20 4.9.42 2.0.9 4.10.21 4.9.43 2.1.0 4.10.22 4.9.45 2.1.1 4.10.23 4.9.46 2.1.2 4.10.24 4.9.47 2.1.3 4.10.25 4.9.48 2.1.4 4.10.26 4.9.49 2.1.5 4.10.27 4.9.5 2.1.5-beta1 4.10.28 4.9.50 2.1.6 4.10.29 4.9.51 2.1.7 4.10.3 4.9.52 2.1.8 4.10.30 4.9.53 2.1.9 4.10.31 4.9.54 2.2.0 4.10.32 4.9.55 2.2.1 4.10.33 4.9.56 2.2.2 4.10.34 4.9.57 2.2.3 4.10.35 4.9.6 2.2.4 4.10.36 4.9.7 2.2.5 4.10.37 4.9.8 2.2.6 4.10.38 4.9.9 2.2.7 4.10.39 2.2.8 4.10.4 2.2.9 4.10.40 2.3.0 4.10.41 2.3.1 4.10.42 2.3.2 4.10.43 2.3.3 4.10.44 2.3.4 4.10.45 2.3.5 4.10.46 2.3.6 4.10.47 2.3.7 4.10.48 2.3.8 4.10.49 2.3.9 4.10.5 2.4.0 4.10.50 2.4.1 4.10.51 2.5.0 4.10.52 2.5.1 4.10.53 2.5.2 4.10.54 2.5.3 4.10.55 2.5.4 4.10.56 2.5.5 4.10.57 2.5.6 4.10.58 2.5.7 4.10.59 2.5.8 4.10.6 2.5.9 4.10.60 2.6.0 4.10.61 2.6.1 4.10.62 2.6.2 4.10.63 2.6.3 4.10.64 2.6.4 4.10.65 2.6.5 4.10.66 2.6.6 4.10.67 2.6.7 4.10.68 2.6.8 4.10.69 2.6.9 4.10.7 2.7.0 4.10.70 2.7.1 4.10.71 2.7.2 4.10.72 2.7.3 4.10.73 2.7.4 4.10.74 2.7.5 4.10.75 2.7.6 4.10.76 2.7.7 4.10.77 2.7.8 4.10.78 2.7.9 4.10.79 2.8.0 4.10.8 2.8.1 4.10.80 2.8.2 4.10.81 2.8.3 4.10.82 2.8.4 4.10.83 2.8.5 4.10.84 2.8.6 4.10.85 2.8.7 4.10.86 2.8.8 4.10.87 2.8.9 4.10.88 2.9.0 4.10.89 2.9.1 4.10.9 2.9.2 4.10.90 2.9.3 4.11.0 2.9.4 4.11.1 2.9.5 4.11.10 2.9.6 4.11.11 2.9.7 4.11.12 2.9.8 4.11.13 2.9.9 4.11.14 3.0.0 4.11.15 3.0.1 4.11.16 3.0.2 4.11.17 3.0.3 4.11.18 3.0.4 4.11.19 3.0.5 4.11.2 3.0.6 4.11.20 3.0.7 4.11.21 3.0.8 4.11.22 3.0.9 4.11.23 3.1.0 4.11.24 3.1.1 4.11.25 3.1.2 4.11.26 3.1.3 4.11.27 3.1.4 4.11.28 3.1.5 4.11.29 3.1.6 4.11.3 3.1.7 4.11.30 3.1.8 4.11.31 3.1.9 4.11.32 3.10.0 4.11.33 3.10.1 4.11.34 3.10.2 4.11.35 3.10.3 4.11.36 3.10.4 4.11.37 3.10.5 4.11.38 3.10.6 4.11.39 3.10.7 4.11.4 3.10.8 4.11.40 3.10.9 4.11.41 3.11.0 4.11.42 3.11.1 4.11.43 3.11.2 4.11.44 3.11.3 4.11.45 3.11.4 4.11.46 3.11.5 4.11.47 3.11.6 4.11.48 3.11.7 4.11.49 3.11.8 4.11.5 3.11.9 4.11.50 3.12.0 4.11.51 3.12.1 4.11.52 3.12.2 4.11.53 3.12.3 4.11.54 3.2.0 4.11.55 3.2.1 4.11.56 3.2.2 4.11.57 3.2.3 4.11.58 3.2.4 4.11.59 3.2.5 4.11.6 3.2.6 4.11.60 3.2.7 4.11.61 3.2.8 4.11.62 3.2.9 4.11.63 3.20.0 4.11.64 3.20.1 4.11.65 3.20.2 4.11.66 3.20.3 4.11.67 3.20.4 4.11.68
premium-addons-for-elementor / includes / assets-manager.php
premium-addons-for-elementor / includes Last commit date
controls 2 months ago extras 1 month ago helpers 1 week ago pa-display-conditions 1 month ago templates 1 month ago addons-integration.php 1 week ago assets-manager.php 3 weeks ago class-pa-core.php 1 month ago helper-functions.php 3 weeks ago module-base.php 2 months ago premium-template-tags.php 1 week ago promotion-pointer.php 3 weeks ago
assets-manager.php
1573 lines
1 <?php
2 /**
3 * PA Assets Manager.
4 */
5
6 namespace PremiumAddons\Includes;
7
8 use Elementor\Plugin;
9 use PremiumAddons\Includes\Helper_Functions;
10 use PremiumAddons\Admin\Includes\Admin_Helper;
11 use PremiumAddons\Admin\Includes\Admin_Bar;
12
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * PA Assets Manager Class.
19 */
20 class Assets_Manager {
21
22 /**
23 * Assets Key.
24 */
25 const ASSETS_KEY = '_pa_widget_elements';
26
27 /**
28 * Class Instance.
29 *
30 * @var object|null instance.
31 */
32 private static $instance = null;
33
34 /**
35 * Post Id.
36 * Option Id.
37 *
38 * @var string|null post_id.
39 */
40 protected $post_id = null;
41
42 /**
43 * Enabled Elements.
44 *
45 * @var array|null
46 */
47 protected $enabled_elements = null;
48
49 /**
50 * Integrations.
51 *
52 * @var array|null
53 */
54 protected $integrations = null;
55
56 /**
57 * Class Constructor.
58 */
59 public function __construct( $enabled_elements, $integrations ) {
60
61 $this->enabled_elements = $enabled_elements;
62 $this->integrations = $integrations;
63
64 $this->register_hooks();
65 }
66
67 /**
68 * Register Hooks.
69 *
70 * @access protected
71 * @since 4.6.1
72 */
73 protected function register_hooks() {
74
75 $is_dynamic_assets_enabled = $this->enabled_elements['premium-assets-generator'];
76
77 if ( $is_dynamic_assets_enabled ) {
78
79 // Register AJAX Hooks for regenerate assets.
80 add_action( 'wp_ajax_pa_clear_cached_assets', array( $this, 'pa_clear_cached_assets' ) );
81
82 add_action( 'elementor/editor/after_save', array( $this, 'handle_post_save' ), 10, 2 );
83
84 add_action( 'elementor/theme/register_locations', array( $this, 'get_asset_per_location' ), 20 );
85 add_filter( 'elementor/files/file_name', array( $this, 'load_asset_per_file' ) );
86
87 add_action( 'wp_enqueue_scripts', array( $this, 'handle_assets_load' ), 100 );
88
89 // Delete cached options on post delete.
90 add_action( 'wp_trash_post', array( $this, 'delete_trashed_post_data' ) );
91
92 add_action( 'elementor/frontend/before_enqueue_styles', array( $this, 'before_enqueue_styles' ) );
93
94 // Add admin bar tools for dynamic assets clear.
95 $row_meta = Helper_Functions::is_hide_row_meta();
96
97 if ( ! is_admin() && ! $row_meta ) {
98 Admin_Bar::get_instance();
99 }
100 }
101
102 add_action( 'elementor/frontend/after_register_styles', array( $this, 'register_frontend_styles' ) );
103 add_action( 'elementor/frontend/after_register_scripts', array( $this, 'register_frontend_scripts' ) );
104 }
105
106 /**
107 * Handle Assets Load.
108 *
109 * @access public
110 * @since 4.6.1
111 */
112 public function handle_assets_load() {
113
114 // Set current post id.
115 $this->set_post_id();
116
117 $this->enqueue_elements_handler();
118
119 // This will run only on frontend.
120 $this->get_pa_elements_list();
121
122 // Handle generate and enqueue assets for editor.
123 if ( $this->is_edit() ) {
124 $this->enqueue_asset( null, 'edit' );
125 }
126 }
127
128 /**
129 * Before Enqueue Styles.
130 *
131 * @access public
132 * @since 4.6.1
133 */
134 public function before_enqueue_styles() {
135
136 if ( $this->is_edit() ) {
137 return false;
138 }
139
140 $this->post_id = get_the_ID();
141
142 // Check for content changes and update assets data.
143 $this->get_pa_elements_list( $this->post_id );
144
145 $elements = get_post_meta( $this->post_id, self::ASSETS_KEY, true );
146
147 if ( ! empty( $elements ) ) {
148 $this->enqueue_asset( $this->post_id, $elements );
149 }
150 }
151
152 public function get_asset_per_location( $instance ) {
153
154 if ( is_admin() || ! ( class_exists( 'ElementorPro\Modules\ThemeBuilder\Module' ) ) ) {
155 return false;
156 }
157
158 $locations = $instance->get_locations();
159
160 foreach ( $locations as $location => $_unused ) {
161
162 $documents_module = \ElementorPro\Modules\ThemeBuilder\Module::instance();
163
164 if ( method_exists( $documents_module, 'get_locations_manager' ) && method_exists( $documents_module->get_locations_manager(), 'get_documents_for_location' ) ) {
165 $documents = $documents_module->get_locations_manager()->get_documents_for_location( $location );
166 } else {
167 $documents = $documents_module->get_conditions_manager()->get_documents_for_location( $location );
168 }
169
170 foreach ( $documents as $document ) {
171 if ( ! is_object( $document ) ) {
172 continue;
173 }
174
175 $post_id = $document->get_post()->ID;
176
177 $this->post_id = $post_id;
178 $this->get_pa_elements_list( $this->post_id );
179 $elements = get_post_meta( $this->post_id, self::ASSETS_KEY, true );
180
181 if ( ! empty( $elements ) ) {
182 $this->enqueue_asset( $this->post_id, $elements );
183 }
184 }
185 }
186 }
187
188 public function load_asset_per_file( $file_name ) {
189
190 if ( empty( $file_name ) ) {
191 return $file_name;
192 }
193
194 $post_id = preg_replace( '/[^0-9]/', '', $file_name );
195
196 if ( $post_id < 1 ) {
197 return $file_name;
198 }
199
200 $this->post_id = $post_id;
201
202 $this->get_pa_elements_list( $this->post_id );
203 $elements = get_post_meta( $this->post_id, self::ASSETS_KEY, true );
204
205 if ( ! empty( $elements ) ) {
206 $this->enqueue_asset( $this->post_id, $elements );
207 }
208
209 return $file_name;
210 }
211
212 /**
213 * Enqueue Asset.
214 *
215 * Enqueue dynamic CSS/JS file for the current post.
216 *
217 * @access public
218 * @since 4.6.1
219 *
220 * @param int $post_id post id.
221 * @param string $location edit|front.
222 */
223 public function enqueue_asset( $post_id = null, $location = 'front' ) {
224
225 $dynamic_asset_id = ( $post_id ? '-' . $post_id : '' );
226
227 // If no CSS file found, then generate it.
228 if ( ! $this->has_asset_file( $post_id, 'css' ) ) {
229 $this->generate_new_asset_file( $post_id, $location, 'css' );
230 }
231
232 wp_enqueue_style(
233 'pafe' . $dynamic_asset_id,
234 Helper_Functions::get_safe_url( PREMIUM_ASSETS_URL . '/' . 'pafe' . $dynamic_asset_id . '.css' ),
235 array(),
236 time()
237 );
238
239 // If no JS file found, then generate it.
240 if ( ! $this->has_asset_file( $post_id, 'js' ) ) {
241 $this->generate_new_asset_file( $post_id, $location, 'js' );
242 }
243
244 // Check again to prevent case where no JS file generated (independent widgets only).
245 if ( $this->has_asset_file( $post_id, 'js' ) ) {
246 wp_enqueue_script(
247 'pafe' . $dynamic_asset_id,
248 Helper_Functions::get_safe_url( PREMIUM_ASSETS_URL . '/' . 'pafe' . $dynamic_asset_id . '.js' ),
249 array(),
250 time(),
251 true
252 );
253 }
254 }
255
256 /**
257 * Has Asset File.
258 *
259 * Check if the current post ID has an asset file.
260 *
261 * @access public
262 * @since 4.6.1
263 *
264 * @param int $post_id post id.
265 * @param string $ext js|css.
266 *
267 * @return bool if has asset file.
268 */
269 public function has_asset_file( $post_id, $ext = 'css' ) {
270
271 if ( file_exists( Helper_Functions::get_safe_path( PREMIUM_ASSETS_PATH . '/' . 'pafe' . ( $post_id ? '-' . $post_id : '' ) . '.' . $ext ) ) ) {
272 return true;
273 }
274
275 return false;
276 }
277
278 /**
279 * Handle Post Save.
280 *
281 * @access public
282 * @since 4.6.1
283 */
284 public function handle_post_save( $post_id, $data ) {
285
286 $widget_list = $this->extract_pa_elements( $data );
287 $this->save_pa_widgets_list( $post_id, $widget_list );
288 }
289
290 /**
291 * Set post unique id.
292 *
293 * @access public
294 * @since 4.6.1
295 *
296 * @return void
297 */
298 public function set_post_id() {
299
300 $this->post_id = get_the_ID();
301 }
302
303 /**
304 * Extracts PA Elements.
305 *
306 * @access public
307 * @since 4.6.1
308 *
309 * @param array $data post data.
310 *
311 * @return array
312 */
313 public function extract_pa_elements( $data ) {
314
315 if ( empty( $data ) ) {
316 return array();
317 }
318
319 $pa_names = Admin_Helper::get_pa_elements_names();
320
321 $pa_elems = array();
322
323 Plugin::$instance->db->iterate_data(
324 $data,
325 function ( $element ) use ( &$pa_elems, $pa_names ) {
326
327 if ( isset( $element['elType'] ) ) {
328
329 if ( 'widget' === $element['elType'] && isset( $element['widgetType'] ) ) {
330
331 $widget_type = ( 'global' === $element['widgetType'] && ! empty( $element['templateID'] ) ) ? $this->get_global_widget_type( $element['templateID'] ) : $element['widgetType'];
332
333 if ( in_array( $widget_type, $pa_names, true ) && ! in_array( $widget_type, $pa_elems, true ) ) {
334
335 $pa_elems[] = $widget_type;
336
337 }
338 }
339 }
340 }
341 );
342
343 return $pa_elems;
344 }
345
346 /**
347 * Get Global Widget Type.
348 *
349 * @access public
350 * @since 4.6.1
351 * @link https://code.elementor.com/methods/elementor-templatelibrary-manager-get_template_data/
352 * @param int $temp_id template it.
353 *
354 * @return string|void
355 */
356 public function get_global_widget_type( $temp_id ) {
357
358 $temp_data = Plugin::$instance->templates_manager->get_template_data(
359 array(
360 'source' => 'local',
361 'template_id' => $temp_id,
362 )
363 );
364
365 if ( is_wp_error( $temp_data ) || ! $temp_data || empty( $temp_data ) ) {
366 return;
367 }
368
369 if ( ! isset( $temp_data['content'] ) || empty( $temp_data['content'] ) ) {
370 return;
371 }
372
373 return $temp_data['content'][0]['widgetType'];
374 }
375
376 /**
377 * Generate New Asset File.
378 *
379 * Generates a new CSS/JS file for the current post.
380 *
381 * @access public
382 * @since 4.6.1
383 *
384 * @param int $post_id post id.
385 * @param string $location edit|front.
386 * @param string $ext js|css.
387 */
388 public function generate_new_asset_file( $post_id, $location, $ext ) {
389
390 // If no directory found, then create it.
391 if ( ! file_exists( PREMIUM_ASSETS_PATH ) ) {
392 wp_mkdir_p( PREMIUM_ASSETS_PATH );
393 }
394
395 // Generate dynamic asset file content.
396 $file_content = $this->get_asset_file_content( $post_id, $location, $ext );
397
398 if ( ! empty( $file_content ) ) {
399
400 $name = 'pafe' . ( $post_id ? '-' . $post_id : '' ) . '.' . $ext;
401 $file_path = Helper_Functions::get_safe_path( PREMIUM_ASSETS_PATH . DIRECTORY_SEPARATOR . $name );
402
403 file_put_contents( $file_path, $file_content ); // phpcs:ignore
404 }
405 }
406
407 /**
408 * Get Asset File Content.
409 *
410 * Collects pa/papro widgets assets.
411 *
412 * @access public
413 * @since 4.6.1
414 *
415 * @param int $post_id post id.
416 * @param string $location edit|front.
417 * @param string $ext js|css.
418 *
419 * @return string|array $content
420 */
421 public function get_asset_file_content( $post_id, $location, $ext ) {
422
423 $content = '';
424
425 if ( 'edit' === $location ) {
426 // For editor, generate assets based on the enabled elements.
427 $elements = Helper_Functions::get_enabled_widgets_names();
428 } else {
429 $elements = get_post_meta( $post_id, self::ASSETS_KEY, true );
430 }
431
432 if ( empty( $elements ) ) {
433 return '';
434 }
435
436 $elements = $this->prepare_pa_elements( $elements, $ext );
437
438 foreach ( $elements as $element ) {
439
440 $path = $this->get_file_path( $element, $ext );
441
442 if ( ! $path ) {
443 continue;
444 }
445
446 $file_content = $this->get_file_content( Helper_Functions::get_safe_path( $path ) );
447
448 $content .= $file_content;
449 }
450
451 return $content;
452 }
453
454 /**
455 * Prepare PA Elements.
456 *
457 * @access public
458 * @since 4.6.1
459 *
460 * @param array $elements post elements.
461 * @param string $ext js|css.
462 *
463 * @return array
464 */
465 public function prepare_pa_elements( $elements, $ext ) {
466
467 if ( Helper_Functions::check_papro_version() ) {
468
469 $social_revs = array(
470 'premium-yelp-reviews',
471 'premium-google-reviews',
472 'premium-facebook-reviews',
473 );
474
475 $if_has_social_reviews = array_intersect( $social_revs, $elements );
476
477 if ( ! empty( $if_has_social_reviews ) ) {
478 $elements[] = 'premium-reviews';
479 }
480
481 $social_feed = array(
482 'premium-twitter-feed',
483 'premium-facebook-feed',
484 );
485
486 $if_has_social_feed = array_intersect( $social_feed, $elements );
487
488 if ( ! empty( $if_has_social_feed ) ) {
489 $elements[] = 'social-common';
490 }
491 }
492
493 if ( 'css' === $ext ) {
494 $common_assets = $this->has_free_elements( $elements ) ? array( 'common' ) : array();
495 $common_assets = $this->has_pro_elements( $elements ) ? array_merge( $common_assets, array( 'common-pro' ) ) : $common_assets;
496
497 $elements = array_merge( $elements, $common_assets );
498 $indep_elements = array(
499 'premium-world-clock',
500 'premium-svg-drawer',
501 );
502
503 // Load CSS files for PRO Woo Products skins handled for editor/frontend.
504 $if_woo_products = array_intersect( array( 'woo-products', 'premium-woo-products' ), $elements );
505
506 if ( $if_woo_products && Helper_Functions::check_papro_version() ) {
507 $elements[] = 'premium-woo-products-pro';
508 }
509 } else {
510 $indep_elements = array(
511 'social-common',
512 'premium-lottie',
513 'premium-vscroll',
514 'premium-hscroll',
515 'premium-nav-menu',
516 'premium-addon-maps',
517 'premium-woo-products',
518 'premium-woo-products-pro',
519 'premium-mini-cart',
520 'premium-woo-cta',
521 'premium-smart-post-listing',
522 'premium-notifications',
523 'premium-site-logo',
524 );
525
526 }
527
528 $elements = array_diff( $elements, $indep_elements );
529
530 return $elements;
531 }
532
533 /**
534 * Get File Content.
535 *
536 * @param string $path file path.
537 *
538 * @return string
539 */
540 public static function get_file_content( $path ) {
541
542 static $file_cache = array();
543
544 if ( isset( $file_cache[ $path ] ) ) {
545 return $file_cache[ $path ];
546 }
547
548 if ( ! file_exists( $path ) ) {
549 $file_cache[ $path ] = '';
550 return '';
551 }
552
553 $file_content = file_get_contents( $path );
554
555 $file_cache[ $path ] = $file_content;
556
557 return $file_content;
558 }
559
560 /**
561 * Get File Path.
562 * Construct file path.
563 *
564 * @param string $element pa element name.
565 * @param string $ext file extension ( js|css).
566 *
567 * @return string file path.
568 */
569 public function get_file_path( $element, $ext ) {
570
571 $is_pro = $this->is_pro_widget( $element );
572
573 if ( ! Helper_Functions::check_papro_version() && $is_pro ) {
574 return false;
575 }
576
577 $element = str_replace( '-addon', '', $element );
578
579 if ( 0 === strpos( $element, 'woo-' ) || 0 === strpos( $element, 'mini-' ) ) {
580 $element = 'premium-' . $element;
581 }
582
583 $path = $is_pro ? PREMIUM_PRO_ADDONS_PATH : PREMIUM_ADDONS_PATH;
584
585 return $path . 'assets/frontend/min-' . $ext . '/' . $element . '.min.' . $ext;
586 }
587
588 /**
589 * Is Pro Widget.
590 * Checks if the widget is pro.
591 *
592 * @access public
593 * @since 4.6.1
594 *
595 * @param string $widget widget name.
596 *
597 * @return bool
598 */
599 public function is_pro_widget( $widget ) {
600
601 $pro_names = array_merge( array( 'common-pro', 'premium-reviews', 'premium-woo-products-pro', 'social-common' ), $this->get_pro_widgets_names() );
602
603 return in_array( $widget, $pro_names, true );
604 }
605
606 /**
607 * Has Pro Elements.
608 * Check if the post has pa pro elements.
609 *
610 * @access public
611 * @since 4.6.1
612 *
613 * @param array $post_elements post elements.
614 *
615 * @return boolean
616 */
617 public function has_pro_elements( $post_elements ) {
618
619 $pro_elements = $this->get_pro_widgets_names();
620 $has_pro = array_intersect( $post_elements, $pro_elements ) ? true : false;
621
622 return $has_pro;
623 }
624
625 /**
626 * Has Free Elements.
627 * Check if the post has pa elements.
628 *
629 * @access public
630 * @since 4.6.1
631 *
632 * @param array $post_elements post elements.
633 *
634 * @return boolean
635 */
636 public function has_free_elements( $post_elements ) {
637
638 $free_elements = Admin_Helper::get_free_widgets_names();
639
640 // add some other pro widgets.
641 $free_elements = array_merge(
642 $free_elements,
643 array(
644 'premium-smart-post-listing',
645 'premium-addon-instagram-feed',
646 'premium-notbar',
647 'premium-addon-flip-box',
648 'premium-addon-icon-box',
649 'premium-addon-magic-section',
650 'premium-whatsapp-chat',
651 )
652 );
653
654 $has_free = array_intersect( $post_elements, $free_elements ) ? true : false;
655
656 return $has_free;
657 }
658
659 /**
660 * Get Pro Widgets Names.
661 *
662 * @access public
663 * @since 4.6.1
664 *
665 * @return array
666 */
667 public function get_pro_widgets_names() {
668
669 static $pro_names = null;
670
671 if ( null !== $pro_names ) {
672 return $pro_names;
673 }
674
675 $pro_elements = Admin_Helper::get_pro_elements();
676 $pro_names = array();
677
678 foreach ( $pro_elements as $element ) {
679 if ( isset( $element['name'] ) ) {
680 $pro_names[] = $element['name'];
681 }
682 }
683
684 return $pro_names;
685 }
686
687 /**
688 * Clear Cached Assets.
689 *
690 * Deletes assets options from DB And
691 * deletes assets files from uploads/premium-addons-for-elementor via AJAX
692 * directory.
693 *
694 * @access public
695 * @since 4.9.3
696 */
697 public function pa_clear_cached_assets() {
698
699 check_ajax_referer( 'pa-generate-nonce', 'security' );
700
701 $post_id = isset( $_POST['id'] ) ? sanitize_text_field( wp_unslash( $_POST['id'] ) ) : '';
702 $this->clear_dynamic_assets_data( $post_id );
703
704 wp_send_json_success( 'Cached Assets Cleared' );
705 }
706
707 /**
708 * Clear Dynamic Assets Data.
709 *
710 * Deletes assets options from DB And
711 * deletes assets files from uploads/premium-addons-for-elementor
712 * directory.
713 *
714 * @access public
715 * @since 4.10.51
716 *
717 * @param string $id post ID.
718 */
719 public function clear_dynamic_assets_data( $id = '' ) {
720
721 if ( ! current_user_can( 'manage_options' ) ) {
722 wp_send_json_error( __( 'You are not allowed to do this action', 'premium-addons-for-elementor' ) );
723 }
724
725 if ( Helper_Functions::check_elementor_version() ) {
726 Plugin::$instance->files_manager->clear_cache();
727 }
728
729 if ( ! empty( $id ) ) {
730 delete_post_meta( $id, self::ASSETS_KEY );
731 }
732
733 // Purge All LS Cache
734 do_action( 'litespeed_purge_all', 'Premium Addons for Elementor' );
735
736 $this->delete_assets_files( $id );
737 }
738
739 /**
740 * Delete Assets Options.
741 *
742 * @access public
743 * @since 4.9.3
744 */
745 public function delete_trashed_post_data( $id = '' ) {
746
747 $this->delete_assets_files( $id );
748
749 delete_post_meta( $id, self::ASSETS_KEY );
750 }
751
752 /**
753 * Delete Assets Files.
754 *
755 * @access public
756 * @since 4.6.1
757 *
758 * @param string $id post id.
759 */
760 public static function delete_assets_files( $id = '' ) {
761
762 $path = PREMIUM_ASSETS_PATH;
763
764 if ( ! is_dir( $path ) ) {
765 return;
766 }
767
768 if ( empty( $id ) ) {
769 $dir = new \DirectoryIterator( $path );
770 foreach ( $dir as $file ) {
771 if ( $file->isDot() || ! $file->isFile() ) {
772 continue;
773 }
774
775 unlink( Helper_Functions::get_safe_path( $file->getPathname() ) );
776 }
777 } else {
778
779 foreach ( glob( PREMIUM_ASSETS_PATH . '/*' . $id . '*' ) as $file ) {
780 if ( is_file( $file ) ) {
781 unlink( Helper_Functions::get_safe_path( $file ) );
782 }
783 }
784 }
785 }
786
787 /**
788 * Get PA Elements List.
789 *
790 * @access public
791 * @since 4.6.1
792 *
793 * @return boolean
794 */
795 public function get_pa_elements_list() {
796
797 if ( is_object( Plugin::instance()->editor ) && Plugin::instance()->editor->is_edit_mode() ) {
798 return false;
799 }
800
801 $post_id = $this->post_id;
802
803 if ( $this->has_assets_data( $post_id ) ) {
804 return false;
805 }
806
807 $document = is_object( Plugin::$instance->documents ) ? Plugin::$instance->documents->get( $post_id ) : array();
808 $data = is_object( $document ) ? $document->get_elements_data() : array();
809 $data = $this->extract_pa_elements( $data );
810
811 $this->save_pa_widgets_list( $post_id, $data );
812
813 return true;
814 }
815
816 /**
817 * Save PA Widgets List.
818 *
819 * @access public
820 * @since 4.6.1
821 *
822 * @param int $post_id post id.
823 * @param array $list widgets list.
824 *
825 * @return boolean
826 */
827 public function save_pa_widgets_list( $post_id, $list ) {
828
829 if ( \defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
830 return $post_id;
831 }
832
833 $documents = is_object( Plugin::$instance->documents ) ? Plugin::$instance->documents->get( $post_id ) : array();
834
835 if ( ! in_array( get_post_status( $post_id ), array( 'publish', 'private' ), true ) || ( is_object( $documents ) && ! $documents->is_built_with_elementor() ) ) {
836 return false;
837 }
838
839 if ( in_array( get_post_meta( $post_id, '_elementor_template_type', true ), array( 'kit' ), true ) ) {
840 return false;
841 }
842
843 // No new elements added.
844 $existing_elements = get_post_meta( $post_id, self::ASSETS_KEY, true );
845 if ( $list === $existing_elements ) {
846 return false;
847 }
848
849 try {
850
851 update_post_meta( $post_id, self::ASSETS_KEY, $list );
852
853 $this->delete_assets_files( $post_id );
854
855 if ( $this->has_assets_data( $post_id ) ) {
856 $this->update_assets_files( $post_id, $list );
857 }
858
859 return true;
860 } catch ( \Exception $e ) {
861 return false;
862 }
863 }
864
865 /**
866 * Update Assets Files.
867 *
868 * @access public
869 * @since 4.6.1
870 *
871 * @param int $post_id post id.
872 * @param array $elements elements.
873 */
874 public function update_assets_files( $post_id, $elements ) {
875
876 $this->generate_new_asset_file( $post_id, 'front', 'css' );
877 $this->generate_new_asset_file( $post_id, 'front', 'js' );
878 }
879
880 public function is_edit() {
881 return (
882 Plugin::instance()->editor->is_edit_mode() ||
883 Plugin::instance()->preview->is_preview_mode() ||
884 is_preview()
885 );
886 }
887
888 /**
889 * Has Assets Data.
890 *
891 * @access public
892 * @since 4.10.54
893 *
894 * @param int $post_id post id.
895 *
896 * @return boolean
897 */
898 public function has_assets_data( $post_id ) {
899
900 $status = get_post_meta( $post_id, self::ASSETS_KEY, true );
901
902 return ! empty( $status );
903 }
904
905 /**
906 * Exclude PA assets from WP Optimize
907 *
908 * @since 4.10.73
909 * @access public
910 */
911 function exclude_pa_assets_from_wp_optimize( $excluded_handles ) {
912
913 $excluded_handles[] = 'pa-frontend';
914
915 return $excluded_handles;
916 }
917
918 /**
919 * Register Frontend CSS files
920 *
921 * @since 2.9.0
922 * @access public
923 */
924 public function register_frontend_styles() {
925
926 $dir = Helper_Functions::get_styles_dir();
927 $suffix = Helper_Functions::get_assets_suffix();
928
929 wp_register_style(
930 'font-awesome-5-all',
931 ELEMENTOR_ASSETS_URL . 'lib/font-awesome/css/all.min.css',
932 false,
933 PREMIUM_ADDONS_VERSION
934 );
935
936 wp_register_style(
937 'pa-flipster',
938 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/flipster' . $suffix . '.css',
939 false,
940 PREMIUM_ADDONS_VERSION
941 );
942
943 wp_register_style(
944 'pa-prettyphoto',
945 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/prettyphoto' . $suffix . '.css',
946 array(),
947 PREMIUM_ADDONS_VERSION,
948 'all'
949 );
950
951 wp_register_style(
952 'pa-btn',
953 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/button-line' . $suffix . '.css',
954 array(),
955 PREMIUM_ADDONS_VERSION,
956 'all'
957 );
958
959 wp_register_style(
960 'pa-load-animations',
961 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/load-animations' . $suffix . '.css',
962 array(),
963 PREMIUM_ADDONS_VERSION,
964 'all'
965 );
966
967 wp_register_style(
968 'pa-share-btn',
969 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/share-button' . $suffix . '.css',
970 array(),
971 PREMIUM_ADDONS_VERSION,
972 'all'
973 );
974
975 wp_register_style(
976 'pa-image-effects',
977 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/image-effects' . $suffix . '.css',
978 array(),
979 PREMIUM_ADDONS_VERSION,
980 'all'
981 );
982
983 wp_register_style(
984 'pa-slick',
985 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/slick' . $suffix . '.css',
986 array(),
987 PREMIUM_ADDONS_VERSION,
988 'all'
989 );
990
991 wp_register_style(
992 'pa-world-clock',
993 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-world-clock' . $suffix . '.css',
994 array(),
995 PREMIUM_ADDONS_VERSION,
996 'all'
997 );
998
999 wp_register_style(
1000 'tooltipster',
1001 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/tooltipster.min.css',
1002 array(),
1003 PREMIUM_ADDONS_VERSION,
1004 'all'
1005 );
1006
1007 wp_register_style(
1008 'pa-gTooltips',
1009 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-gtooltips' . $suffix . '.css',
1010 array(),
1011 PREMIUM_ADDONS_VERSION,
1012 'all'
1013 );
1014
1015 wp_register_style(
1016 'pa-shape-divider',
1017 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-sh-divider' . $suffix . '.css',
1018 array(),
1019 PREMIUM_ADDONS_VERSION,
1020 'all'
1021 );
1022
1023 wp_register_style(
1024 'pa-odometer',
1025 PREMIUM_ADDONS_URL . 'assets/frontend/min-css/odometer.min.css',
1026 array(),
1027 PREMIUM_ADDONS_VERSION,
1028 'all'
1029 );
1030
1031 wp_register_style(
1032 'pa-glass',
1033 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/liquid-glass' . $suffix . '.css',
1034 array(),
1035 PREMIUM_ADDONS_VERSION,
1036 'all'
1037 );
1038
1039 if ( ! $this->enabled_elements['premium-assets-generator'] ) {
1040
1041 wp_enqueue_style(
1042 'premium-addons',
1043 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-addons' . $suffix . '.css',
1044 array(),
1045 PREMIUM_ADDONS_VERSION,
1046 'all'
1047 );
1048
1049 }
1050 }
1051
1052 public function enqueue_elements_handler() {
1053
1054 wp_enqueue_script(
1055 'pa-elements-handler',
1056 PREMIUM_ADDONS_URL . 'assets/frontend/min-js/elements-handler.min.js',
1057 array(),
1058 PREMIUM_ADDONS_VERSION,
1059 true
1060 );
1061 }
1062
1063 /**
1064 * Registers required JS files
1065 *
1066 * @since 1.0.0
1067 * @access public
1068 */
1069 public function register_frontend_scripts() {
1070
1071 $maps_settings = $this->integrations;
1072
1073 $dir = Helper_Functions::get_scripts_dir();
1074 $suffix = Helper_Functions::get_assets_suffix();
1075
1076 wp_localize_script(
1077 'elementor-frontend',
1078 'PremiumSettings',
1079 array(
1080 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ),
1081 'nonce' => wp_create_nonce( 'pa-blog-widget-nonce' ),
1082
1083 )
1084 );
1085
1086 if ( ! $this->enabled_elements['premium-assets-generator'] ) {
1087 wp_register_script(
1088 'premium-addons',
1089 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-addons' . $suffix . '.js',
1090 array( 'jquery' ),
1091 PREMIUM_ADDONS_VERSION,
1092 true
1093 );
1094 }
1095
1096 wp_register_script(
1097 'pa-scrolldir',
1098 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/pa-scrolldir' . $suffix . '.js',
1099 array( 'jquery' ),
1100 PREMIUM_ADDONS_VERSION,
1101 true
1102 );
1103
1104 wp_register_script(
1105 'prettyPhoto-js',
1106 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/prettyPhoto' . $suffix . '.js',
1107 array( 'jquery' ),
1108 PREMIUM_ADDONS_VERSION,
1109 true
1110 );
1111
1112 wp_register_script(
1113 'tooltipster-bundle',
1114 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/tooltipster' . $suffix . '.js',
1115 array( 'jquery' ),
1116 PREMIUM_ADDONS_VERSION,
1117 true
1118 );
1119
1120 wp_register_script(
1121 'pa-vticker',
1122 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/vticker' . $suffix . '.js',
1123 array( 'jquery' ),
1124 PREMIUM_ADDONS_VERSION,
1125 true
1126 );
1127
1128 wp_register_script(
1129 'pa-typed',
1130 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/typed' . $suffix . '.js',
1131 array( 'jquery' ),
1132 PREMIUM_ADDONS_VERSION,
1133 true
1134 );
1135
1136 wp_register_script(
1137 'countdown-translator',
1138 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/countdown-translator' . $suffix . '.js',
1139 array( 'jquery' ),
1140 PREMIUM_ADDONS_VERSION,
1141 true
1142 );
1143
1144 wp_register_script(
1145 'pa-countdown',
1146 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/jquery-countdown' . $suffix . '.js',
1147 array( 'jquery' ),
1148 PREMIUM_ADDONS_VERSION,
1149 true
1150 );
1151
1152 wp_register_script(
1153 'isotope-js',
1154 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/isotope' . $suffix . '.js',
1155 array( 'jquery' ),
1156 PREMIUM_ADDONS_VERSION,
1157 true
1158 );
1159
1160 wp_register_script(
1161 'pa-modal',
1162 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/modal' . $suffix . '.js',
1163 array( 'jquery' ),
1164 PREMIUM_ADDONS_VERSION,
1165 true
1166 );
1167
1168 wp_register_script(
1169 'pa-maps',
1170 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-maps' . $suffix . '.js',
1171 array( 'jquery' ),
1172 PREMIUM_ADDONS_VERSION,
1173 true
1174 );
1175
1176 wp_register_script(
1177 'pa-vscroll',
1178 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-vscroll' . $suffix . '.js',
1179 array( 'jquery' ),
1180 PREMIUM_ADDONS_VERSION,
1181 true
1182 );
1183
1184 wp_register_script(
1185 'pa-slimscroll',
1186 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/jquery-slimscroll' . $suffix . '.js',
1187 array( 'jquery' ),
1188 PREMIUM_ADDONS_VERSION,
1189 true
1190 );
1191
1192 wp_register_script(
1193 'pa-iscroll',
1194 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/iscroll' . $suffix . '.js',
1195 array( 'jquery' ),
1196 PREMIUM_ADDONS_VERSION,
1197 true
1198 );
1199
1200 wp_register_script(
1201 'pa-tilt',
1202 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/universal-tilt' . $suffix . '.js',
1203 array( 'jquery' ),
1204 PREMIUM_ADDONS_VERSION,
1205 true
1206 );
1207
1208 wp_register_script(
1209 'lottie-js',
1210 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/lottie' . $suffix . '.js',
1211 array( 'jquery' ),
1212 PREMIUM_ADDONS_VERSION,
1213 true
1214 );
1215
1216 wp_register_script(
1217 'pa-odometer',
1218 PREMIUM_ADDONS_URL . 'assets/frontend/min-js/odometer.min.js',
1219 array( 'jquery' ),
1220 PREMIUM_ADDONS_VERSION,
1221 true
1222 );
1223
1224 wp_register_script(
1225 'pa-tweenmax',
1226 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/TweenMax' . $suffix . '.js',
1227 array( 'jquery' ),
1228 PREMIUM_ADDONS_VERSION,
1229 true
1230 );
1231
1232 wp_register_script(
1233 'pa-draggable',
1234 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/Draggable' . $suffix . '.js',
1235 array( 'jquery' ),
1236 PREMIUM_ADDONS_VERSION,
1237 true
1238 );
1239
1240 wp_register_script(
1241 'pa-headroom',
1242 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/headroom' . $suffix . '.js',
1243 array( 'jquery' ),
1244 PREMIUM_ADDONS_VERSION
1245 );
1246
1247 wp_register_script(
1248 'pa-menu',
1249 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-nav-menu' . $suffix . '.js',
1250 array( 'jquery' ),
1251 PREMIUM_ADDONS_VERSION,
1252 true
1253 );
1254
1255 if ( $maps_settings['premium-map-cluster'] ) {
1256 wp_register_script(
1257 'pa-maps-cluster',
1258 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/markerclusterer.min.js',
1259 array(),
1260 '1.0.1',
1261 true
1262 );
1263 }
1264
1265 if ( $maps_settings['premium-map-disable-api'] && '1' !== $maps_settings['premium-map-api'] ) {
1266
1267 $locale = $maps_settings['premium-map-locale'] ?? 'en';
1268
1269 $api = sprintf( 'https://maps.googleapis.com/maps/api/js?key=%1$s&libraries=marker&callback=initMap&language=%2$s&loading=async', $maps_settings['premium-map-api'], $locale );
1270
1271 wp_register_script(
1272 'pa-maps-api',
1273 $api,
1274 array(),
1275 PREMIUM_ADDONS_VERSION,
1276 true
1277 );
1278 }
1279
1280 wp_register_script(
1281 'pa-slick',
1282 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/slick' . $suffix . '.js',
1283 array( 'jquery' ),
1284 PREMIUM_ADDONS_VERSION,
1285 true
1286 );
1287
1288 wp_register_script(
1289 'pa-flipster',
1290 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/flipster' . $suffix . '.js',
1291 array( 'jquery' ),
1292 PREMIUM_ADDONS_VERSION
1293 );
1294
1295 wp_register_script(
1296 'pa-anime',
1297 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/anime' . $suffix . '.js',
1298 array( 'jquery' ),
1299 PREMIUM_ADDONS_VERSION,
1300 true
1301 );
1302
1303 wp_register_script(
1304 'pa-feffects',
1305 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-float-effects' . $suffix . '.js',
1306 array( 'jquery' ),
1307 PREMIUM_ADDONS_VERSION,
1308 true
1309 );
1310
1311 wp_register_script(
1312 'pa-gTooltips',
1313 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-gtooltips' . $suffix . '.js',
1314 array( 'jquery' ),
1315 PREMIUM_ADDONS_VERSION,
1316 true
1317 );
1318
1319 wp_register_script(
1320 'pa-shape-divider',
1321 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-sh-divider' . $suffix . '.js',
1322 array( 'jquery' ),
1323 PREMIUM_ADDONS_VERSION,
1324 true
1325 );
1326
1327 wp_localize_script(
1328 'pa-shape-divider',
1329 'PaShapeDividerSettings',
1330 array(
1331 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ),
1332 'nonce' => wp_create_nonce( 'pa-shape-nonce' ),
1333 )
1334 );
1335
1336 wp_localize_script(
1337 'pa-gTooltips',
1338 'PremiumSettings',
1339 array(
1340 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ),
1341 'nonce' => wp_create_nonce( 'pa-blog-widget-nonce' ),
1342 )
1343 );
1344
1345 wp_register_script(
1346 'pa-eq-height',
1347 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-eq-height' . $suffix . '.js',
1348 array( 'jquery' ),
1349 PREMIUM_ADDONS_VERSION,
1350 true
1351 );
1352
1353 wp_register_script(
1354 'pa-dis-conditions',
1355 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-dis-conditions' . $suffix . '.js',
1356 array( 'jquery' ),
1357 PREMIUM_ADDONS_VERSION,
1358 true
1359 );
1360
1361 wp_register_script(
1362 'pa-gsap',
1363 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/pa-gsap' . $suffix . '.js',
1364 array( 'jquery' ),
1365 PREMIUM_ADDONS_VERSION,
1366 true
1367 );
1368
1369 wp_register_script(
1370 'pa-motionpath',
1371 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/motionpath' . $suffix . '.js',
1372 array(
1373 'jquery',
1374 ),
1375 PREMIUM_ADDONS_VERSION,
1376 true
1377 );
1378
1379 wp_register_script(
1380 'pa-scrolltrigger',
1381 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/scrollTrigger' . $suffix . '.js',
1382 array( 'jquery' ),
1383 PREMIUM_ADDONS_VERSION,
1384 true
1385 );
1386
1387 wp_register_script(
1388 'pa-notifications',
1389 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-notifications' . $suffix . '.js',
1390 array( 'jquery' ),
1391 PREMIUM_ADDONS_VERSION,
1392 true
1393 );
1394
1395 wp_register_script(
1396 'pa-luxon',
1397 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/luxon' . $suffix . '.js',
1398 array( 'jquery' ),
1399 PREMIUM_ADDONS_VERSION,
1400 true
1401 );
1402
1403 wp_register_script(
1404 'mousewheel-js',
1405 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/jquery-mousewheel' . $suffix . '.js',
1406 array( 'jquery' ),
1407 PREMIUM_ADDONS_VERSION,
1408 true
1409 );
1410
1411 wp_register_script(
1412 'pa-wrapper-link',
1413 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-wrap-link' . $suffix . '.js',
1414 array( 'jquery' ),
1415 PREMIUM_ADDONS_VERSION,
1416 true
1417 );
1418
1419 // We need to make sure premium-woocommerce.js will not be loaded twice if assets are generated.
1420 if ( class_exists( 'woocommerce' ) ) {
1421
1422 wp_register_script(
1423 'premium-woo-cats',
1424 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-woo-categories' . $suffix . '.js',
1425 array( 'jquery' ),
1426 PREMIUM_ADDONS_VERSION,
1427 true
1428 );
1429
1430 wp_register_script(
1431 'premium-mini-cart',
1432 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-mini-cart' . $suffix . '.js',
1433 array( 'jquery' ),
1434 PREMIUM_ADDONS_VERSION,
1435 true
1436 );
1437
1438 wp_register_script(
1439 'premium-woo-cart',
1440 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-woo-cart' . $suffix . '.js',
1441 array( 'jquery' ),
1442 PREMIUM_ADDONS_VERSION,
1443 true
1444 );
1445
1446 wp_register_script(
1447 'premium-woo-cta',
1448 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-woo-cta' . $suffix . '.js',
1449 array( 'jquery' ),
1450 PREMIUM_ADDONS_VERSION,
1451 true
1452 );
1453
1454 wp_register_script(
1455 'premium-woocommerce',
1456 PREMIUM_ADDONS_URL . 'assets/frontend/' . $dir . '/premium-woo-products' . $suffix . '.js',
1457 array( 'jquery' ),
1458 PREMIUM_ADDONS_VERSION,
1459 true
1460 );
1461
1462 wp_localize_script(
1463 'premium-woo-cta',
1464 'PAWooCTASettings',
1465 array(
1466 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ),
1467 'cta_nonce' => wp_create_nonce( 'pa-woo-cta-nonce' ),
1468 'view_cart' => __( 'View cart', 'woocommerce' ),
1469 'mini_cart_nonce' => wp_create_nonce( 'pa-mini-cart-nonce' ),
1470 'qv_nonce' => wp_create_nonce( 'pa-woo-qv-nonce' ),
1471 )
1472 );
1473
1474 /**
1475 * Localize the $product_added_to_cart flag to mini cart script.
1476 * The transient is deleted to be used only once.
1477 */
1478 $product_added_to_cart = get_transient( 'pa_product_added_to_cart' );
1479 if ( $product_added_to_cart ) {
1480 delete_transient( 'pa_product_added_to_cart' );
1481 }
1482
1483 wp_localize_script(
1484 'premium-mini-cart',
1485 'PAWooMCartSettings',
1486 array(
1487 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ),
1488 'cta_nonce' => wp_create_nonce( 'pa-woo-cta-nonce' ),
1489 'view_cart' => __( 'View cart', 'woocommerce' ),
1490 'mini_cart_nonce' => wp_create_nonce( 'pa-mini-cart-nonce' ),
1491 'qv_nonce' => wp_create_nonce( 'pa-woo-qv-nonce' ),
1492 'stock_msg' => __( '*The current stock is only ', 'premium-addons-for-elementor' ),
1493 'productAddedToCart' => (bool) $product_added_to_cart,
1494 )
1495 );
1496
1497 wp_localize_script(
1498 'premium-woocommerce',
1499 'PAWooProductsSettings',
1500 array(
1501 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ),
1502 'products_nonce' => wp_create_nonce( 'pa-woo-products-nonce' ),
1503 'qv_nonce' => wp_create_nonce( 'pa-woo-qv-nonce' ),
1504 'cta_nonce' => wp_create_nonce( 'pa-woo-cta-nonce' ),
1505 'woo_cart_url' => get_permalink( wc_get_page_id( 'cart' ) ),
1506 'view_cart' => __( 'View cart', 'woocommerce' ),
1507 'mini_cart_nonce' => wp_create_nonce( 'pa-mini-cart-nonce' ),
1508 )
1509 );
1510
1511 }
1512
1513 // Localize jQuery with required data for Global Add-ons.
1514 if ( $this->enabled_elements['premium-floating-effects'] ) {
1515 wp_localize_script(
1516 'pa-feffects',
1517 'PremiumFESettings',
1518 array(
1519 'papro_installed' => Helper_Functions::check_papro_version(),
1520 )
1521 );
1522 }
1523
1524 // Localize jQuery with required data for Global Add-ons.
1525 if ( $this->enabled_elements['premium-countdown'] ) {
1526
1527 wp_localize_script(
1528 'pa-countdown',
1529 'premiumCountDownStrings',
1530 array(
1531 'single' => array(
1532 __( 'Year', 'premium-addons-for-elementor' ),
1533 __( 'Month', 'premium-addons-for-elementor' ),
1534 __( 'Week', 'premium-addons-for-elementor' ),
1535 __( 'Day', 'premium-addons-for-elementor' ),
1536 __( 'Hour', 'premium-addons-for-elementor' ),
1537 __( 'Minute', 'premium-addons-for-elementor' ),
1538 __( 'Second', 'premium-addons-for-elementor' ),
1539 ),
1540 'plural' => array(
1541 __( 'Years', 'premium-addons-for-elementor' ),
1542 __( 'Months', 'premium-addons-for-elementor' ),
1543 __( 'Weeks', 'premium-addons-for-elementor' ),
1544 __( 'Days', 'premium-addons-for-elementor' ),
1545 __( 'Hours', 'premium-addons-for-elementor' ),
1546 __( 'Minutes', 'premium-addons-for-elementor' ),
1547 __( 'Seconds', 'premium-addons-for-elementor' ),
1548 ),
1549 )
1550 );
1551 }
1552 }
1553
1554 /**
1555 * Creates and returns an instance of the class.
1556 *
1557 * @since 4.6.1
1558 * @access public
1559 *
1560 * @return object
1561 */
1562 public static function get_instance( $enabled_elements, $integrations ) {
1563
1564 if ( ! isset( self::$instance ) ) {
1565
1566 self::$instance = new self( $enabled_elements, $integrations );
1567
1568 }
1569
1570 return self::$instance;
1571 }
1572 }
1573