PluginProbe
WDesignKit – AI Templates, Widget Builder & MCP Workflow / 2.7.0
WDesignKit – AI Templates, Widget Builder & MCP Workflow v2.7.0
2.7.0 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 All 129 releases
← All changes | includes/admin/class-wdkit-enqueue.php +320 -33 1.0.16 → 2.7.0 View file →
@@ -53,19 +53,55 @@
53 53 */
54 54 public function __construct() {
55 55 add_action( 'admin_menu', array( $this, 'wdkit_admin_menu' ) );
56 56
57 + add_action( 'admin_enqueue_scripts', array( $this, 'wdkit_enqueue_styles_library' ), 10 );
58 +
57 59 add_action( 'admin_enqueue_scripts', array( $this, 'wdkit_admin_scripts' ), 10, 1 );
58 60 add_action( 'enqueue_block_editor_assets', array( $this, 'wdkit_admin_scripts' ), 10, 1 );
59 61 add_action( 'enqueue_block_editor_assets', array( $this, 'wdkit_enqueue_styles' ), 10 );
60 62
63 + // Gutenberg editor styles
64 + add_action( 'enqueue_block_editor_assets', array( $this, 'wdkit_gutenberg_editor_style' ), 10 );
65 +
61 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' ) );
62 69 add_action( 'elementor/preview/enqueue_styles', array( $this, 'wdkit_elementor_preview_style' ) );
63 70 add_action( 'elementor/editor/before_enqueue_scripts', array( $this, 'wdkit_elementor_scripts' ) );
64 71 }
72 +
73 + // Bricks editor styles
74 + add_action( 'wp_enqueue_scripts', array( $this, 'wdkit_bricks_editor_style' ), 10, 1 );
65 75 }
66 76
77 +
67 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 + /**
68 104 * This function is used to retrieve all post types in WordPress and store them in an array.
69 105 *
70 106 * @since 1.0.0
71 107 */
@@ -100,19 +136,23 @@
100 136 global $current_screen;
101 137
102 138 $editor = 'wdkit';
103 139
104 - if( $current_screen->is_block_editor() ){
140 + $action = ! empty( $_GET['action'] ) ? sanitize_key( wp_unslash( $_GET['action'] ) ) : '';
105 141
106 - if ( array_key_exists('action', $_GET) && isset( $_GET['action'] ) ) {
107 - if ( 'elementor' === $_GET['action'] ) {
108 - $editor = 'elementor';
109 - }else if ( 'edit' === $_GET['action'] ) {
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 ) {
110 148 $editor = 'gutenberg';
111 149 }
112 - }else{
150 + } else {
113 151 $editor = 'gutenberg';
114 152 }
153 + } elseif ( 'elementor' === $action ) {
154 + $editor = 'elementor';
115 155 }
116 156
117 157 return $editor;
118 158 }
@@ -126,8 +166,52 @@
126 166 $this->wdkit_admin_scripts( 'elementor' );
127 167 }
128 168
129 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 + /**
130 214 * Elementor Preview Style Loaded
131 215 *
132 216 * @since 1.0.0
133 217 */
@@ -142,12 +226,37 @@
142 226 *
143 227 * @param string $hook use for check page type.
144 228 */
145 229 public function wdkit_admin_scripts( $hook ) {
146 - if ( ! in_array( $hook, array( 'toplevel_page_wdesign-kit', 'elementor', 'post-new.php', 'post.php' ), true ) ) {
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 ) {
147 248 return;
148 249 }
149 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 +
150 259 $this->wdkit_enqueue_scripts( $hook );
151 260 $this->wdkit_enqueue_styles();
152 261 }
153 262
@@ -157,8 +266,16 @@
157 266 * @since 1.0.0
158 267 */
159 268 public function wdkit_enqueue_styles() {
160 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' );
161 278 }
162 279
163 280 /**
164 281 * Register the JavaScript for the admin area.
@@ -166,53 +283,202 @@
166 283 * @param string $hook give builder name.
167 284 * @since 1.0.0
168 285 */
169 286 public function wdkit_enqueue_scripts( $hook ) {
170 - wp_enqueue_script( 'wdkit-editor-js', WDKIT_URL . 'build/index.js', array( 'wp-i18n', 'wp-element', 'wp-components' ), WDKIT_VERSION, true );
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 );
171 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 +
172 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' );
173 316
174 317 wp_localize_script(
175 318 'wdkit-editor-js',
176 319 'wdkitData',
177 320 array(
178 - 'ajax_url' => admin_url( 'admin-ajax.php' ),
179 - 'WDKIT_PATH' => WDKIT_PATH,
180 - 'WDKIT_URL' => WDKIT_URL,
181 - 'WDKIT_ASSETS' => WDKIT_ASSETS,
182 - 'wdkit_server_url' => WDKIT_SERVER_SITE_URL,
183 - 'home_url' => esc_url( home_url( '/' ) ),
184 - 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
185 - 'post_id' => get_the_ID(),
186 - 'post_type' => get_post_type(),
187 - 'text_domain' => WDKIT_TEXT_DOMAIN,
188 - 'use_editor' => $this->wdkit_use_editor(),
189 - 'post_type_list' => $this->wdkit_get_post_type_list(),
190 - 'WDKIT_onbording_end' => $onbording_end,
321 + 'ajax_url' => admin_url( 'admin-ajax.php' ),
322 + // Mirrors the PHP side's WP_DEBUG gate on its own import timing/diagnostic
323 + // error_log() calls, so the JS import flow's console diagnostics follow the
324 + // same convention instead of always printing in every visitor's console.
325 + 'debug' => (bool) ( defined( 'WP_DEBUG' ) && WP_DEBUG ),
326 + 'WDKIT_URL' => WDKIT_URL,
327 + 'WDKIT_ASSETS' => WDKIT_ASSETS,
328 + 'wdkit_server_url' => WDKIT_SERVER_SITE_URL,
329 + 'wdkit_site_api_url' => WDKIT_SERVER_API_URL,
330 + 'wdkit_wp_version' => get_bloginfo( 'version' ),
331 + 'home_url' => esc_url( home_url( '/' ) ),
332 + 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
191 333
192 - /** Widget Builder Path */
193 - 'WDKIT_SITE_URL' => WDKIT_GET_SITE_URL,
194 - 'WDKIT_SERVER_PATH' => WDKIT_SERVER_PATH,
195 - 'WDKIT_BUILDER_PATH' => WDKIT_BUILDER_PATH,
196 - 'WDKIT_VERSION' => WDKIT_VERSION,
334 + /* Kit Import engine switch. 'yes' => the wizard drives the PHP runner in four
335 + * stage calls; anything else => it falls back to its original ~25-call
336 + * orchestration, which is still fully present. Flip with the
337 + * `wdkit_use_php_runner` filter.
338 + *
339 + * Deliberately 'yes'/'no' rather than a boolean. wp_localize_script() casts
340 + * booleans to "1" and "", and while "" is falsy in JS, relying on that is the
341 + * same PHP/JS truthiness trap that bites elsewhere in the importer — a switch
342 + * that silently failed to switch OFF would be the worst outcome for a
343 + * rollback path. An explicit string compares the same in both languages.
344 + *
345 + * Fully qualified: this file is namespaced, and an unqualified reference here
346 + * resolved to wdkit\WdKit_enqueue\Wdkit_Import_Wizard and fatalled. */
347 + 'use_php_runner' => ( class_exists( '\\Wdkit_Import_Wizard' ) && \Wdkit_Import_Wizard::is_enabled() ) ? 'yes' : 'no',
348 + 'post_id' => get_the_ID(),
349 + 'post_type' => get_post_type(),
350 + 'text_domain' => WDKIT_TEXT_DOMAIN,
351 + 'use_editor' => $this->wdkit_use_editor(),
352 + 'post_type_list' => $this->wdkit_get_post_type_list(),
353 + 'WDKIT_onbording_end' => $onbording_end,
354 + 'wdkit_white_label' => $white_label,
355 + 'WDKIT_dark_mode' => $dark_mode,
356 + /** Widget Builder — public URL only, no server filesystem paths */
357 + 'WDKIT_SITE_URL' => WDKIT_GET_SITE_URL,
358 + 'WDKIT_DOC_URL' => WDKIT_DOCUMENT,
359 + 'WDKIT_SERVER_PATH' => WDKIT_SERVER_PATH,
360 + 'WDKIT_VERSION' => WDKIT_VERSION,
197 361
198 - 'gutenberg_template' => Wdkit_Wdesignkit::wdkit_is_compatible( 'gutenberg_template', 'template' ),
362 + 'gutenberg_template' => Wdkit_Wdesignkit::wdkit_is_compatible( 'gutenberg_template', 'template' ),
363 +
364 + /**
365 + * Data Sharing switcher, Settings panel.
366 + *
367 + * Read as a SITE option — the consent is one answer per install, not per blog. The
368 + * class guard matches the one in wdesignkit.php: on a white-labelled install, or when
369 + * a sibling POSIMYTH plugin's SDK copy won the loader, the tracker class is never
370 + * declared and the constant reference would fatal.
371 + *
372 + * Both references are root-namespaced. This file lives in wdkit\WdKit_enqueue while
373 + * the SDK class is declared in the global namespace: a string class name is always
374 + * global so the guard passed either way, but an unprefixed `Posimyth_Tracker_WDK::`
375 + * resolves against THIS namespace and fatals on every admin page load.
376 + */
377 + 'wdkit_data_sharing' => class_exists( '\Posimyth_Tracker_WDK' ) ? (bool) get_site_option( \Posimyth_Tracker_WDK::OPT_IN_OPTION, false ) : false,
378 + 'wdkit_consent_nonce' => wp_create_nonce( 'posimyth_consent_wdk' ),
379 +
380 + /**
381 + * Whether the Data Sharing card may be shown at all.
382 + *
383 + * Tracks the tracker class rather than the white-label flag: a rebranded install now
384 + * keeps the feature (see wdesignkit.php), so this is false only when the SDK genuinely
385 + * failed to load — a sibling POSIMYTH plugin winning the loader with a diverged copy.
386 + * Rendering a switch in that case would offer a save with no handler behind it.
387 + *
388 + * Separate from wdkit_data_sharing on purpose: that one is false both when sharing is
389 + * off and when the feature is absent, which cannot tell the two apart.
390 + */
391 + 'wdkit_data_sharing_available' => class_exists( '\Posimyth_Tracker_WDK' ),
392 +
393 + /**
394 + * Reseller's product name, for the Data Sharing copy that would otherwise say
395 + * "WDesignKit" on a plugin they have rebranded as their own.
396 + */
397 + 'wdkit_data_sharing_name' => ! empty( $white_label['plugin_name'] ) ? $white_label['plugin_name'] : 'WDesignKit',
398 +
399 + /** help_link is the reseller's "hide POSIMYTH documentation links" switch. */
400 + 'wdkit_data_sharing_docs' => empty( $white_label['help_link'] ) ? WDKIT_DOCUMENT . 'data-sharing/' : ''
199 401 )
200 402 );
201 403
202 404 /**Ace Editor files for Widget-builder */
203 405 if ( 'toplevel_page_wdesign-kit' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'builder', 'widget' ) ) {
204 - wp_enqueue_script( 'widgetBuilder-script-editor-js', WDKIT_URL . 'assets/js/extra/ace.min.js', array( 'wp-element' ), WDKIT_VERSION, true );
205 - wp_enqueue_script( 'widgetBuilder-script-editor-cobalt', WDKIT_URL . 'assets/js/extra/theme-cobalt.js', array( 'wp-element' ), WDKIT_VERSION, true );
206 - wp_enqueue_script( 'widgetBuilder-script-editor-html', WDKIT_URL . 'assets/js/extra//mode-html.js', array( 'wp-element' ), WDKIT_VERSION, true );
406 + 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' ) );
407 + 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' ) );
408 + 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' ) );
207 409 }
208 410
209 411 if ( 'elementor' === $hook && Wdkit_Wdesignkit::wdkit_is_compatible( 'elementor_template', 'template' ) ) {
210 - wp_enqueue_script( 'wdkit-frontend-editor', WDKIT_ASSETS . '/js/main/elementor/elementor-editor.js', array( 'jquery', 'wp-i18n' ), WDKIT_VERSION, true );
412 + 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' ) );
413 + wp_set_script_translations( 'wdkit-frontend-editor', 'wdesignkit' );
414 + $this->wdkit_cross_copy_paste_script( 'elementor' );
211 415 }
212 416 }
213 417
214 418 /**
419 + * Enqueue cross-domain copy/paste support for active builders.
420 + *
421 + * @since 1.0.0
422 + */
423 + public function wdkit_cross_copy_paste_script( $builder = '' ) {
424 + $settings = get_option( 'wkit_settings_panel', array() );
425 + $enabled = array(
426 + 'elementor' => ! empty( $settings['cross_copy_paste_elementor'] ) || ! empty( $settings['cross_copy_paste'] ),
427 + 'gutenberg' => ! empty( $settings['cross_copy_paste_gutenberg'] ) || ! empty( $settings['cross_copy_paste'] ),
428 + // Bricks support is "Coming Soon" — force-disabled regardless of saved setting.
429 + 'bricks' => false,
430 + );
431 +
432 + if ( empty( array_filter( $enabled ) ) ) {
433 + return;
434 + }
435 +
436 + if ( ! empty( $builder ) && empty( $enabled[ $builder ] ) ) {
437 + return;
438 + }
439 +
440 + if ( wp_script_is( 'wdkit-cross-copy-paste', 'enqueued' ) ) {
441 + return;
442 + }
443 +
444 + $deps = array( 'wp-i18n' );
445 + // Gutenberg SlotFill needs these so the block toolbar's
446 + // "Options" menu can host our "WDesignKit Copy / Paste" items.
447 + if ( ! empty( $enabled['gutenberg'] ) ) {
448 + $deps[] = 'wp-plugins';
449 + $deps[] = 'wp-element';
450 + $deps[] = 'wp-components';
451 + $deps[] = 'wp-block-editor';
452 + $deps[] = 'wp-data';
453 + $deps[] = 'wp-blocks';
454 + $deps[] = 'wp-dom-ready';
455 + }
456 +
457 + 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' ) );
458 + wp_set_script_translations( 'wdkit-cross-copy-paste', 'wdesignkit' );
459 + wp_localize_script(
460 + 'wdkit-cross-copy-paste',
461 + 'wdkitCrossCopyPaste',
462 + array(
463 + 'enabled' => true,
464 + 'version' => WDKIT_VERSION,
465 + 'site' => esc_url( home_url( '/' ) ),
466 + 'builders' => $enabled,
467 + // Direct AJAX access — the editor pages don't always
468 + // load the dashboard wdkitData global. Needed for the
469 + // wdkit_cp_check_widgets endpoint.
470 + 'ajax_url' => admin_url( 'admin-ajax.php' ),
471 + // WDesignKit dashboard (hash-router) page. Missing widgets
472 + // are installed by loading its /create/widget/:w_unique
473 + // route inside a hidden iframe.
474 + 'dashboard_url' => admin_url( 'admin.php?page=wdesign-kit' ),
475 + 'kit_nonce' => wp_create_nonce( 'wdkit_nonce' ),
476 + )
477 + );
478 + }
479 +
480 + /**
215 481 * Add Menu Page WdKit.
216 482 *
217 483 * @since 1.0.0
218 484 */
@@ -217,10 +483,15 @@
217 483 * @since 1.0.0
218 484 */
219 485 public function wdkit_admin_menu() {
220 486 $capability = 'manage_options';
487 +
488 + $options = get_option( 'wkit_white_label' );
489 + $setting_name = ! empty( $options['plugin_name'] ) ? $options['plugin_name'] : __( 'WDesignKit', 'wdesignkit' );
490 + $setting_logo = ! empty( $options['plugin_logo'] ) ? $options['plugin_logo'] : WDKIT_ASSETS . 'images/svg/logo-icon.svg';
491 +
221 492 if ( current_user_can( $capability ) ) {
222 - $hook = add_menu_page( __( 'WDesignKit', 'wdesignkit' ), __( 'WDesignKit', 'wdesignkit' ), 'manage_options', 'wdesign-kit', array( $this, 'wdkit_menu_page_template' ), WDKIT_ASSETS . 'images/svg/logo-icon.svg' );
493 + $hook = add_menu_page( $setting_name, $setting_name, 'manage_options', 'wdesign-kit', array( $this, 'wdkit_menu_page_template' ), $setting_logo, 67 );
223 494 }
224 495 }
225 496
226 497 /**
@@ -230,8 +501,24 @@
230 501 */
231 502 public function wdkit_menu_page_template() {
232 503 echo '<div id="wdesignkit-app"></div>';
233 504 }
505 +
506 + /**
507 + * Hide "Need Help" tab in Elementor widgets section when white label is enabled
508 + *
509 + * @since 2.2.4
510 + */
511 + public function wdkit_elementor_hide_help_tab() {
512 + $white_label = get_option( 'wkit_white_label', false );
513 +
514 + if ( ! empty( $white_label['help_link'] ) ) {
515 + wp_add_inline_style(
516 + 'elementor-editor',
517 + '.elementor-control.elementor-control-Need.Help.elementor-control-type-section{display:none!important;}'
518 + );
519 + }
520 + }
234 521 }
235 522
236 523 Wdkit_Enqueue::get_instance();
237 -}
524 +}