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

505 lines 20.3 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 * Data Sharing switcher, Settings panel.
347 *
348 * Read as a SITE option — the consent is one answer per install, not per blog. The
349 * class guard matches the one in wdesignkit.php: on a white-labelled install, or when
350 * a sibling POSIMYTH plugin's SDK copy won the loader, the tracker class is never
351 * declared and the constant reference would fatal.
352 *
353 * Both references are root-namespaced. This file lives in wdkit\WdKit_enqueue while
354 * the SDK class is declared in the global namespace: a string class name is always
355 * global so the guard passed either way, but an unprefixed `Posimyth_Tracker_WDK::`
356 * resolves against THIS namespace and fatals on every admin page load.
357 */
358 'wdkit_data_sharing' => class_exists( '\Posimyth_Tracker_WDK' ) ? (bool) get_site_option( \Posimyth_Tracker_WDK::OPT_IN_OPTION, false ) : false,
359 'wdkit_consent_nonce' => wp_create_nonce( 'posimyth_consent_wdk' ),
360
361 /**
362 * Whether the Data Sharing card may be shown at all.
363 *
364 * Tracks the tracker class rather than the white-label flag: a rebranded install now
365 * keeps the feature (see wdesignkit.php), so this is false only when the SDK genuinely
366 * failed to load — a sibling POSIMYTH plugin winning the loader with a diverged copy.
367 * Rendering a switch in that case would offer a save with no handler behind it.
368 *
369 * Separate from wdkit_data_sharing on purpose: that one is false both when sharing is
370 * off and when the feature is absent, which cannot tell the two apart.
371 */
372 'wdkit_data_sharing_available' => class_exists( '\Posimyth_Tracker_WDK' ),
373
374 /**
375 * Reseller's product name, for the Data Sharing copy that would otherwise say
376 * "WDesignKit" on a plugin they have rebranded as their own.
377 */
378 'wdkit_data_sharing_name' => ! empty( $white_label['plugin_name'] ) ? $white_label['plugin_name'] : 'WDesignKit',
379
380 /** help_link is the reseller's "hide POSIMYTH documentation links" switch. */
381 'wdkit_data_sharing_docs' => empty( $white_label['help_link'] ) ? WDKIT_DOCUMENT . 'data-sharing/' : ''
382 )
383 );
384
385 /**Ace Editor files for Widget-builder */
386 if ( 'toplevel_page_wdesign-kit' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'builder', 'widget' ) ) {
387 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' ) );
388 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' ) );
389 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' ) );
390 }
391
392 if ( 'elementor' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'elementor_template', 'template' ) ) {
393 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' ) );
394 wp_set_script_translations( 'wdkit-frontend-editor', 'wdesignkit' );
395 $this->wdkit_cross_copy_paste_script( 'elementor' );
396 }
397 }
398
399 /**
400 * Enqueue cross-domain copy/paste support for active builders.
401 *
402 * @since 1.0.0
403 */
404 public function wdkit_cross_copy_paste_script( $builder = '' ) {
405 $settings = get_option( 'wkit_settings_panel', array() );
406 $enabled = array(
407 'elementor' => ! empty( $settings['cross_copy_paste_elementor'] ) || ! empty( $settings['cross_copy_paste'] ),
408 'gutenberg' => ! empty( $settings['cross_copy_paste_gutenberg'] ) || ! empty( $settings['cross_copy_paste'] ),
409 // Bricks support is "Coming Soon" — force-disabled regardless of saved setting.
410 'bricks' => false,
411 );
412
413 if ( empty( array_filter( $enabled ) ) ) {
414 return;
415 }
416
417 if ( ! empty( $builder ) && empty( $enabled[ $builder ] ) ) {
418 return;
419 }
420
421 if ( wp_script_is( 'wdkit-cross-copy-paste', 'enqueued' ) ) {
422 return;
423 }
424
425 $deps = array( 'wp-i18n' );
426 // Gutenberg SlotFill needs these so the block toolbar's
427 // "Options" menu can host our "WDesignKit Copy / Paste" items.
428 if ( ! empty( $enabled['gutenberg'] ) ) {
429 $deps[] = 'wp-plugins';
430 $deps[] = 'wp-element';
431 $deps[] = 'wp-components';
432 $deps[] = 'wp-block-editor';
433 $deps[] = 'wp-data';
434 $deps[] = 'wp-blocks';
435 $deps[] = 'wp-dom-ready';
436 }
437
438 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' ) );
439 wp_set_script_translations( 'wdkit-cross-copy-paste', 'wdesignkit' );
440 wp_localize_script(
441 'wdkit-cross-copy-paste',
442 'wdkitCrossCopyPaste',
443 array(
444 'enabled' => true,
445 'version' => WDKIT_VERSION,
446 'site' => esc_url( home_url( '/' ) ),
447 'builders' => $enabled,
448 // Direct AJAX access — the editor pages don't always
449 // load the dashboard wdkitData global. Needed for the
450 // wdkit_cp_check_widgets endpoint.
451 'ajax_url' => admin_url( 'admin-ajax.php' ),
452 // WDesignKit dashboard (hash-router) page. Missing widgets
453 // are installed by loading its /create/widget/:w_unique
454 // route inside a hidden iframe.
455 'dashboard_url' => admin_url( 'admin.php?page=wdesign-kit' ),
456 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
457 )
458 );
459 }
460
461 /**
462 * Add Menu Page WdKit.
463 *
464 * @since 1.0.0
465 */
466 public function wdkit_admin_menu() {
467 $capability = 'manage_options';
468
469 $options = get_option( 'wkit_white_label' );
470 $setting_name = ! empty( $options['plugin_name'] ) ? $options['plugin_name'] : __( 'WDesignKit', 'wdesignkit' );
471 $setting_logo = ! empty( $options['plugin_logo'] ) ? $options['plugin_logo'] : WDKIT_ASSETS . 'images/svg/logo-icon.svg';
472
473 if ( current_user_can( $capability ) ) {
474 $hook = add_menu_page( $setting_name, $setting_name, 'manage_options', 'wdesign-kit', array( $this, 'wdkit_menu_page_template' ), $setting_logo, 67 );
475 }
476 }
477
478 /**
479 * Load wdkit page content.
480 *
481 * @since 1.0.0
482 */
483 public function wdkit_menu_page_template() {
484 echo '<div id="wdesignkit-app"></div>';
485 }
486
487 /**
488 * Hide "Need Help" tab in Elementor widgets section when white label is enabled
489 *
490 * @since 2.2.4
491 */
492 public function wdkit_elementor_hide_help_tab() {
493 $white_label = get_option( 'wkit_white_label', false );
494
495 if ( ! empty( $white_label['help_link'] ) ) {
496 wp_add_inline_style(
497 'elementor-editor',
498 '.elementor-control.elementor-control-Need.Help.elementor-control-type-section{display:none!important;}'
499 );
500 }
501 }
502 }
503
504 Wdkit_Enqueue::get_instance();
505 }