PluginProbe
WDesignKit – AI Templates, Widget Builder & MCP Workflow / 2.6.4
WDesignKit – AI Templates, Widget Builder & MCP Workflow v2.6.4
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.4, at includes/admin/class-wdkit-enqueue.php

467 lines 17.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( $hook = '' ) {
88 // Hooked on admin_enqueue_scripts with no screen check at all, so this loaded the icon
89 // font on every wp-admin screen (ClickUp 86d41cnze). admin_enqueue_scripts passes the
90 // screen hook as its first argument, so the same guard wdkit_admin_scripts() uses can
91 // apply here. Kept as a separate handle from 'wdkit-library-preview' — both point at the
92 // same stylesheet, and deduplicating the handles is a separate change.
93 $is_nexter_page = isset( $_GET['page'] ) && sanitize_key( wp_unslash( $_GET['page'] ) ) === 'nxt_code_snippets';
94 $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' );
95
96 if ( ! in_array( $hook, array( 'toplevel_page_wdesign-kit', 'elementor', 'post-new.php', 'post.php' ), true ) && ! $is_nexter_page && ! $is_theme_builder_page ) {
97 return;
98 }
99
100 wp_enqueue_style( 'wdkit-library', WDKIT_URL . 'assets/fonts/style.css', array(), WDKIT_VERSION, false );
101 }
102
103 /**
104 * This function is used to retrieve all post types in WordPress and store them in an array.
105 *
106 * @since 1.0.0
107 */
108 public function wdkit_get_post_type_list() {
109 $args = array(
110 'public' => true,
111 'show_ui' => true,
112 );
113
114 $post_types = get_post_types( $args, 'objects' );
115 $options = array();
116 foreach ( $post_types as $post_type ) {
117 $exclude = array( 'attachment' );
118 if ( true === in_array( $post_type->name, $exclude, true ) ) {
119 continue;
120 }
121
122 if ( ! empty( $post_type->name ) && ( 'post' === $post_type->name || 'page' === $post_type->name || 'elementor_library' === $post_type->name || 'nxt_builder' === $post_type->name ) ) {
123 $options[ $post_type->name ] = $post_type->label;
124 }
125 }
126
127 return $options;
128 }
129
130 /**
131 * Get Editor Use.
132 *
133 * @since 1.0.0
134 */
135 protected function wdkit_use_editor() {
136 global $current_screen;
137
138 $editor = 'wdkit';
139
140 $action = ! empty( $_GET['action'] ) ? sanitize_key( wp_unslash( $_GET['action'] ) ) : '';
141
142 if ( $current_screen && $current_screen->is_block_editor() ) {
143
144 if ( array_key_exists( 'action', $_GET ) && isset( $action ) ) {
145 if ( 'elementor' === $action ) {
146 $editor = 'elementor';
147 } elseif ( 'edit' === $action ) {
148 $editor = 'gutenberg';
149 }
150 } else {
151 $editor = 'gutenberg';
152 }
153 } elseif ( 'elementor' === $action ) {
154 $editor = 'elementor';
155 }
156
157 return $editor;
158 }
159
160 /**
161 * Load Admin Scripts.
162 *
163 * @since 1.0.0
164 */
165 public function wdkit_elementor_scripts() {
166 $this->wdkit_admin_scripts( 'elementor' );
167 }
168
169 /**
170 * Elementor Editor Panel Style Loaded
171 */
172 public function wdkit_elementor_editor_style() {
173 wp_enqueue_style( 'wdkit-elementor-editor-css', WDKIT_URL . 'assets/css/elementor/wdkit_enqueue_editor_styles.css', array(), WDKIT_VERSION );
174
175 // Hide WDesignKit logo icon when white label is enabled
176 $white_label = get_option( 'wkit_white_label', false );
177 if ( ! empty( $white_label['help_link'] ) ) {
178 wp_add_inline_style( 'wdkit-elementor-editor-css', '.elementor-element .icon i.tpae-wdkit-logo:after { display: none !important; }' );
179 }
180 }
181
182 /**
183 * Bricks Editor Panel Style Loaded
184 */
185 public function wdkit_bricks_editor_style() {
186 // Only load in Bricks editor
187 if ( function_exists( 'bricks_is_builder' ) && bricks_is_builder() ) {
188 wp_enqueue_style( 'wdkit-bricks-editor-css', WDKIT_URL . 'assets/css/bricks/wdkit_enqueue_editor_styles.css', array(), WDKIT_VERSION );
189 // Cross-domain copy/paste for Bricks is marked "Coming Soon" — do not enqueue yet.
190
191 // Hide WDesignKit logo icon when white label is enabled
192 $white_label = get_option( 'wkit_white_label', false );
193 if ( ! empty( $white_label['help_link'] ) ) {
194 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;}' );
195 }
196 }
197 }
198
199 /**
200 * Gutenberg Editor Panel Style Loaded
201 */
202 public function wdkit_gutenberg_editor_style() {
203 wp_enqueue_style( 'wdkit-gutenberg-editor-css', WDKIT_URL . 'assets/css/gutenberg/wdkit_enqueue_editor_styles.css', array(), WDKIT_VERSION );
204 $this->wdkit_cross_copy_paste_script( 'gutenberg' );
205
206 // Hide WDesignKit logo icon + Need Help panel when white label is enabled
207 $white_label = get_option( 'wkit_white_label', false );
208 if ( ! empty( $white_label['help_link'] ) ) {
209 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; }' );
210 }
211 }
212
213 /**
214 * Elementor Preview Style Loaded
215 *
216 * @since 1.0.0
217 */
218 public function wdkit_elementor_preview_style() {
219 wp_enqueue_style( 'wdkit-elementor-editor-css', WDKIT_URL . 'assets/css/elementor/wdkit_enqueue_preview_styles.css', array(), WDKIT_VERSION );
220 }
221
222 /**
223 * Enqueue Scripts admin area.
224 *
225 * @since 1.0.0
226 *
227 * @param string $hook use for check page type.
228 */
229 public function wdkit_admin_scripts( $hook ) {
230
231 // Deliberately BEFORE the screen guard below: this 1.4 KB stylesheet contains nothing but
232 // #adminmenu rules for the WDesignKit menu item, and the admin menu is rendered on every
233 // admin screen. Gating it to WDesignKit's own screens leaves the menu icon unstyled
234 // everywhere else — the masked-SVG ::before never applies, so the raw <img> shows through.
235 // Do not "optimise" this into the guard (ClickUp 86d41cnze).
236 wp_enqueue_style( 'wdkit-out-dashborad', WDKIT_URL . 'assets/css/dashborad/wdkit-dashborad.css', array(), WDKIT_VERSION, false );
237
238 $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';
239 $ptype = isset( $_GET['post_type'] ) ? sanitize_key( wp_unslash( $_GET['post_type'] ) ) : '';
240
241 // Check if we're on a Nexter Extension page
242 $is_nexter_page = isset( $_GET['page'] ) && sanitize_key( wp_unslash( $_GET['page'] ) ) === 'nxt_code_snippets';
243
244 // Check if we're on a Theme Builder page (via post_type or page parameter)
245 $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' );
246
247 if ( ! in_array( $hook, array( 'toplevel_page_wdesign-kit', 'elementor', 'post-new.php', 'post.php' ), true ) && !$is_nexter_page && !$is_theme_builder_page ) {
248 return;
249 }
250
251 // Moved BELOW the screen guard: this is the 9 KB WDesignKit icon font, used only by
252 // WDesignKit's own UI (no #adminmenu rules in it), yet it was enqueued on every wp-admin
253 // screen — dashboard, posts list, media library, plugins page (ClickUp 86d41cnze).
254 // The admin-menu stylesheet is NOT gated here; see the note at the top of this method.
255 wp_enqueue_style( 'wdkit-library-preview', WDKIT_URL . 'assets/fonts/style.css', array(), WDKIT_VERSION, false );
256
257 wp_enqueue_media();
258
259 $this->wdkit_enqueue_scripts( $hook );
260 $this->wdkit_enqueue_styles();
261 }
262
263 /**
264 * Enqueue Styles admin area.
265 *
266 * @since 1.0.0
267 */
268 public function wdkit_enqueue_styles() {
269 wp_enqueue_style( 'wdkit-editor-css', WDKIT_URL . 'build/index.css', array(), WDKIT_VERSION );
270
271 /**
272 * The build emits a right-to-left stylesheet (build/index-rtl.css) because the
273 * source CSS uses physical left/right properties. WordPress does not auto-load
274 * the -rtl variant; registering it here makes core swap in index-rtl.css on RTL
275 * locales (Arabic, Hebrew, Farsi, Urdu) so the admin layout mirrors correctly.
276 */
277 wp_style_add_data( 'wdkit-editor-css', 'rtl', 'replace' );
278 }
279
280 /**
281 * Register the JavaScript for the admin area.
282 *
283 * @param string $hook give builder name.
284 * @since 1.0.0
285 */
286 public function wdkit_enqueue_scripts( $hook ) {
287 $asset_file = WDKIT_PATH . 'build/index.min.asset.php';
288 $asset = file_exists( $asset_file ) ? require $asset_file : array( 'dependencies' => array( 'wp-i18n', 'wp-element', 'wp-components' ), 'version' => WDKIT_VERSION );
289
290 /**
291 * JS translations catalog.
292 *
293 * The app ships as a large minified bundle (build/index.min.js) which
294 * `wp i18n make-pot` skips (all *.min.js are skipped) and could not parse
295 * within WordPress.org's budget anyway. build/wdk-i18n-strings.js is a
296 * small, readable catalog of every translatable JS string (generated from
297 * src/ by bin/generate-i18n-strings.js). WordPress.org extracts strings
298 * from it and builds the per-locale JSON keyed to this handle; loading it
299 * here populates the shared wp.i18n store so the whole React app is
300 * translated. It is a dependency of the app bundle so it (and its inline
301 * translation data) load first.
302 */
303 $script_deps = $asset['dependencies'];
304 if ( file_exists( WDKIT_PATH . 'build/wdk-i18n-strings.js' ) ) {
305 wp_enqueue_script( 'wdkit-editor-i18n', WDKIT_URL . 'build/wdk-i18n-strings.js', array( 'wp-i18n' ), $asset['version'], array( 'in_footer' => true, 'strategy' => 'defer' ) );
306 wp_set_script_translations( 'wdkit-editor-i18n', 'wdesignkit' );
307 $script_deps = array_merge( $script_deps, array( 'wdkit-editor-i18n' ) );
308 }
309
310 wp_enqueue_script( 'wdkit-editor-js', WDKIT_URL . 'build/index.min.js', $script_deps, $asset['version'], array( 'in_footer' => true, 'strategy' => 'defer' ) );
311 wp_set_script_translations( 'wdkit-editor-js', 'wdesignkit' );
312
313 $onbording_end = get_option( $this->wdkit_onbording_end );
314 $white_label = get_option( 'wkit_white_label', false );
315 $dark_mode = get_option( 'wdkit_dark_mode', 'light' );
316
317 wp_localize_script(
318 'wdkit-editor-js',
319 'wdkitData',
320 array(
321 'ajax_url' => admin_url( 'admin-ajax.php' ),
322 'WDKIT_URL' => WDKIT_URL,
323 'WDKIT_ASSETS' => WDKIT_ASSETS,
324 'wdkit_server_url' => WDKIT_SERVER_SITE_URL,
325 'wdkit_site_api_url' => WDKIT_SERVER_API_URL,
326 'wdkit_wp_version' => get_bloginfo( 'version' ),
327 'home_url' => esc_url( home_url( '/' ) ),
328 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
329 'post_id' => get_the_ID(),
330 'post_type' => get_post_type(),
331 'text_domain' => WDKIT_TEXT_DOMAIN,
332 'use_editor' => $this->wdkit_use_editor(),
333 'post_type_list' => $this->wdkit_get_post_type_list(),
334 'WDKIT_onbording_end' => $onbording_end,
335 'wdkit_white_label' => $white_label,
336 'WDKIT_dark_mode' => $dark_mode,
337 /** Widget Builder — public URL only, no server filesystem paths */
338 'WDKIT_SITE_URL' => WDKIT_GET_SITE_URL,
339 'WDKIT_DOC_URL' => WDKIT_DOCUMENT,
340 'WDKIT_SERVER_PATH' => WDKIT_SERVER_PATH,
341 'WDKIT_VERSION' => WDKIT_VERSION,
342
343 'gutenberg_template' => Wdkit_Wdesignkit::wdkit_is_compatible( 'gutenberg_template', 'template' )
344 )
345 );
346
347 /**Ace Editor files for Widget-builder */
348 if ( 'toplevel_page_wdesign-kit' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'builder', 'widget' ) ) {
349 wp_enqueue_script( 'widgetBuilder-script-editor-js', WDKIT_URL . 'assets/js/extra/ace.min.js', array( 'wp-element' ), WDKIT_VERSION, array( 'in_footer' => true, 'strategy' => 'defer' ) );
350 wp_enqueue_script( 'widgetBuilder-script-editor-cobalt', WDKIT_URL . 'assets/js/extra/theme-cobalt.js', array( 'wp-element' ), WDKIT_VERSION, array( 'in_footer' => true, 'strategy' => 'defer' ) );
351 wp_enqueue_script( 'widgetBuilder-script-editor-html', WDKIT_URL . 'assets/js/extra/mode-html.js', array( 'wp-element' ), WDKIT_VERSION, array( 'in_footer' => true, 'strategy' => 'defer' ) );
352 }
353
354 if ( 'elementor' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'elementor_template', 'template' ) ) {
355 wp_enqueue_script( 'wdkit-frontend-editor', WDKIT_ASSETS . 'js/main/elementor/elementor-editor.js', array( 'jquery', 'wp-i18n' ), WDKIT_VERSION, array( 'in_footer' => true, 'strategy' => 'defer' ) );
356 wp_set_script_translations( 'wdkit-frontend-editor', 'wdesignkit' );
357 $this->wdkit_cross_copy_paste_script( 'elementor' );
358 }
359 }
360
361 /**
362 * Enqueue cross-domain copy/paste support for active builders.
363 *
364 * @since 1.0.0
365 */
366 public function wdkit_cross_copy_paste_script( $builder = '' ) {
367 $settings = get_option( 'wkit_settings_panel', array() );
368 $enabled = array(
369 'elementor' => ! empty( $settings['cross_copy_paste_elementor'] ) || ! empty( $settings['cross_copy_paste'] ),
370 'gutenberg' => ! empty( $settings['cross_copy_paste_gutenberg'] ) || ! empty( $settings['cross_copy_paste'] ),
371 // Bricks support is "Coming Soon" — force-disabled regardless of saved setting.
372 'bricks' => false,
373 );
374
375 if ( empty( array_filter( $enabled ) ) ) {
376 return;
377 }
378
379 if ( ! empty( $builder ) && empty( $enabled[ $builder ] ) ) {
380 return;
381 }
382
383 if ( wp_script_is( 'wdkit-cross-copy-paste', 'enqueued' ) ) {
384 return;
385 }
386
387 $deps = array( 'wp-i18n' );
388 // Gutenberg SlotFill needs these so the block toolbar's
389 // "Options" menu can host our "WDesignKit Copy / Paste" items.
390 if ( ! empty( $enabled['gutenberg'] ) ) {
391 $deps[] = 'wp-plugins';
392 $deps[] = 'wp-element';
393 $deps[] = 'wp-components';
394 $deps[] = 'wp-block-editor';
395 $deps[] = 'wp-data';
396 $deps[] = 'wp-blocks';
397 $deps[] = 'wp-dom-ready';
398 }
399
400 wp_enqueue_script( 'wdkit-cross-copy-paste', WDKIT_ASSETS . 'js/main/wdkit-cross-copy-paste.js', $deps, WDKIT_VERSION, array( 'in_footer' => true, 'strategy' => 'defer' ) );
401 wp_set_script_translations( 'wdkit-cross-copy-paste', 'wdesignkit' );
402 wp_localize_script(
403 'wdkit-cross-copy-paste',
404 'wdkitCrossCopyPaste',
405 array(
406 'enabled' => true,
407 'version' => WDKIT_VERSION,
408 'site' => esc_url( home_url( '/' ) ),
409 'builders' => $enabled,
410 // Direct AJAX access — the editor pages don't always
411 // load the dashboard wdkitData global. Needed for the
412 // wdkit_cp_check_widgets endpoint.
413 'ajax_url' => admin_url( 'admin-ajax.php' ),
414 // WDesignKit dashboard (hash-router) page. Missing widgets
415 // are installed by loading its /create/widget/:w_unique
416 // route inside a hidden iframe.
417 'dashboard_url' => admin_url( 'admin.php?page=wdesign-kit' ),
418 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
419 )
420 );
421 }
422
423 /**
424 * Add Menu Page WdKit.
425 *
426 * @since 1.0.0
427 */
428 public function wdkit_admin_menu() {
429 $capability = 'manage_options';
430
431 $options = get_option( 'wkit_white_label' );
432 $setting_name = ! empty( $options['plugin_name'] ) ? $options['plugin_name'] : __( 'WDesignKit', 'wdesignkit' );
433 $setting_logo = ! empty( $options['plugin_logo'] ) ? $options['plugin_logo'] : WDKIT_ASSETS . 'images/svg/logo-icon.svg';
434
435 if ( current_user_can( $capability ) ) {
436 $hook = add_menu_page( $setting_name, $setting_name, 'manage_options', 'wdesign-kit', array( $this, 'wdkit_menu_page_template' ), $setting_logo, 67 );
437 }
438 }
439
440 /**
441 * Load wdkit page content.
442 *
443 * @since 1.0.0
444 */
445 public function wdkit_menu_page_template() {
446 echo '<div id="wdesignkit-app"></div>';
447 }
448
449 /**
450 * Hide "Need Help" tab in Elementor widgets section when white label is enabled
451 *
452 * @since 2.2.4
453 */
454 public function wdkit_elementor_hide_help_tab() {
455 $white_label = get_option( 'wkit_white_label', false );
456
457 if ( ! empty( $white_label['help_link'] ) ) {
458 wp_add_inline_style(
459 'elementor-editor',
460 '.elementor-control.elementor-control-Need.Help.elementor-control-type-section{display:none!important;}'
461 );
462 }
463 }
464 }
465
466 Wdkit_Enqueue::get_instance();
467 }