PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.0.7
Adminify – White Label, Admin Menu Editor, Login Customizer v4.0.7
4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.1.17 All 164 releases
← All changes | Inc/Modules/MenuEditor/MenuEditor.php +159 -232 4.2.214.0.7 View file →
@@ -1,11 +1,12 @@
1 1 <?php
2 2
3 -namespace PXLBSAdminify\Inc\Modules\MenuEditor;
3 +namespace WPAdminify\Inc\Modules\MenuEditor;
4 4
5 -use PXLBSAdminify\Inc\Utils;
6 -use PXLBSAdminify\Inc\Admin\AdminSettings;
7 -use PXLBSAdminify\Inc\Modules\MenuEditor\MenuEditorAssets;
5 +use WPAdminify\Inc\Utils;
6 +use WPAdminify\Inc\Admin\AdminSettings;
7 +use WPAdminify\Inc\Modules\MenuEditor\MenuEditorAssets;
8 +use WPAdminify\Inc\Admin\AdminSettingsModel;
8 9 use enshrined\svgSanitize\Sanitizer;
9 10 // no direct access allowed
10 11 if ( !defined( 'ABSPATH' ) ) {
11 12 exit;
@@ -46,23 +47,22 @@
46 47 $this->menu_settings = ( new MenuEditorOptions() )->get();
47 48 $this->options = (array) AdminSettings::get_instance()->get();
48 49 add_filter( 'upload_mimes', [$this, 'custom_icon_mime_types'] );
49 50 add_filter( 'wp_handle_upload_prefilter', [$this, 'sanitize_svg_file'] );
50 - add_filter( 'admin_body_class', [$this, 'menu_editor_body_class'] );
51 + add_filter( 'admin_body_class', [$this, 'jltwp_adminify_menu_editor_body_class'] );
51 52 // add_filter('parent_file', [$this, 'set_menu'], 800);
52 53 // add_filter('parent_file', [$this, 'apply_menu'], 900);
53 - // add_action('modules_menu_editor_render', [$this, 'modules_menu_editor_render']);
54 - if ( apply_filters( 'pxlbsadminify_enable_menu_editor_render', true ) ) {
54 + // add_action('jltwp_adminify_modules_menu_editor_render', [$this, 'jltwp_adminify_modules_menu_editor_render']);
55 + if ( apply_filters( 'enable_jltwp_adminify_menu_editor_render', true ) ) {
55 56 add_filter( 'parent_file', [$this, 'set_menu'], 800 );
56 57 add_filter( 'parent_file', [$this, 'apply_menu'], 900 );
57 58 }
58 - add_action( 'wp_ajax_pxlbsadminify_save_menu_settings', [$this, 'save_menu_settings'] );
59 - add_action( 'wp_ajax_pxlbsadminify_reset_menu_settings', [$this, 'reset_menu_settings'] );
60 - add_action( 'wp_ajax_pxlbsadminify_export_menu_settings', [$this, 'export_menu_settings'] );
61 - add_action( 'wp_ajax_pxlbsadminify_import_menu_settings', [$this, 'import_menu_settings'] );
62 - add_action( 'wp_ajax_pxlbsadminify_file_upload', [$this, 'file_upload_callback'] );
63 - add_action( 'wp_ajax_pxlbsadminify_load_custom_icons', [$this, 'load_custom_icons_callback'] );
64 - add_action( 'wp_ajax_pxlbsadminify_search_users', [$this, 'search_users_callback'] );
59 + add_action( 'wp_ajax_adminify_save_menu_settings', [$this, 'adminify_save_menu_settings'] );
60 + add_action( 'wp_ajax_adminify_reset_menu_settings', [$this, 'adminify_reset_menu_settings'] );
61 + add_action( 'wp_ajax_adminify_export_menu_settings', [$this, 'adminify_export_menu_settings'] );
62 + add_action( 'wp_ajax_adminify_import_menu_settings', [$this, 'adminify_import_menu_settings'] );
63 + add_action( 'wp_ajax_adminify_file_upload', [$this, 'adminify_file_upload_callback'] );
64 + add_action( 'wp_ajax_adminify_load_custom_icons', [$this, 'adminify_load_custom_icons_callback'] );
65 65 new MenuEditorAssets();
66 66 }
67 67
68 68 public function custom_icon_mime_types( $mimes ) {
@@ -102,11 +102,11 @@
102 102 // return $value->post_title == 'adminify-custom-icon';
103 103 return strpos( $value->guid, 'adminify-custom-icon' ) !== false;
104 104 }
105 105
106 - public function load_custom_icons_callback() {
106 + public function adminify_load_custom_icons_callback() {
107 107 // Security check - verify nonce and capability
108 - check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' );
108 + check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' );
109 109 if ( !current_user_can( 'manage_options' ) ) {
110 110 wp_send_json_error( array(
111 111 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
112 112 ) );
@@ -123,11 +123,11 @@
123 123 echo wp_json_encode( $result );
124 124 die;
125 125 }
126 126
127 - public function file_upload_callback() {
127 + public function adminify_file_upload_callback() {
128 128 $result['status'] = false;
129 - check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' );
129 + check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' );
130 130 if ( !current_user_can( 'manage_options' ) ) {
131 131 wp_send_json_error( array(
132 132 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
133 133 ) );
@@ -136,15 +136,9 @@
136 136 $targeted_dir = $upload_dir['basedir'] . '/adminify-custom-icons';
137 137 if ( !is_dir( $targeted_dir ) ) {
138 138 wp_mkdir_p( $targeted_dir );
139 139 }
140 - add_filter( 'upload_dir', [$this, 'icon_custom_upload_dir'] );
141 - if ( !isset( $_FILES['my_file_upload'] ) ) {
142 - wp_send_json_error( array(
143 - 'message' => __( 'No file was uploaded.', 'adminify' ),
144 - ) );
145 - }
146 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- $_FILES is sanitized by the WP upload handler.
140 + add_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] );
147 141 $files = wp_kses_post_deep( wp_unslash( $_FILES['my_file_upload'] ) );
148 142 foreach ( $files['name'] as $key => $value ) {
149 143 if ( $files['name'][$key] ) {
150 144 $file = [
@@ -169,14 +163,14 @@
169 163 $result['images'][$attachment_id] = wp_get_attachment_url( $attachment_id );
170 164 }
171 165 }
172 166 }
173 - remove_filter( 'upload_dir', [$this, 'icon_custom_upload_dir'] );
167 + remove_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] );
174 168 echo wp_json_encode( $result );
175 169 wp_die();
176 170 }
177 171
178 - public function icon_custom_upload_dir( $dir_data ) {
172 + public function adminify_icon_custom_upload_dir( $dir_data ) {
179 173 // $dir_data already you might want to use
180 174 $custom_dir = 'adminify-custom-icons';
181 175 return [
182 176 'path' => $dir_data['basedir'] . '/' . $custom_dir,
@@ -187,75 +181,10 @@
187 181 'error' => $dir_data['error'],
188 182 ];
189 183 }
190 184
191 - /**
192 - * AJAX callback to search users for Select2
193 - * Uses 'fields' parameter for optimized database query performance
194 - */
195 - public function search_users_callback() {
196 - check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' );
197 - if ( !current_user_can( 'manage_options' ) ) {
198 - wp_send_json_error( array(
199 - 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
200 - ) );
201 - }
202 - $search = ( isset( $_GET['search'] ) ? sanitize_text_field( wp_unslash( $_GET['search'] ) ) : '' );
203 - // If no search term or less than 3 chars, return first 3 users
204 - if ( strlen( $search ) < 3 ) {
205 - $args = array(
206 - 'number' => 3,
207 - 'orderby' => 'ID',
208 - 'order' => 'DESC',
209 - 'fields' => array('ID', 'user_login', 'display_name'),
210 - );
211 - $users = get_users( $args );
212 - $results = array();
213 - foreach ( $users as $user ) {
214 - $results[] = array(
215 - 'id' => $user->user_login,
216 - 'text' => $user->user_login . ' (' . $user->display_name . ')',
217 - );
218 - }
219 - // Get total user count efficiently
220 - $user_count = count_users();
221 - $total_users = $user_count['total_users'];
222 - wp_send_json( array(
223 - 'results' => $results,
224 - 'pagination' => array(
225 - 'more' => $total_users > 3,
226 - ),
227 - 'total_users' => $total_users,
228 - ) );
229 - return;
230 - }
231 - // Search users when 3+ characters typed
232 - $args = array(
233 - 'search' => '*' . $search . '*',
234 - 'search_columns' => array('user_login', 'user_email', 'display_name'),
235 - 'number' => 20,
236 - 'orderby' => 'display_name',
237 - 'order' => 'ASC',
238 - 'fields' => array('ID', 'user_login', 'display_name'),
239 - );
240 - $users = get_users( $args );
241 - $results = array();
242 - foreach ( $users as $user ) {
243 - $results[] = array(
244 - 'id' => $user->user_login,
245 - 'text' => $user->user_login . ' (' . $user->display_name . ')',
246 - );
247 - }
248 - wp_send_json( array(
249 - 'results' => $results,
250 - 'pagination' => array(
251 - 'more' => false,
252 - ),
253 - ) );
254 - }
255 -
256 185 // Menu Editor Body Class
257 - public function menu_editor_body_class( $classes ) {
186 + public function jltwp_adminify_menu_editor_body_class( $classes ) {
258 187 $classes .= ' adminify_menu_editor ';
259 188 return $classes;
260 189 }
261 190
@@ -270,13 +199,13 @@
270 199 foreach ( $values as $index => $in ) {
271 200 if ( is_array( $in ) ) {
272 201 $values[$index] = $this->clean_ajax_input( $in );
273 202 } else {
274 - $values[$index] = wp_strip_all_tags( $in );
203 + $values[$index] = strip_tags( $in );
275 204 }
276 205 }
277 206 } else {
278 - $values = wp_strip_all_tags( $values );
207 + $values = strip_tags( $values );
279 208 }
280 209 return $values;
281 210 }
282 211
@@ -289,25 +218,23 @@
289 218 public function ajax_error_message( $message ) {
290 219 $returndata = [];
291 220 $returndata['error'] = true;
292 221 $returndata['error_message'] = $message;
293 - return wp_json_encode( $returndata );
222 + return json_encode( $returndata );
294 223 }
295 224
296 - public function save_menu_settings() {
297 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
225 + public function adminify_save_menu_settings() {
226 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
298 227 if ( !current_user_can( 'manage_options' ) ) {
299 228 wp_send_json_error( array(
300 229 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
301 230 ) );
302 231 }
303 - $options = ( isset( $_POST['options'] ) ? wp_kses_post_deep( wp_unslash( $_POST['options'] ) ) : '' );
304 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitized via wp_kses_post_deep() and clean_ajax_input() below.
232 + $options = wp_kses_post_deep( wp_unslash( $_POST['options'] ) );
305 233 $options = $this->clean_ajax_input( $options );
306 234 if ( $options == '' || !is_array( $options ) ) {
307 235 $message = __( 'No options supplied to save', 'adminify' );
308 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- kses_custom() is a wp_kses() wrapper; output already escaped.
309 - echo Utils::kses_custom( $this->ajax_error_message( $message ) );
236 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
310 237 die;
311 238 }
312 239 if ( is_array( $options ) ) {
313 240 update_option( $this->prefix, $options );
@@ -313,14 +240,13 @@
313 240 update_option( $this->prefix, $options );
314 241 $returndata = [];
315 242 $returndata['success'] = true;
316 243 $returndata['message'] = __( 'Settings saved', 'adminify' );
317 - echo wp_json_encode( $returndata );
244 + echo json_encode( $returndata );
318 245 die;
319 246 } else {
320 247 $message = __( 'Something went wrong', 'adminify' );
321 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- kses_custom() is a wp_kses() wrapper; output already escaped.
322 - echo Utils::kses_custom( $this->ajax_error_message( $message ) );
248 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
323 249 die;
324 250 }
325 251 }
326 252 die;
@@ -330,10 +256,10 @@
330 256 * Menu Editor Settings Reset
331 257 *
332 258 * @return void
333 259 */
334 - public function reset_menu_settings() {
335 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
260 + public function adminify_reset_menu_settings() {
261 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
336 262 if ( !current_user_can( 'manage_options' ) ) {
337 263 wp_send_json_error( array(
338 264 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
339 265 ) );
@@ -343,14 +269,13 @@
343 269 if ( !$menu_editor_options ) {
344 270 $returndata = [];
345 271 $returndata['success'] = true;
346 272 $returndata['message'] = __( 'Settings reset', 'adminify' );
347 - echo wp_json_encode( $returndata );
273 + echo json_encode( $returndata );
348 274 die;
349 275 } else {
350 276 $message = __( 'Something went wrong', 'adminify' );
351 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- kses_custom() is a wp_kses() wrapper; output already escaped.
352 - echo Utils::kses_custom( $this->ajax_error_message( $message ) );
277 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
353 278 die;
354 279 }
355 280 }
356 281 die;
@@ -360,10 +285,10 @@
360 285 * Export Menu Editor Settings
361 286 *
362 287 * @return void
363 288 */
364 - public function export_menu_settings() {
365 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
289 + public function adminify_export_menu_settings() {
290 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
366 291 if ( !current_user_can( 'manage_options' ) ) {
367 292 wp_send_json_error( array(
368 293 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
369 294 ) );
@@ -368,9 +293,9 @@
368 293 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
369 294 ) );
370 295 }
371 296 $menu_editor_options = get_option( $this->prefix );
372 - echo wp_json_encode( $menu_editor_options );
297 + echo json_encode( $menu_editor_options );
373 298 }
374 299 die;
375 300 }
376 301
@@ -378,21 +303,19 @@
378 303 * Import Menu Editor Settings
379 304 *
380 305 * @since 1.0.0
381 306 */
382 - public function import_menu_settings() {
383 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
307 + public function adminify_import_menu_settings() {
308 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
384 309 if ( !current_user_can( 'manage_options' ) ) {
385 310 wp_send_json_error( array(
386 311 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
387 312 ) );
388 313 }
389 - $new_options = ( isset( $_POST['settings'] ) ? wp_kses_post_deep( wp_unslash( $_POST['settings'] ) ) : '' );
390 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitized via wp_kses_post_deep().
314 + $new_options = wp_kses_post_deep( $_POST['settings'] );
391 315 if ( $new_options == '' || !is_array( $new_options ) ) {
392 316 $message = __( 'No options supplied to save', 'adminify' );
393 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- kses_custom() is a wp_kses() wrapper; output already escaped.
394 - echo Utils::kses_custom( $this->ajax_error_message( $message ) );
317 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
395 318 die;
396 319 }
397 320 if ( is_array( $new_options ) ) {
398 321 update_option( $this->prefix, $new_options );
@@ -398,14 +321,13 @@
398 321 update_option( $this->prefix, $new_options );
399 322 $returndata = [];
400 323 $returndata['success'] = true;
401 324 $returndata['message'] = __( 'Menu Imported', 'adminify' );
402 - echo wp_json_encode( $returndata );
325 + echo json_encode( $returndata );
403 326 die;
404 327 } else {
405 328 $message = __( 'Something went wrong', 'adminify' );
406 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- kses_custom() is a wp_kses() wrapper; output already escaped.
407 - echo Utils::kses_custom( $this->ajax_error_message( $message ) );
329 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
408 330 die;
409 331 }
410 332 }
411 333 die;
@@ -411,37 +333,8 @@
411 333 die;
412 334 }
413 335
414 336 /**
415 - * Find menu settings for a given slug.
416 - * Some plugins (e.g. Yoast SEO) register different top-level menu slugs
417 - * depending on user capabilities. The admin sees slug 'wpseo_dashboard'
418 - * but the editor sees 'wpseo_tools'. This method handles that mismatch
419 - * by falling back to checking if the slug appears as a submenu key.
420 - *
421 - * @param string $slug The menu slug to look up.
422 - * @return array|null The matching settings array, or null if not found.
423 - */
424 - public function find_menu_settings_by_slug( $slug ) {
425 - // Direct match
426 - if ( isset( $this->menu_settings[$slug] ) ) {
427 - return $this->menu_settings[$slug];
428 - }
429 - // Fallback: check if this slug is a submenu of any saved parent menu
430 - if ( is_array( $this->menu_settings ) ) {
431 - foreach ( $this->menu_settings as $parent_slug => $parent_settings ) {
432 - if ( !is_array( $parent_settings ) || !isset( $parent_settings['submenu'] ) || !is_array( $parent_settings['submenu'] ) ) {
433 - continue;
434 - }
435 - if ( isset( $parent_settings['submenu'][$slug] ) ) {
436 - return $parent_settings;
437 - }
438 - }
439 - }
440 - return null;
441 - }
442 -
443 - /**
444 337 * Get menu items
445 338 *
446 339 * @param [type] $parent_file
447 340 *
@@ -479,18 +372,10 @@
479 372 if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
480 373 $separator = 1;
481 374 }
482 375 if ( is_array( $menu_settings ) ) {
483 - // Direct slug match first, then fallback for dynamic-slug plugins (e.g. Yoast SEO)
484 376 if ( isset( $menu_settings[$current_menu_item[2]] ) ) {
485 377 $optiongroup = $menu_settings[$current_menu_item[2]];
486 - } else {
487 - $fallback = $this->find_menu_settings_by_slug( $current_menu_item[2] );
488 - if ( $fallback !== null ) {
489 - $optiongroup = $fallback;
490 - }
491 - }
492 - if ( !empty( $optiongroup ) ) {
493 378 if ( isset( $optiongroup['order'] ) ) {
494 379 $order = $optiongroup['order'];
495 380 }
496 381 if ( isset( $optiongroup['separator'] ) ) {
@@ -568,9 +453,9 @@
568 453 $menu_icon = str_replace( 'dashicons ', '', $menu_s['icon'] );
569 454 } else {
570 455 if ( empty( $menu_s['icon'] ) || strpos( $menu_s['icon'], ',' ) !== false ) {
571 456 if ( empty( $menu_s['icon'] ) ) {
572 - $menu_icon = PXLBSADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
457 + $menu_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
573 458 } else {
574 459 $menu_icon = explode( ',', $menu_s['icon'] )[1];
575 460 }
576 461 } else {
@@ -717,9 +602,9 @@
717 602 $separator_order = $this->menu[$key]['order'];
718 603 $empty_separator = array(
719 604 0 => '',
720 605 1 => 'read',
721 - 2 => 'separator_' . wp_rand( 200, 1000 ) * 1000,
606 + 2 => 'separator_' . rand( 200, 1000 ) * 1000,
722 607 3 => '',
723 608 4 => 'wp-menu-separator',
724 609 'order' => $separator_order + 0.5,
725 610 );
@@ -760,9 +645,9 @@
760 645 }
761 646 $submenu_settings = $this->menu_settings[$parentname]['submenu'];
762 647 $tempsub = [];
763 648 foreach ( $subitems as $current_menu_item ) {
764 - $sub_level = apply_filters( 'pxlbsadminify/menu_editor', [
649 + $sub_level = apply_filters( 'adminify/menu_editor', [
765 650 'sub_level' => false,
766 651 ] );
767 652 if ( !empty( $sub_level['sub_level'] ) ) {
768 653 if ( empty( $current_menu_item[0] ) || $current_menu_item[2] === 'wp-adminify-settings-pricing' ) {
@@ -834,18 +719,10 @@
834 719 $disabled_for = [];
835 720 $optiongroup = [];
836 721 $order = $key;
837 722 if ( is_array( $this->menu_settings ) ) {
838 - // Direct slug match first, then fallback for dynamic-slug plugins (e.g. Yoast SEO)
839 723 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
840 724 $optiongroup = $this->menu_settings[$current_menu_item[2]];
841 - } else {
842 - $fallback = $this->find_menu_settings_by_slug( $current_menu_item[2] );
843 - if ( $fallback !== null ) {
844 - $optiongroup = $fallback;
845 - }
846 - }
847 - if ( !empty( $optiongroup ) ) {
848 725 if ( isset( $optiongroup['name'] ) ) {
849 726 $name = $optiongroup['name'];
850 727 if ( $name != '' ) {
851 728 $current_menu_item[0] = $name;
@@ -892,19 +769,14 @@
892 769 }
893 770 }
894 771 }
895 772 $current_menu_item['order'] = $order;
896 - // Check hidden_for: boolean true means hide, array means check via is_hidden
897 773 if ( isset( $current_menu_item['hidden_for'] ) ) {
898 774 if ( $current_menu_item['hidden_for'] === true ) {
899 775 return false;
900 - } elseif ( is_array( $current_menu_item['hidden_for'] ) && !empty( $current_menu_item['hidden_for'] ) ) {
901 - // Fallback: hidden_for is still an array (settings lookup may have missed it)
902 - if ( $this->is_hidden( $current_menu_item['hidden_for'] ) ) {
903 - return false;
904 - }
776 + } else {
777 + return $current_menu_item;
905 778 }
906 - return $current_menu_item;
907 779 } else {
908 780 return $current_menu_item;
909 781 }
910 782 }
@@ -930,11 +802,11 @@
930 802 }
931 803 // Normalize disabled_for array
932 804 $disabled_for_arr = [];
933 805 foreach ( $disabled_for as $v ) {
934 - $disabled_for_arr[] = Utils::sluggify_with_underscores( $v );
806 + $disabled_for_arr[] = jlt_adminify_sluggify_with_underscores( $v );
935 807 }
936 - $slugify_user_login = Utils::sluggify_with_underscores( $current_user->user_login );
808 + $slugify_user_login = jlt_adminify_sluggify_with_underscores( $current_user->user_login );
937 809 // Check Username
938 810 if ( in_array( $current_user->user_login, $disabled_for_arr ) || in_array( $slugify_user_login, $disabled_for_arr ) ) {
939 811 return true;
940 812 }
@@ -1062,8 +934,10 @@
1062 934 * Render Menu Editor
1063 935 */
1064 936 public function render_menu_editor() {
1065 937 global $wp_roles;
938 + $users = get_users();
939 + $this->users = $users;
1066 940 $this->roles = $wp_roles->roles;
1067 941 if ( $this->menu && is_array( $this->menu ) ) {
1068 942 foreach ( $this->menu as $menu_item ) {
1069 943 $next_menu_item = next( $this->menu );
@@ -1080,8 +954,25 @@
1080 954 );
1081 955 }
1082 956 }
1083 957 $this->render_add_new_menu_item();
958 + ?>
959 + <script>
960 + jQuery(function($) {
961 +
962 + $('.adminify-menu-settings').tokenize2({
963 + placeholder: '<?php
964 + esc_html_e( 'Select roles or users', 'adminify' );
965 + ?>'
966 + });
967 +
968 + $('.adminify-menu-settings').on('tokenize:select', function() {
969 + $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
970 + });
971 +
972 + });
973 + </script>
974 + <?php
1084 975 }
1085 976 }
1086 977
1087 978 public function get_icon( $value, $default ) {
@@ -1096,17 +987,27 @@
1096 987 */
1097 988 public function generate_user_rules_select_field( $menu_id, $disabled_for, $menu_type = 'menu' ) {
1098 989 ob_start();
1099 990 ?>
1100 - <select class="adminify-menu-settings adminify-user-role-select <?php
1101 - echo esc_attr( $menu_type );
991 + <select class="adminify-menu-settings <?php
992 + echo $menu_type;
1102 993 ?>_setting" name="hidden_for" id="<?php
1103 994 echo esc_attr( $menu_id );
1104 995 ?>-user-role-types" multiple>
1105 - <optgroup label="<?php
1106 - esc_attr_e( 'Roles', 'adminify' );
1107 - ?>">
1108 996 <?php
997 + $sel = '';
998 + // if (in_array('Super Admin', $disabled_for)) {
999 + // $sel = 'selected';
1000 + // }
1001 + ?>
1002 +
1003 + <!-- <option value="Super Admin" <?php
1004 + // echo esc_attr($sel);
1005 + ?>><?php
1006 + // esc_html_e('Super Admin', 'adminify');
1007 + ?></option> -->
1008 +
1009 + <?php
1109 1010 foreach ( $this->roles as $role ) {
1110 1011 $rolename = $role['name'];
1111 1012 if ( 'administrator' == strtolower( $rolename ) ) {
1112 1013 continue;
@@ -1124,40 +1025,26 @@
1124 1025 echo esc_html( $rolename );
1125 1026 ?></option>
1126 1027 <?php
1127 1028 }
1128 - ?>
1129 - </optgroup>
1130 -
1131 - <optgroup label="<?php
1132 - esc_attr_e( 'Users', 'adminify' );
1133 - ?>" class="adminify-users-optgroup">
1029 + foreach ( $this->users as $user ) {
1030 + $username = $user->display_name;
1031 + $user_login = $user->user_login;
1032 + $sel = '';
1033 + if ( in_array( $user_login, $disabled_for ) ) {
1034 + $sel = 'selected';
1035 + }
1036 + ?>
1037 + <option value="<?php
1038 + echo wp_kses_post( $user_login );
1039 + ?>" <?php
1040 + echo esc_attr( $sel );
1041 + ?>><?php
1042 + echo wp_kses_post( $user_login );
1043 + ?></option>
1134 1044 <?php
1135 - // Only include pre-selected users in HTML (AJAX will populate dropdown)
1136 - foreach ( $disabled_for as $item ) {
1137 - // Check if this is a user (not a role)
1138 - $is_role = false;
1139 - foreach ( $this->roles as $role ) {
1140 - if ( $role['name'] === $item ) {
1141 - $is_role = true;
1142 - break;
1143 - }
1144 - }
1145 - if ( !$is_role ) {
1146 - $user = get_user_by( 'login', $item );
1147 - if ( $user ) {
1148 - ?>
1149 - <option value="<?php
1150 - echo esc_attr( $user->user_login );
1151 - ?>" selected><?php
1152 - echo esc_html( $user->user_login . ' (' . $user->display_name . ')' );
1153 - ?></option>
1154 - <?php
1155 - }
1156 - }
1157 1045 }
1158 1046 ?>
1159 - </optgroup>
1160 1047 </select>
1161 1048 <?php
1162 1049 return ob_get_clean();
1163 1050 }
@@ -1327,9 +1214,9 @@
1327 1214 <label for="<?php
1328 1215 echo esc_attr( $current_menu_item[2] );
1329 1216 ?>">
1330 1217 <?php
1331 - esc_html_e( 'Hidden For Roles or Users', 'adminify' );
1218 + esc_html_e( 'Hidden For Rules', 'adminify' );
1332 1219 ?>
1333 1220 </label>
1334 1221
1335 1222 <div class="select is-small">
@@ -1334,9 +1221,8 @@
1334 1221
1335 1222 <div class="select is-small">
1336 1223
1337 1224 <?php
1338 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- generate_user_rules_select_field() returns a trusted <select> template with form inputs that wp_kses_post() would strip; values inside are escaped.
1339 1225 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1340 1226 ?>
1341 1227
1342 1228 </div>
@@ -1471,9 +1357,9 @@
1471 1357 ?>"></i>
1472 1358 <?php
1473 1359 }
1474 1360 } else {
1475 - $adminify_icon = PXLBSADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1361 + $adminify_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1476 1362 if ( empty( $icons[$default_icons] ) ) {
1477 1363 echo '<i class=""><img width="24" height="24" src=' . esc_url( $adminify_icon ) . ' ></i>';
1478 1364 } else {
1479 1365 ?>
@@ -1497,9 +1383,9 @@
1497 1383 <?php
1498 1384 $upgrade_pro = '';
1499 1385 $separator_name_attr = '';
1500 1386 $upgrade_pro = 'upgrade-pro';
1501 - $separator_name_attr = Utils::upgrade_pro_notice( 'Add Separator' );
1387 + $separator_name_attr = Utils::adminify_upgrade_pro( 'Add Separator' );
1502 1388 ?>
1503 1389
1504 1390 <div class='column <?php
1505 1391 echo esc_attr( $upgrade_pro );
@@ -1507,11 +1393,11 @@
1507 1393 <label for="seperator-<?php
1508 1394 echo esc_attr( $name_attr );
1509 1395 ?>">
1510 1396 <?php
1511 - $separator_content = apply_filters( 'pxlbsadminify/menu_editor/add_separator', $separator_name_attr, $separator );
1397 + $separator_content = apply_filters( 'adminify/menu_editor/add_separator', $separator_name_attr, $separator );
1512 1398 // Apply the filter
1513 - echo wp_kses_post( $separator_content || "" );
1399 + echo $separator_content;
1514 1400 ?>
1515 1401 </label>
1516 1402 </div>
1517 1403 </div>
@@ -1614,16 +1500,36 @@
1614 1500 ?>">
1615 1501 </div>
1616 1502 <div class="column">
1617 1503 <label for=""><?php
1618 - esc_html_e( 'Hidden For Roles or Users', 'adminify' );
1504 + esc_html_e( 'Hidden For Rules', 'adminify' );
1619 1505 ?></label>
1620 1506
1621 1507 <div class="select is-small">
1622 1508 <?php
1623 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- generate_user_rules_select_field() returns a trusted <select> template with form inputs that wp_kses_post() would strip; values inside are escaped.
1624 1509 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1625 1510 ?>
1511 +
1512 + <script>
1513 + jQuery('#<?php
1514 + echo esc_attr( $menu_id );
1515 + ?> #<?php
1516 + echo esc_attr( $menu_id );
1517 + ?>-user-role-types').tokenize2({
1518 + placeholder: '<?php
1519 + esc_html_e( 'Select roles or users', 'adminify' );
1520 + ?>'
1521 + });
1522 + jQuery(document).ready(function($) {
1523 + $('#<?php
1524 + echo esc_attr( $menu_id );
1525 + ?> #<?php
1526 + echo esc_attr( $menu_id );
1527 + ?>-user-role-types').on('tokenize:select', function(container) {
1528 + $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1529 + });
1530 + })
1531 + </script>
1626 1532 </div>
1627 1533 </div>
1628 1534 </div>
1629 1535 </div>
@@ -1728,16 +1634,38 @@
1728 1634 ?>">
1729 1635 </div>
1730 1636 <div class="column">
1731 1637 <label for=""><?php
1732 - esc_html_e( 'Hidden For Roles or Users', 'adminify' );
1638 + esc_html_e( 'Hidden For Rules', 'adminify' );
1733 1639 ?></label>
1734 1640
1735 1641 <div class="select is-small">
1642 +
1736 1643 <?php
1737 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- generate_user_rules_select_field() returns a trusted <select> template with form inputs that wp_kses_post() would strip; values inside are escaped.
1738 1644 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for, 'sub_menu' );
1739 1645 ?>
1646 +
1647 + <script>
1648 + jQuery('#wp-adminify-sub-menu-<?php
1649 + echo esc_attr( $menu_id );
1650 + ?> #<?php
1651 + echo esc_attr( $menu_id );
1652 + ?>-user-role-types').tokenize2({
1653 + placeholder: '<?php
1654 + esc_html_e( 'Select roles or users', 'adminify' );
1655 + ?>'
1656 + });
1657 + jQuery(document).ready(function($) {
1658 + $('#wp-adminify-sub-menu-<?php
1659 + echo esc_attr( $menu_id );
1660 + ?> #<?php
1661 + echo esc_attr( $menu_id );
1662 + ?>-user-role-types').on('tokenize:select', function(container) {
1663 + $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1664 + });
1665 + })
1666 + </script>
1667 +
1740 1668 </div>
1741 1669 </div>
1742 1670 </div>
1743 1671 <div class="columns">
@@ -1792,10 +1720,10 @@
1792 1720 /**
1793 1721 * Add New Menu Item.
1794 1722 */
1795 1723 public function render_add_new_menu_item( $submenu = false ) {
1796 - $add_item = apply_filters( 'pxlbsadminify/menu_editor', [
1797 - 'upgrade_pro' => Utils::upgrade_pro_notice( ' ' ),
1724 + $add_item = apply_filters( 'adminify/menu_editor', [
1725 + 'upgrade_pro' => Utils::adminify_upgrade_pro( ' ' ),
1798 1726 'upgrade_class' => 'upgrade-pro',
1799 1727 ] );
1800 1728 ?>
1801 1729 <div class="adminify-accordion adminify-add-new-menu-editor-item upgrade-pro adminify-field adminify-field-switcher adminify-depend-visible adminify-depend-on adminify-pro-notice <?php
@@ -1800,9 +1728,9 @@
1800 1728 ?>
1801 1729 <div class="adminify-accordion adminify-add-new-menu-editor-item upgrade-pro adminify-field adminify-field-switcher adminify-depend-visible adminify-depend-on adminify-pro-notice <?php
1802 1730 echo esc_attr( ( $submenu ? 'submenu' : '' ) );
1803 1731 ?> <?php
1804 - echo esc_attr( $add_item['upgrade_class'] );
1732 + echo Utils::wp_kses_custom( $add_item['upgrade_class'] );
1805 1733 ?>">
1806 1734 <div class="inner-text">
1807 1735 <i class="dashicons dashicons-plus-alt"></i>
1808 1736 <span class="title"><?php
@@ -1809,9 +1737,9 @@
1809 1737 esc_html_e( 'Add Item', 'adminify' );
1810 1738 ?></span>
1811 1739 </div>
1812 1740 <?php
1813 - echo wp_kses( $add_item['upgrade_pro'], Utils::kses_allowed_html() );
1741 + echo Utils::wp_kses_custom( $add_item['upgrade_pro'] );
1814 1742 ?>
1815 1743 </div>
1816 1744 <?php
1817 1745 }
@@ -1826,15 +1754,14 @@
1826 1754
1827 1755 <div class="adminify-flex adminify-flex-center adminify-justify-between">
1828 1756 <div class="adminify-menu-editor-help-urls adminify-flex adminify-flex-center adminify-gap-2">
1829 1757 <?php
1830 - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- help_urls() returns a trusted template containing inline SVG icons that wp_kses_post() would strip; URLs inside are passed through esc_url().
1831 - echo Utils::help_urls(
1758 + echo Utils::adminfiy_help_urls(
1832 1759 __( 'Menu Editor', 'adminify' ),
1833 1760 'https://wpadminify.com/kb/wordpress-dashboard-menu-editor/',
1834 1761 'https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8',
1835 1762 'https://www.facebook.com/groups/jeweltheme',
1836 - esc_url( \PXLBSAdminify\Inc\Admin\AdminSettings::support_url() )
1763 + \WPAdminify\Inc\Admin\AdminSettings::support_url()
1837 1764 );
1838 1765 ?>
1839 1766 </div>
1840 1767
@@ -1890,9 +1817,9 @@
1890 1817 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.00065 1.33334C4.31865 1.33334 1.33398 4.31801 1.33398 8.00001C1.33398 11.682 4.31865 14.6667 8.00065 14.6667C11.6827 14.6667 14.6673 11.682 14.6673 8.00001C14.6673 4.31801 11.6827 1.33334 8.00065 1.33334ZM2.66732 8.00001C2.66732 9.4145 3.22922 10.7711 4.22942 11.7712C5.22961 12.7714 6.58616 13.3333 8.00065 13.3333C9.41514 13.3333 10.7717 12.7714 11.7719 11.7712C12.7721 10.7711 13.334 9.4145 13.334 8.00001C13.334 6.58552 12.7721 5.22897 11.7719 4.22877C10.7717 3.22858 9.41514 2.66668 8.00065 2.66668C6.58616 2.66668 5.22961 3.22858 4.22942 4.22877C3.22922 5.22897 2.66732 6.58552 2.66732 8.00001V8.00001Z" fill="#4E4B66" />
1891 1818 </svg>
1892 1819
1893 1820 <?php
1894 - esc_html_e( 'If you have Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1821 + esc_html_e( 'If you have WP Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1895 1822 ?>
1896 1823
1897 1824 </p>
1898 1825 </div>
@@ -1900,9 +1827,9 @@
1900 1827
1901 1828 <?php
1902 1829 }
1903 1830
1904 - public function menu_editor_contents() {
1831 + public function jltwp_adminify_menu_editor_contents() {
1905 1832 ?>
1906 1833
1907 1834 <div class="wrap">
1908 1835 <div class="wp-adminify--menu--editor--container">