PluginProbe
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder / 51.1.74
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder v51.1.74
51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 51.1.46 51.1.47 51.1.49 51.1.51 All 36 releases
king-addons / includes / RegisterAssets.php

RegisterAssets.php in King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder 51.1.74, at includes/RegisterAssets.php

269 lines 12.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace King_Addons;
4
5 if (!defined('ABSPATH')) {
6 exit;
7 }
8
9 final class RegisterAssets
10 {
11 private static ?RegisterAssets $_instance = null;
12
13 public static function instance(): RegisterAssets
14 {
15 if (is_null(self::$_instance)) {
16 self::$_instance = new self();
17 }
18 return self::$_instance;
19 }
20
21 public function __construct()
22 {
23 // Register styles and scripts for Elementor widgets and features
24 self::registerElementorStyles();
25 self::registerElementorScripts();
26
27 // Register Pro assets if available
28 self::registerProAssets();
29
30 // Register general files
31 self::registerLibrariesFiles();
32 }
33
34 /**
35 * Register CSS files
36 */
37 function registerElementorStyles(): void
38 {
39 foreach (ModulesMap::getModulesMapArray()['widgets'] as $widget_id => $widget_array) {
40 foreach ($widget_array['css'] as $css) {
41 wp_register_style(KING_ADDONS_ASSETS_UNIQUE_KEY . '-' . $widget_id . '-' . $css, KING_ADDONS_URL . 'includes/widgets/' . $widget_array['php-class'] . '/' . $css . '.css', null, KING_ADDONS_VERSION);
42 }
43 }
44 }
45
46 /**
47 * Register JS files
48 */
49 function registerElementorScripts(): void
50 {
51 foreach (ModulesMap::getModulesMapArray()['widgets'] as $widget_id => $widget_array) {
52 foreach ($widget_array['js'] as $js) {
53 $script_handle = KING_ADDONS_ASSETS_UNIQUE_KEY . '-' . $widget_id . '-' . $js;
54 wp_register_script($script_handle, KING_ADDONS_URL . 'includes/widgets/' . $widget_array['php-class'] . '/' . $js . '.js', array('jquery'), KING_ADDONS_VERSION, true);
55
56 // Localize script specifically for pricing-slider
57 if ($widget_id === 'pricing-slider' && $js === 'script') {
58 $localized_data = [
59 'ajax_url' => admin_url('admin-ajax.php'),
60 'view_cart_text' => esc_html__('View Cart', 'king-addons'),
61 // Note: Nonce should ideally be generated closer to where the button is rendered,
62 // but passing ajax_url here is the main fix for the AJAX call.
63 // The nonce is already passed via data attribute on the button in Pricing_Slider_Pro.php.
64 // 'nonce' => wp_create_nonce('king_addons_add_to_cart_nonce')
65 ];
66 wp_localize_script($script_handle, 'king_addons_slider_vars', $localized_data);
67 }
68
69 // Localize script for pricing-calculator
70 if ($widget_id === 'pricing-calculator' && $js === 'script') {
71 $localized_data = [
72 'ajaxurl' => admin_url('admin-ajax.php'),
73 'add_to_cart_nonce' => wp_create_nonce('king_addons_add_to_cart_nonce'),
74 'send_email_quote_nonce' => wp_create_nonce('king_addons_send_email_quote_nonce'),
75 'view_cart_text' => esc_html__('View Cart', 'king-addons')
76 ];
77 wp_localize_script($script_handle, 'king_addons_calculator_vars', $localized_data);
78 }
79
80 // Localize script for login-register-form
81 if ($widget_id === 'login-register-form' && $js === 'script') {
82 wp_localize_script($script_handle, 'king_addons_login_register_vars', [
83 'ajax_url' => admin_url('admin-ajax.php'),
84 'login_nonce' => wp_create_nonce('king_addons_login_action'),
85 'register_nonce' => wp_create_nonce('king_addons_register_action'),
86 'lostpassword_nonce' => wp_create_nonce('king_addons_lostpassword_action'),
87 'social_login_nonce' => wp_create_nonce('king_addons_social_login_action'),
88 'strings' => [
89 'loading' => esc_html__('Please wait...', 'king-addons'),
90 'login_success' => esc_html__('Login successful! Redirecting...', 'king-addons'),
91 'register_success' => esc_html__('Registration successful! Welcome!', 'king-addons'),
92 'required_fields' => esc_html__('Please fill in all required fields.', 'king-addons'),
93 'invalid_email' => esc_html__('Please enter a valid email address.', 'king-addons'),
94 'password_mismatch' => esc_html__('Passwords do not match.', 'king-addons'),
95 'network_error' => esc_html__('Network error. Please try again.', 'king-addons'),
96 ]
97 ]);
98 }
99 }
100 }
101
102 wp_localize_script(KING_ADDONS_ASSETS_UNIQUE_KEY . '-search-script', 'KingAddonsSearchData', [
103 'ajaxUrl' => admin_url('admin-ajax.php'),
104 'nonce' => wp_create_nonce('king_addons_search_nonce'),
105 ]);
106
107 wp_localize_script(KING_ADDONS_ASSETS_UNIQUE_KEY . '-mailchimp-script', 'KingAddonsMailChimpData', [
108 'ajaxUrl' => admin_url('admin-ajax.php'),
109 'nonce' => wp_create_nonce('king_addons_mailchimp_nonce'),
110 ]);
111
112 if(KING_ADDONS_WGT_FORM_BUILDER) {
113 wp_localize_script(KING_ADDONS_ASSETS_UNIQUE_KEY . '-form-builder-script', 'KingAddonsFormBuilderData', [
114 'ajaxurl' => admin_url('admin-ajax.php'),
115 // Security fix: Remove public nonce exposure - generate dynamically in AJAX handlers
116 'input_empty' => esc_html__('Please fill out this field', 'king-addons'),
117 'select_empty' => esc_html__('Nothing selected', 'king-addons'),
118 'file_empty' => esc_html__('Please upload a file', 'king-addons'),
119 'recaptcha_v3_site_key' => get_option('king_addons_recaptcha_v3_site_key'),
120 'recaptcha_error' => esc_html__('Recaptcha Error', 'king-addons'),
121 ]);
122 }
123
124 // Localize form builder script - Security fix: Remove public nonce exposure
125 if (KING_ADDONS_WGT_FORM_BUILDER) {
126 wp_localize_script(KING_ADDONS_ASSETS_UNIQUE_KEY . '-form-builder-script', 'king_addons_form_builder_vars', [
127 'ajax_url' => admin_url('admin-ajax.php'),
128 // Security fix: Remove public nonce exposure - generate dynamically in AJAX handlers
129 'required_text' => esc_html__('This field is required', 'king-addons'),
130 'email_text' => esc_html__('Enter a valid email', 'king-addons'),
131 'select_empty' => esc_html__('Nothing selected', 'king-addons'),
132 'file_empty' => esc_html__('Please upload a file', 'king-addons'),
133 'recaptcha_v3_site_key' => get_option('king_addons_recaptcha_v3_site_key'),
134 'recaptcha_error' => esc_html__('Recaptcha Error', 'king-addons'),
135 ]);
136 }
137
138 foreach (ModulesMap::getModulesMapArray()['features'] as $feature_id => $feature_array) {
139 foreach ($feature_array['js'] as $js) {
140 wp_register_script(KING_ADDONS_ASSETS_UNIQUE_KEY . '-' . $feature_id . '-' . $js, KING_ADDONS_URL . 'includes/features/' . $feature_array['php-class'] . '/' . $js . '.js', null, KING_ADDONS_VERSION);
141 }
142 }
143 }
144
145 /**
146 * Register libraries files
147 */
148 function registerLibrariesFiles(): void
149 {
150 $jquery_libraries = [
151 'grid',
152 'isotope',
153 'slick',
154 'lightgallery',
155 'infinitescroll',
156 'imagesloaded',
157 'jqueryeventmove',
158 'jquerynumerator',
159 'jarallax',
160 'flipclock',
161 'fullpage',
162 'marquee',
163 'parallax',
164 'perfectscrollbar',
165 'wpcolorpicker',
166 'aos',
167 ];
168
169 foreach (LibrariesMap::getLibrariesMapArray()['libraries'] as $library_id => $library_array) {
170 foreach ($library_array['css'] as $css) {
171 wp_register_style(KING_ADDONS_ASSETS_UNIQUE_KEY . '-' . $library_id . '-' . $css, KING_ADDONS_URL . 'includes/assets/libraries/' . $library_id . '/' . $css . '.css', null, KING_ADDONS_VERSION);
172 }
173 foreach ($library_array['js'] as $js) {
174 $dependencies = in_array($library_id, $jquery_libraries, true) ? ['jquery'] : [];
175
176 wp_register_script(
177 KING_ADDONS_ASSETS_UNIQUE_KEY . '-' . $library_id . '-' . $js,
178 KING_ADDONS_URL . 'includes/assets/libraries/' . $library_id . '/' . $js . '.js',
179 $dependencies,
180 KING_ADDONS_VERSION,
181 true
182 );
183 }
184 }
185
186 wp_localize_script(KING_ADDONS_ASSETS_UNIQUE_KEY . '-grid-grid', 'KingAddonsGridData', [
187 'ajaxUrl' => admin_url('admin-ajax.php'),
188 'nonce' => wp_create_nonce('king_addons_grid_nonce'),
189 'viewCart' => esc_html__('View Cart', 'king-addons'),
190 'addedToCartText' => esc_html__('was added to cart', 'king-addons'),
191 'comparePageURL' => get_permalink(get_option('king_addons_compare_page')),
192 'wishlistPageURL' => get_permalink(get_option('king_addons_wishlist_page')),
193 ]);
194
195 }
196 /**
197 * Register Pro widget assets when premium is available
198 */
199 function registerProAssets(): void
200 {
201 // Only register Pro assets if Freemius premium is available
202 if (
203 !function_exists('king_addons_freemius') ||
204 !king_addons_freemius()->can_use_premium_code__premium_only() ||
205 !defined('KING_ADDONS_PRO_PATH') ||
206 !defined('KING_ADDONS_PRO_URL')
207 ) {
208 return;
209 }
210
211 // In Elementor editor/preview we want instant reflection of changes,
212 // even when WP_DEBUG/SCRIPT_DEBUG are off (browser cache is aggressive).
213 $is_elementor_edit_or_preview = false;
214 if (defined('ELEMENTOR_VERSION') && class_exists('\\Elementor\\Plugin')) {
215 try {
216 $elementor = \Elementor\Plugin::$instance;
217 $is_elementor_edit_or_preview = (
218 (isset($elementor->editor) && method_exists($elementor->editor, 'is_edit_mode') && $elementor->editor->is_edit_mode())
219 || (isset($elementor->preview) && method_exists($elementor->preview, 'is_preview_mode') && $elementor->preview->is_preview_mode())
220 );
221 } catch (\Throwable $e) {
222 $is_elementor_edit_or_preview = false;
223 }
224 }
225
226 // Register Pro assets for widgets that have Pro versions
227 foreach (ModulesMap::getModulesMapArray()['widgets'] as $widget_id => $widget_array) {
228 if (empty($widget_array['has-pro'])) {
229 continue;
230 }
231
232 $widget_class = $widget_array['php-class'];
233 $pro_widget_dir = KING_ADDONS_PRO_PATH . 'includes/widgets/' . $widget_class . '_Pro/';
234
235 // Register Pro CSS if exists
236 $pro_css_path = $pro_widget_dir . 'style.css';
237 if (file_exists($pro_css_path)) {
238 $use_filemtime = $is_elementor_edit_or_preview || (defined('WP_DEBUG') && WP_DEBUG) || (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG);
239 $pro_css_ver = ($use_filemtime && function_exists('filemtime'))
240 ? (string) filemtime($pro_css_path)
241 : (defined('KING_ADDONS_PRO_VERSION') ? KING_ADDONS_PRO_VERSION : KING_ADDONS_VERSION);
242 wp_register_style(
243 KING_ADDONS_ASSETS_UNIQUE_KEY . '-' . $widget_id . '-pro-style',
244 KING_ADDONS_PRO_URL . 'includes/widgets/' . $widget_class . '_Pro/style.css',
245 null,
246 $pro_css_ver
247 );
248 }
249
250 // Register Pro JS if exists
251 $pro_js_path = $pro_widget_dir . 'script.js';
252 if (file_exists($pro_js_path)) {
253 $use_filemtime = $is_elementor_edit_or_preview || (defined('WP_DEBUG') && WP_DEBUG) || (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG);
254 $pro_js_ver = ($use_filemtime && function_exists('filemtime'))
255 ? (string) filemtime($pro_js_path)
256 : (defined('KING_ADDONS_PRO_VERSION') ? KING_ADDONS_PRO_VERSION : KING_ADDONS_VERSION);
257 wp_register_script(
258 KING_ADDONS_ASSETS_UNIQUE_KEY . '-' . $widget_id . '-pro-script',
259 KING_ADDONS_PRO_URL . 'includes/widgets/' . $widget_class . '_Pro/script.js',
260 array('jquery'),
261 $pro_js_ver,
262 true
263 );
264 }
265 }
266 }
267 }
268
269 RegisterAssets::instance();