PluginProbe
WDesignKit – AI Templates, Widget Builder & MCP Workflow / 2.6.2
WDesignKit – AI Templates, Widget Builder & MCP Workflow v2.6.2
2.6.6 2.6.5 2.6.4 2.6.3 2.6.2 2.6.1 2.6.0 2.5.5 2.5.4 2.5.3 2.5.2 2.5.1 2.5.0 2.4.0 2.3.3 2.3.2 2.3.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 All 128 releases
wdesignkit / includes / admin / class-wdkit-enqueue.php

class-wdkit-enqueue.php in WDesignKit – AI Templates, Widget Builder & MCP Workflow 2.6.2, at includes/admin/class-wdkit-enqueue.php

445 lines 15.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * This file specifically loads JavaScript and CSS dependencies.
4 *
5 * @link https://posimyth.com/
6 * @since 1.0.0
7 *
8 * @package Wdesignkit
9 */
10
11 namespace wdkit\WdKit_enqueue;
12
13 use wdkit\Wdkit_Wdesignkit;
14
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit; // Exit if accessed directly.
17 }
18
19 if ( ! class_exists( 'Wdkit_Enqueue' ) ) {
20
21 /**
22 * Here Enqueue all js and css script
23 */
24 class Wdkit_Enqueue {
25 /**
26 * Member Variable
27 *
28 * @var instance
29 */
30 private static $instance;
31
32 /**
33 * Member Variable
34 *
35 * @var staring wdkit_onbording_end
36 */
37 public $wdkit_onbording_end = 'wkit_onbording_end';
38
39 /**
40 * Initiator
41 */
42 public static function get_instance() {
43 if ( ! isset( self::$instance ) ) {
44 self::$instance = new self();
45 }
46 return self::$instance;
47 }
48
49 /**
50 * Initialize the class and set its properties.
51 *
52 * @since 1.0.0
53 */
54 public function __construct() {
55 add_action( 'admin_menu', array( $this, 'wdkit_admin_menu' ) );
56
57 add_action( 'admin_enqueue_scripts', array( $this, 'wdkit_enqueue_styles_library' ), 10 );
58
59 add_action( 'admin_enqueue_scripts', array( $this, 'wdkit_admin_scripts' ), 10, 1 );
60 add_action( 'enqueue_block_editor_assets', array( $this, 'wdkit_admin_scripts' ), 10, 1 );
61 add_action( 'enqueue_block_editor_assets', array( $this, 'wdkit_enqueue_styles' ), 10 );
62
63 // Gutenberg editor styles
64 add_action( 'enqueue_block_editor_assets', array( $this, 'wdkit_gutenberg_editor_style' ), 10 );
65
66 if ( class_exists( '\Elementor\Plugin' ) ) {
67 add_action( 'elementor/editor/before_enqueue_styles', array( $this, 'wdkit_elementor_editor_style' ) );
68 add_action( 'elementor/editor/after_enqueue_styles', array( $this, 'wdkit_elementor_hide_help_tab' ) );
69 add_action( 'elementor/preview/enqueue_styles', array( $this, 'wdkit_elementor_preview_style' ) );
70 add_action( 'elementor/editor/before_enqueue_scripts', array( $this, 'wdkit_elementor_scripts' ) );
71 }
72
73 // Bricks editor styles
74 add_action( 'wp_enqueue_scripts', array( $this, 'wdkit_bricks_editor_style' ), 10, 1 );
75 }
76
77
78 /**
79 * Enqueue the WDesignKit font library styles.
80 *
81 * This function loads the custom font styles for the WDesignKit plugin,
82 * including the icon font definitions and styling.
83 *
84 * @since 1.0.0
85 * @return void
86 */
87 public function wdkit_enqueue_styles_library() {
88 wp_enqueue_style( 'wdkit-library', WDKIT_URL . 'assets/fonts/style.css', array(), WDKIT_VERSION, false );
89 }
90
91 /**
92 * This function is used to retrieve all post types in WordPress and store them in an array.
93 *
94 * @since 1.0.0
95 */
96 public function wdkit_get_post_type_list() {
97 $args = array(
98 'public' => true,
99 'show_ui' => true,
100 );
101
102 $post_types = get_post_types( $args, 'objects' );
103 $options = array();
104 foreach ( $post_types as $post_type ) {
105 $exclude = array( 'attachment' );
106 if ( true === in_array( $post_type->name, $exclude, true ) ) {
107 continue;
108 }
109
110 if ( ! empty( $post_type->name ) && ( 'post' === $post_type->name || 'page' === $post_type->name || 'elementor_library' === $post_type->name || 'nxt_builder' === $post_type->name ) ) {
111 $options[ $post_type->name ] = $post_type->label;
112 }
113 }
114
115 return $options;
116 }
117
118 /**
119 * Get Editor Use.
120 *
121 * @since 1.0.0
122 */
123 protected function wdkit_use_editor() {
124 global $current_screen;
125
126 $editor = 'wdkit';
127
128 $action = ! empty( $_GET['action'] ) ? sanitize_key( wp_unslash( $_GET['action'] ) ) : '';
129
130 if ( $current_screen && $current_screen->is_block_editor() ) {
131
132 if ( array_key_exists( 'action', $_GET ) && isset( $action ) ) {
133 if ( 'elementor' === $action ) {
134 $editor = 'elementor';
135 } elseif ( 'edit' === $action ) {
136 $editor = 'gutenberg';
137 }
138 } else {
139 $editor = 'gutenberg';
140 }
141 } elseif ( 'elementor' === $action ) {
142 $editor = 'elementor';
143 }
144
145 return $editor;
146 }
147
148 /**
149 * Load Admin Scripts.
150 *
151 * @since 1.0.0
152 */
153 public function wdkit_elementor_scripts() {
154 $this->wdkit_admin_scripts( 'elementor' );
155 }
156
157 /**
158 * Elementor Editor Panel Style Loaded
159 */
160 public function wdkit_elementor_editor_style() {
161 wp_enqueue_style( 'wdkit-elementor-editor-css', WDKIT_URL . 'assets/css/elementor/wdkit_enqueue_editor_styles.css', array(), WDKIT_VERSION );
162
163 // Hide WDesignKit logo icon when white label is enabled
164 $white_label = get_option( 'wkit_white_label', false );
165 if ( ! empty( $white_label['help_link'] ) ) {
166 wp_add_inline_style( 'wdkit-elementor-editor-css', '.elementor-element .icon i.tpae-wdkit-logo:after { display: none !important; }' );
167 }
168 }
169
170 /**
171 * Bricks Editor Panel Style Loaded
172 */
173 public function wdkit_bricks_editor_style() {
174 // Only load in Bricks editor
175 if ( function_exists( 'bricks_is_builder' ) && bricks_is_builder() ) {
176 wp_enqueue_style( 'wdkit-bricks-editor-css', WDKIT_URL . 'assets/css/bricks/wdkit_enqueue_editor_styles.css', array(), WDKIT_VERSION );
177 // Cross-domain copy/paste for Bricks is marked "Coming Soon" — do not enqueue yet.
178
179 // Hide WDesignKit logo icon when white label is enabled
180 $white_label = get_option( 'wkit_white_label', false );
181 if ( ! empty( $white_label['help_link'] ) ) {
182 wp_add_inline_style( 'wdkit-bricks-editor-css', '.element-data .element-icon i.tpae-wdkit-logo:after { display: none !important; } .bricks-panel-controls .control-group[data-control-group*="Need"]{display:none!important;}' );
183 }
184 }
185 }
186
187 /**
188 * Gutenberg Editor Panel Style Loaded
189 */
190 public function wdkit_gutenberg_editor_style() {
191 wp_enqueue_style( 'wdkit-gutenberg-editor-css', WDKIT_URL . 'assets/css/gutenberg/wdkit_enqueue_editor_styles.css', array(), WDKIT_VERSION );
192 $this->wdkit_cross_copy_paste_script( 'gutenberg' );
193
194 // Hide WDesignKit logo icon + Need Help panel when white label is enabled
195 $white_label = get_option( 'wkit_white_label', false );
196 if ( ! empty( $white_label['help_link'] ) ) {
197 wp_add_inline_style( 'wdkit-gutenberg-editor-css', '.block-editor-block-types-list__list-item .block-editor-block-icon i.tpae-wdkit-logo:after, .tpgb-head-panel-tabs .components-panel__body.wdkit-panel-need-help { display: none !important; }' );
198 }
199 }
200
201 /**
202 * Elementor Preview Style Loaded
203 *
204 * @since 1.0.0
205 */
206 public function wdkit_elementor_preview_style() {
207 wp_enqueue_style( 'wdkit-elementor-editor-css', WDKIT_URL . 'assets/css/elementor/wdkit_enqueue_preview_styles.css', array(), WDKIT_VERSION );
208 }
209
210 /**
211 * Enqueue Scripts admin area.
212 *
213 * @since 1.0.0
214 *
215 * @param string $hook use for check page type.
216 */
217 public function wdkit_admin_scripts( $hook ) {
218
219 wp_enqueue_style( 'wdkit-library-preview', WDKIT_URL . 'assets/fonts/style.css', array(), WDKIT_VERSION, false );
220 wp_enqueue_style( 'wdkit-out-dashborad', WDKIT_URL . 'assets/css/dashborad/wdkit-dashborad.css', array(), WDKIT_VERSION, false );
221
222 $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';
223 $ptype = isset( $_GET['post_type'] ) ? sanitize_key( wp_unslash( $_GET['post_type'] ) ) : '';
224
225 // Check if we're on a Nexter Extension page
226 $is_nexter_page = isset( $_GET['page'] ) && sanitize_key( wp_unslash( $_GET['page'] ) ) === 'nxt_code_snippets';
227
228 // Check if we're on a Theme Builder page (via post_type or page parameter)
229 $is_theme_builder_page = ( isset( $_GET['post_type'] ) && sanitize_key( wp_unslash( $_GET['post_type'] ) ) === 'nxt_builder' ) || ( isset( $_GET['page'] ) && sanitize_key( wp_unslash( $_GET['page'] ) ) === 'nxt_builder' );
230
231 if ( ! in_array( $hook, array( 'toplevel_page_wdesign-kit', 'elementor', 'post-new.php', 'post.php' ), true ) && !$is_nexter_page && !$is_theme_builder_page ) {
232 return;
233 }
234
235 wp_enqueue_media();
236
237 $this->wdkit_enqueue_scripts( $hook );
238 $this->wdkit_enqueue_styles();
239 }
240
241 /**
242 * Enqueue Styles admin area.
243 *
244 * @since 1.0.0
245 */
246 public function wdkit_enqueue_styles() {
247 wp_enqueue_style( 'wdkit-editor-css', WDKIT_URL . 'build/index.css', array(), WDKIT_VERSION );
248
249 /**
250 * The build emits a right-to-left stylesheet (build/index-rtl.css) because the
251 * source CSS uses physical left/right properties. WordPress does not auto-load
252 * the -rtl variant; registering it here makes core swap in index-rtl.css on RTL
253 * locales (Arabic, Hebrew, Farsi, Urdu) so the admin layout mirrors correctly.
254 */
255 wp_style_add_data( 'wdkit-editor-css', 'rtl', 'replace' );
256 }
257
258 /**
259 * Register the JavaScript for the admin area.
260 *
261 * @param string $hook give builder name.
262 * @since 1.0.0
263 */
264 public function wdkit_enqueue_scripts( $hook ) {
265 $asset_file = WDKIT_PATH . 'build/index.min.asset.php';
266 $asset = file_exists( $asset_file ) ? require $asset_file : array( 'dependencies' => array( 'wp-i18n', 'wp-element', 'wp-components' ), 'version' => WDKIT_VERSION );
267
268 /**
269 * JS translations catalog.
270 *
271 * The app ships as a large minified bundle (build/index.min.js) which
272 * `wp i18n make-pot` skips (all *.min.js are skipped) and could not parse
273 * within WordPress.org's budget anyway. build/wdk-i18n-strings.js is a
274 * small, readable catalog of every translatable JS string (generated from
275 * src/ by bin/generate-i18n-strings.js). WordPress.org extracts strings
276 * from it and builds the per-locale JSON keyed to this handle; loading it
277 * here populates the shared wp.i18n store so the whole React app is
278 * translated. It is a dependency of the app bundle so it (and its inline
279 * translation data) load first.
280 */
281 $script_deps = $asset['dependencies'];
282 if ( file_exists( WDKIT_PATH . 'build/wdk-i18n-strings.js' ) ) {
283 wp_enqueue_script( 'wdkit-editor-i18n', WDKIT_URL . 'build/wdk-i18n-strings.js', array( 'wp-i18n' ), $asset['version'], true );
284 wp_set_script_translations( 'wdkit-editor-i18n', 'wdesignkit' );
285 $script_deps = array_merge( $script_deps, array( 'wdkit-editor-i18n' ) );
286 }
287
288 wp_enqueue_script( 'wdkit-editor-js', WDKIT_URL . 'build/index.min.js', $script_deps, $asset['version'], true );
289 wp_set_script_translations( 'wdkit-editor-js', 'wdesignkit' );
290
291 $onbording_end = get_option( $this->wdkit_onbording_end );
292 $white_label = get_option( 'wkit_white_label', false );
293 $dark_mode = get_option( 'wdkit_dark_mode', 'light' );
294
295 wp_localize_script(
296 'wdkit-editor-js',
297 'wdkitData',
298 array(
299 'ajax_url' => admin_url( 'admin-ajax.php' ),
300 'WDKIT_URL' => WDKIT_URL,
301 'WDKIT_ASSETS' => WDKIT_ASSETS,
302 'wdkit_server_url' => WDKIT_SERVER_SITE_URL,
303 'wdkit_site_api_url' => WDKIT_SERVER_API_URL,
304 'wdkit_wp_version' => get_bloginfo( 'version' ),
305 'home_url' => esc_url( home_url( '/' ) ),
306 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
307 'post_id' => get_the_ID(),
308 'post_type' => get_post_type(),
309 'text_domain' => WDKIT_TEXT_DOMAIN,
310 'use_editor' => $this->wdkit_use_editor(),
311 'post_type_list' => $this->wdkit_get_post_type_list(),
312 'WDKIT_onbording_end' => $onbording_end,
313 'wdkit_white_label' => $white_label,
314 'WDKIT_dark_mode' => $dark_mode,
315 /** Widget Builder — public URL only, no server filesystem paths */
316 'WDKIT_SITE_URL' => WDKIT_GET_SITE_URL,
317 'WDKIT_DOC_URL' => WDKIT_DOCUMENT,
318 'WDKIT_SERVER_PATH' => WDKIT_SERVER_PATH,
319 'WDKIT_VERSION' => WDKIT_VERSION,
320
321 'gutenberg_template' => Wdkit_Wdesignkit::wdkit_is_compatible( 'gutenberg_template', 'template' )
322 )
323 );
324
325 /**Ace Editor files for Widget-builder */
326 if ( 'toplevel_page_wdesign-kit' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'builder', 'widget' ) ) {
327 wp_enqueue_script( 'widgetBuilder-script-editor-js', WDKIT_URL . 'assets/js/extra/ace.min.js', array( 'wp-element' ), WDKIT_VERSION, true );
328 wp_enqueue_script( 'widgetBuilder-script-editor-cobalt', WDKIT_URL . 'assets/js/extra/theme-cobalt.js', array( 'wp-element' ), WDKIT_VERSION, true );
329 wp_enqueue_script( 'widgetBuilder-script-editor-html', WDKIT_URL . 'assets/js/extra/mode-html.js', array( 'wp-element' ), WDKIT_VERSION, true );
330 }
331
332 if ( 'elementor' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'elementor_template', 'template' ) ) {
333 wp_enqueue_script( 'wdkit-frontend-editor', WDKIT_ASSETS . 'js/main/elementor/elementor-editor.js', array( 'jquery', 'wp-i18n' ), WDKIT_VERSION, true );
334 wp_set_script_translations( 'wdkit-frontend-editor', 'wdesignkit' );
335 $this->wdkit_cross_copy_paste_script( 'elementor' );
336 }
337 }
338
339 /**
340 * Enqueue cross-domain copy/paste support for active builders.
341 *
342 * @since 1.0.0
343 */
344 public function wdkit_cross_copy_paste_script( $builder = '' ) {
345 $settings = get_option( 'wkit_settings_panel', array() );
346 $enabled = array(
347 'elementor' => ! empty( $settings['cross_copy_paste_elementor'] ) || ! empty( $settings['cross_copy_paste'] ),
348 'gutenberg' => ! empty( $settings['cross_copy_paste_gutenberg'] ) || ! empty( $settings['cross_copy_paste'] ),
349 // Bricks support is "Coming Soon" — force-disabled regardless of saved setting.
350 'bricks' => false,
351 );
352
353 if ( empty( array_filter( $enabled ) ) ) {
354 return;
355 }
356
357 if ( ! empty( $builder ) && empty( $enabled[ $builder ] ) ) {
358 return;
359 }
360
361 if ( wp_script_is( 'wdkit-cross-copy-paste', 'enqueued' ) ) {
362 return;
363 }
364
365 $deps = array( 'wp-i18n' );
366 // Gutenberg SlotFill needs these so the block toolbar's
367 // "Options" menu can host our "WDesignKit Copy / Paste" items.
368 if ( ! empty( $enabled['gutenberg'] ) ) {
369 $deps[] = 'wp-plugins';
370 $deps[] = 'wp-element';
371 $deps[] = 'wp-components';
372 $deps[] = 'wp-block-editor';
373 $deps[] = 'wp-data';
374 $deps[] = 'wp-blocks';
375 $deps[] = 'wp-dom-ready';
376 }
377
378 wp_enqueue_script( 'wdkit-cross-copy-paste', WDKIT_ASSETS . 'js/main/wdkit-cross-copy-paste.js', $deps, WDKIT_VERSION, true );
379 wp_set_script_translations( 'wdkit-cross-copy-paste', 'wdesignkit' );
380 wp_localize_script(
381 'wdkit-cross-copy-paste',
382 'wdkitCrossCopyPaste',
383 array(
384 'enabled' => true,
385 'version' => WDKIT_VERSION,
386 'site' => esc_url( home_url( '/' ) ),
387 'builders' => $enabled,
388 // Direct AJAX access — the editor pages don't always
389 // load the dashboard wdkitData global. Needed for the
390 // wdkit_cp_check_widgets endpoint.
391 'ajax_url' => admin_url( 'admin-ajax.php' ),
392 // WDesignKit dashboard (hash-router) page. Missing widgets
393 // are installed by loading its /create/widget/:w_unique
394 // route inside a hidden iframe.
395 'dashboard_url' => admin_url( 'admin.php?page=wdesign-kit' ),
396 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
397 )
398 );
399 }
400
401 /**
402 * Add Menu Page WdKit.
403 *
404 * @since 1.0.0
405 */
406 public function wdkit_admin_menu() {
407 $capability = 'manage_options';
408
409 $options = get_option( 'wkit_white_label' );
410 $setting_name = ! empty( $options['plugin_name'] ) ? $options['plugin_name'] : __( 'WDesignKit', 'wdesignkit' );
411 $setting_logo = ! empty( $options['plugin_logo'] ) ? $options['plugin_logo'] : WDKIT_ASSETS . 'images/svg/logo-icon.svg';
412
413 if ( current_user_can( $capability ) ) {
414 $hook = add_menu_page( $setting_name, $setting_name, 'manage_options', 'wdesign-kit', array( $this, 'wdkit_menu_page_template' ), $setting_logo, 67 );
415 }
416 }
417
418 /**
419 * Load wdkit page content.
420 *
421 * @since 1.0.0
422 */
423 public function wdkit_menu_page_template() {
424 echo '<div id="wdesignkit-app"></div>';
425 }
426
427 /**
428 * Hide "Need Help" tab in Elementor widgets section when white label is enabled
429 *
430 * @since 2.2.4
431 */
432 public function wdkit_elementor_hide_help_tab() {
433 $white_label = get_option( 'wkit_white_label', false );
434
435 if ( ! empty( $white_label['help_link'] ) ) {
436 wp_add_inline_style(
437 'elementor-editor',
438 '.elementor-control.elementor-control-Need.Help.elementor-control-type-section{display:none!important;}'
439 );
440 }
441 }
442 }
443
444 Wdkit_Enqueue::get_instance();
445 }