PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.1.9
Adminify – White Label, Admin Menu Editor, Login Customizer v3.1.9
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 +718 -826 4.2.63.1.9 View file →
@@ -1,12 +1,11 @@
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;
8 -use enshrined\svgSanitize\Sanitizer;
5 +use WPAdminify\Inc\Utils ;
6 +use WPAdminify\Inc\Admin\AdminSettings ;
7 +use WPAdminify\Inc\Modules\MenuEditor\MenuEditorAssets ;
9 8 // no direct access allowed
10 9 if ( !defined( 'ABSPATH' ) ) {
11 10 exit;
12 11 }
@@ -17,136 +16,72 @@
17 16 *
18 17 * @author WP Adminify <support@wpadminify.com>
19 18 */
20 19 if ( !class_exists( 'MenuEditor' ) ) {
21 - class MenuEditor extends MenuEditorModel {
22 - public $url;
23 -
24 - public $menu;
25 -
26 - public $users;
27 -
28 - public $roles;
29 -
30 - public $submenu;
31 -
32 - public $options = [];
33 -
34 - public $menu_settings = [];
35 -
36 - public static $instance;
37 -
38 - public static function get_instance() {
39 - if ( self::$instance === null ) {
40 - self::$instance = new self();
41 - }
42 - return self::$instance;
43 - }
44 -
45 - public function __construct() {
20 + class MenuEditor extends MenuEditorModel
21 + {
22 + public $url ;
23 + public $menu ;
24 + public $submenu ;
25 + public function __construct()
26 + {
27 + $this->url = WP_ADMINIFY_URL . 'Inc/Modules/MenuEditor';
46 28 $this->menu_settings = ( new MenuEditorOptions() )->get();
47 29 $this->options = (array) AdminSettings::get_instance()->get();
48 - add_filter( 'upload_mimes', [$this, 'custom_icon_mime_types'] );
49 - add_filter( 'wp_handle_upload_prefilter', [$this, 'sanitize_svg_file'] );
50 - add_filter( 'admin_body_class', [$this, 'menu_editor_body_class'] );
51 - // add_filter('parent_file', [$this, 'set_menu'], 800);
52 - // 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 ) ) {
55 - add_filter( 'parent_file', [$this, 'set_menu'], 800 );
56 - add_filter( 'parent_file', [$this, 'apply_menu'], 900 );
57 - }
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'] );
30 + add_filter( 'upload_mimes', [ $this, 'custom_icon_mime_types' ] );
31 + add_action( 'admin_menu', [ $this, 'jltwp_adminify_menu_editor_submenu' ], 51 );
32 + add_filter( 'admin_body_class', [ $this, 'jltwp_adminify_menu_editor_body_class' ] );
33 + add_filter( 'parent_file', [ $this, 'set_menu' ], 800 );
34 + add_filter( 'parent_file', [ $this, 'apply_menu' ], 900 );
35 + add_action( 'wp_ajax_adminify_save_menu_settings', [ $this, 'adminify_save_menu_settings' ] );
36 + add_action( 'wp_ajax_adminify_reset_menu_settings', [ $this, 'adminify_reset_menu_settings' ] );
37 + add_action( 'wp_ajax_adminify_export_menu_settings', [ $this, 'adminify_export_menu_settings' ] );
38 + add_action( 'wp_ajax_adminify_import_menu_settings', [ $this, 'adminify_import_menu_settings' ] );
39 + add_action( 'wp_ajax_adminify_file_upload', [ $this, 'adminify_file_upload_callback' ] );
40 + add_action( 'wp_ajax_adminify_load_custom_icons', [ $this, 'adminify_load_custom_icons_callback' ] );
65 41 new MenuEditorAssets();
66 42 }
67 -
68 - public function custom_icon_mime_types( $mimes ) {
69 - if ( current_user_can( 'administrator' ) ) {
70 - $mimes['svg'] = 'image/svg+xml';
71 - }
43 +
44 + public function custom_icon_mime_types( $mimes )
45 + {
46 + $mimes['svg'] = 'image/svg+xml';
72 47 return $mimes;
73 48 }
74 -
75 - public function sanitize_svg_file( $file ) {
76 - // Step 1: Validate File Type
77 - $file_type = wp_check_filetype( $file['name'] );
78 - // Ensure the file is an SVG
79 - if ( $file_type['ext'] === 'svg' ) {
80 - // Read the contents of the SVG file
81 - $file_contents = file_get_contents( $file['tmp_name'] );
82 - // Validate if it's an actual SVG by checking if it contains the <svg> tag
83 - if ( strpos( $file_contents, '<svg' ) === false ) {
84 - $file['error'] = 'Invalid SVG file';
85 - return $file;
86 - // Stop further processing if it's not a valid SVG
87 - }
88 - // Step 2: Sanitize the SVG File
89 - $sanitizer = new Sanitizer();
90 - $clean_svg = $sanitizer->sanitize( $file_contents );
91 - if ( $clean_svg ) {
92 - // Save the sanitized SVG back to the file
93 - file_put_contents( $file['tmp_name'], $clean_svg );
94 - } else {
95 - $file['error'] = 'Failed to sanitize the SVG file';
96 - }
97 - }
98 - return $file;
99 - }
100 -
101 - public function filter_attachment( $value ) {
49 +
50 + public function filter_attachment( $value )
51 + {
102 52 // return $value->post_title == 'adminify-custom-icon';
103 53 return strpos( $value->guid, 'adminify-custom-icon' ) !== false;
104 54 }
105 -
106 - public function load_custom_icons_callback() {
107 - // Security check - verify nonce and capability
108 - check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' );
109 - if ( !current_user_can( 'manage_options' ) ) {
110 - wp_send_json_error( array(
111 - 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
112 - ) );
113 - }
55 +
56 + public function adminify_load_custom_icons_callback()
57 + {
114 58 $result['images'] = null;
115 59 $query = get_posts( [
116 60 'post_type' => 'attachment',
117 61 'numberposts' => -1,
118 62 ] );
119 - $filtered = array_filter( $query, [$this, 'filter_attachment'] );
63 + $filtered = array_filter( $query, [ $this, 'filter_attachment' ] );
120 64 foreach ( $filtered as $key => $value ) {
121 65 $result['images'][$value->ID] = $value->guid;
122 66 }
123 - echo wp_json_encode( $result );
67 + echo wp_json_encode( $result ) ;
124 68 die;
125 69 }
126 -
127 - public function file_upload_callback() {
70 +
71 + public function adminify_file_upload_callback()
72 + {
128 73 $result['status'] = false;
129 - check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' );
130 - if ( !current_user_can( 'manage_options' ) ) {
131 - wp_send_json_error( array(
132 - 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
133 - ) );
134 - }
74 + check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' );
135 75 $upload_dir = wp_upload_dir();
136 76 $targeted_dir = $upload_dir['basedir'] . '/adminify-custom-icons';
137 77 if ( !is_dir( $targeted_dir ) ) {
138 78 wp_mkdir_p( $targeted_dir );
139 79 }
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.
80 + add_filter( 'upload_dir', [ $this, 'adminify_icon_custom_upload_dir' ] );
147 81 $files = wp_kses_post_deep( wp_unslash( $_FILES['my_file_upload'] ) );
148 82 foreach ( $files['name'] as $key => $value ) {
83 +
149 84 if ( $files['name'][$key] ) {
150 85 $file = [
151 86 'name' => $files['name'][$key],
152 87 'type' => $files['type'][$key],
@@ -157,8 +92,9 @@
157 92 $_FILES = [
158 93 'upload_file' => $file,
159 94 ];
160 95 $attachment_id = media_handle_upload( 'upload_file', 0 );
96 +
161 97 if ( is_wp_error( $attachment_id ) ) {
162 98 // There was an error uploading the image.
163 99 $result['status'] = false;
164 100 $result['message'] = __( 'Error uploading file.', 'adminify' );
@@ -167,16 +103,19 @@
167 103 $result['status'] = true;
168 104 $result['message'] = __( 'File Uploaded successfully.', 'adminify' );
169 105 $result['images'][$attachment_id] = wp_get_attachment_url( $attachment_id );
170 106 }
107 +
171 108 }
109 +
172 110 }
173 - remove_filter( 'upload_dir', [$this, 'icon_custom_upload_dir'] );
174 - echo wp_json_encode( $result );
111 + remove_filter( 'upload_dir', [ $this, 'adminify_icon_custom_upload_dir' ] );
112 + echo wp_json_encode( $result ) ;
175 113 wp_die();
176 114 }
177 -
178 - public function icon_custom_upload_dir( $dir_data ) {
115 +
116 + public function adminify_icon_custom_upload_dir( $dir_data )
117 + {
179 118 // $dir_data already you might want to use
180 119 $custom_dir = 'adminify-custom-icons';
181 120 return [
182 121 'path' => $dir_data['basedir'] . '/' . $custom_dir,
@@ -186,80 +125,16 @@
186 125 'baseurl' => $dir_data['baseurl'],
187 126 'error' => $dir_data['error'],
188 127 ];
189 128 }
190 -
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 -
129 +
256 130 // Menu Editor Body Class
257 - public function menu_editor_body_class( $classes ) {
131 + public function jltwp_adminify_menu_editor_body_class( $classes )
132 + {
258 133 $classes .= ' adminify_menu_editor ';
259 134 return $classes;
260 135 }
261 -
136 +
262 137 /**
263 138 * Sanitises and strips tags of input from ajax
264 139 *
265 140 * @since 1.0.0
@@ -264,23 +139,28 @@
264 139 *
265 140 * @since 1.0.0
266 141 * @variables $values = item to clean (array or string)
267 142 */
268 - public function clean_ajax_input( $values ) {
143 + public function clean_ajax_input( $values )
144 + {
145 +
269 146 if ( is_array( $values ) ) {
270 147 foreach ( $values as $index => $in ) {
148 +
271 149 if ( is_array( $in ) ) {
272 150 $values[$index] = $this->clean_ajax_input( $in );
273 151 } else {
274 - $values[$index] = wp_strip_all_tags( $in );
152 + $values[$index] = strip_tags( $in );
275 153 }
154 +
276 155 }
277 156 } else {
278 - $values = wp_strip_all_tags( $values );
157 + $values = strip_tags( $values );
279 158 }
159 +
280 160 return $values;
281 161 }
282 -
162 +
283 163 /**
284 164 * Returns ajax error
285 165 *
286 166 * @since 1.4
@@ -285,163 +165,130 @@
285 165 *
286 166 * @since 1.4
287 167 * @variables $message = error message to send back to user (string)
288 168 */
289 - public function ajax_error_message( $message ) {
169 + public function ajax_error_message( $message )
170 + {
290 171 $returndata = [];
291 172 $returndata['error'] = true;
292 173 $returndata['error_message'] = $message;
293 - return wp_json_encode( $returndata );
174 + return json_encode( $returndata );
294 175 }
295 -
296 - public function save_menu_settings() {
297 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
298 - if ( !current_user_can( 'manage_options' ) ) {
299 - wp_send_json_error( array(
300 - 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
301 - ) );
302 - }
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.
176 +
177 + public function adminify_save_menu_settings()
178 + {
179 +
180 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
181 + $options = wp_kses_post_deep( wp_unslash( $_POST['options'] ) );
305 182 $options = $this->clean_ajax_input( $options );
183 +
306 184 if ( $options == '' || !is_array( $options ) ) {
307 185 $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 ) );
186 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ) ;
310 187 die;
311 188 }
189 +
190 +
312 191 if ( is_array( $options ) ) {
313 192 update_option( $this->prefix, $options );
314 193 $returndata = [];
315 194 $returndata['success'] = true;
316 195 $returndata['message'] = __( 'Settings saved', 'adminify' );
317 - echo wp_json_encode( $returndata );
196 + echo json_encode( $returndata ) ;
318 197 die;
319 198 } else {
320 199 $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 ) );
200 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ) ;
323 201 die;
324 202 }
203 +
325 204 }
205 +
326 206 die;
327 207 }
328 -
208 +
329 209 /**
330 210 * Menu Editor Settings Reset
331 211 *
332 212 * @return void
333 213 */
334 - public function reset_menu_settings() {
335 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
336 - if ( !current_user_can( 'manage_options' ) ) {
337 - wp_send_json_error( array(
338 - 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
339 - ) );
340 - }
214 + public function adminify_reset_menu_settings()
215 + {
216 +
217 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
341 218 update_option( $this->prefix, [] );
342 219 $menu_editor_options = get_option( $this->prefix );
220 +
343 221 if ( !$menu_editor_options ) {
344 222 $returndata = [];
345 223 $returndata['success'] = true;
346 224 $returndata['message'] = __( 'Settings reset', 'adminify' );
347 - echo wp_json_encode( $returndata );
225 + echo json_encode( $returndata ) ;
348 226 die;
349 227 } else {
350 228 $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 ) );
229 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ) ;
353 230 die;
354 231 }
232 +
355 233 }
234 +
356 235 die;
357 236 }
358 -
237 +
359 238 /**
360 239 * Export Menu Editor Settings
361 240 *
362 241 * @return void
363 242 */
364 - public function export_menu_settings() {
365 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
366 - if ( !current_user_can( 'manage_options' ) ) {
367 - wp_send_json_error( array(
368 - 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
369 - ) );
370 - }
243 + public function adminify_export_menu_settings()
244 + {
245 +
246 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
371 247 $menu_editor_options = get_option( $this->prefix );
372 - echo wp_json_encode( $menu_editor_options );
248 + echo json_encode( $menu_editor_options ) ;
373 249 }
250 +
374 251 die;
375 252 }
376 -
253 +
377 254 /**
378 255 * Import Menu Editor Settings
379 256 *
380 257 * @since 1.0.0
381 258 */
382 - public function import_menu_settings() {
383 - if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'pxlbsadminify-menu-editor-security-nonce', 'security' ) > 0 ) {
384 - if ( !current_user_can( 'manage_options' ) ) {
385 - wp_send_json_error( array(
386 - 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
387 - ) );
388 - }
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().
259 + public function adminify_import_menu_settings()
260 + {
261 +
262 + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
263 + $new_options = wp_kses_post_deep( $_POST['settings'] );
264 +
391 265 if ( $new_options == '' || !is_array( $new_options ) ) {
392 266 $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 ) );
267 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ) ;
395 268 die;
396 269 }
270 +
271 +
397 272 if ( is_array( $new_options ) ) {
398 273 update_option( $this->prefix, $new_options );
399 274 $returndata = [];
400 275 $returndata['success'] = true;
401 276 $returndata['message'] = __( 'Menu Imported', 'adminify' );
402 - echo wp_json_encode( $returndata );
277 + echo json_encode( $returndata ) ;
403 278 die;
404 279 } else {
405 280 $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 ) );
281 + echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ) ;
408 282 die;
409 283 }
284 +
410 285 }
286 +
411 287 die;
412 288 }
413 -
289 +
414 290 /**
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 291 * Get menu items
445 292 *
446 293 * @param [type] $parent_file
447 294 *
@@ -446,51 +293,37 @@
446 293 * @param [type] $parent_file
447 294 *
448 295 * @return void
449 296 */
450 - public function set_menu( $parent_file ) {
451 - global $menu, $submenu;
297 + public function set_menu( $parent_file )
298 + {
299 + global $menu, $submenu ;
452 300 $this->menu = $this->sort_menu_settings( $menu );
453 301 $this->submenu = $this->sort_sub_menu_settings( $this->menu, $submenu );
454 302 return $parent_file;
455 303 }
456 -
304 +
457 305 /**
458 306 * Sorts Menu's for Option settings
459 307 */
460 - public function sort_menu_settings( $thismenu ) {
308 + public function sort_menu_settings( $thismenu )
309 + {
461 310 $menu_settings = $this->menu_settings;
462 311 $tempmenu = [];
463 312 foreach ( $thismenu as $key => $current_menu_item ) {
464 - if ( $current_menu_item[4] === "wp-menu-separator" ) {
465 - unset($thismenu[$key]);
466 - continue;
467 - }
468 - if ( !current_user_can( 'administrator' ) && $current_menu_item[2] === 'vc-welcome' ) {
469 - unset($thismenu[$key]);
470 - continue;
471 - }
472 313 $next_menu_item = next( $thismenu );
473 314 $optiongroup = [];
474 315 $order = $key;
475 316 $separator = 0;
476 - $external_link = 0;
477 317 $icon = null;
478 318 $hidden_for = [];
479 - if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
319 + if ( !empty($next_menu_item) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
480 320 $separator = 1;
481 321 }
482 322 if ( is_array( $menu_settings ) ) {
483 - // Direct slug match first, then fallback for dynamic-slug plugins (e.g. Yoast SEO)
323 +
484 324 if ( isset( $menu_settings[$current_menu_item[2]] ) ) {
485 325 $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 326 if ( isset( $optiongroup['order'] ) ) {
494 327 $order = $optiongroup['order'];
495 328 }
496 329 if ( isset( $optiongroup['separator'] ) ) {
@@ -495,144 +328,144 @@
495 328 }
496 329 if ( isset( $optiongroup['separator'] ) ) {
497 330 $separator = $optiongroup['separator'];
498 331 }
499 - if ( isset( $optiongroup['external_link'] ) ) {
500 - $external_link = $optiongroup['external_link'];
501 - }
502 - if ( !empty( $optiongroup['icon'] ) ) {
332 + if ( !empty($optiongroup['icon']) ) {
503 333 $icon = $optiongroup['icon'];
504 334 }
505 - if ( !empty( $optiongroup['hidden_for'] ) ) {
335 + if ( !empty($optiongroup['hidden_for']) ) {
506 336 $hidden_for = $optiongroup['hidden_for'];
507 337 }
508 338 }
339 +
509 340 }
510 341 $current_menu_item['order'] = $order;
511 - $current_menu_item['hidden_for'] = $hidden_for;
512 342 $current_menu_item['separator'] = $separator;
513 - $current_menu_item['external_link'] = $external_link;
514 - // if (empty($this->options['admin_ui'])) {
515 - if ( $icon !== null ) {
516 - if ( strpos( $icon, 'dashicons ' ) !== false ) {
517 - $menu_icon = str_replace( 'dashicons ', '', $icon );
518 - $current_menu_item[6] = $menu_icon;
519 - } else {
520 - if ( strpos( $icon, ',' ) !== false ) {
521 - $menu_icon = explode( ',', $icon )[1];
343 +
344 + if ( empty($this->options['admin_ui']) ) {
345 + if ( $icon !== null ) {
346 +
347 + if ( strpos( $icon, 'dashicons ' ) !== false ) {
348 + $menu_icon = str_replace( 'dashicons ', '', $icon );
349 + $current_menu_item[6] = $menu_icon;
522 350 } else {
523 - $menu_icon = 'dashicons-adminify- ' . $icon;
351 +
352 + if ( strpos( $icon, ',' ) !== false ) {
353 + $menu_icon = explode( ',', $icon )[1];
354 + } else {
355 + $menu_icon = 'dashicons-adminify- ' . $icon;
356 + }
357 +
358 + $current_menu_item[6] = $menu_icon;
524 359 }
525 - $current_menu_item[6] = $menu_icon;
360 +
526 361 }
362 + if ( $separator == 1 ) {
363 + $current_menu_item[4] = $current_menu_item[4] . ' adminify-menu-separator';
364 + }
527 365 }
528 - if ( $separator == 1 ) {
529 - $current_menu_item[4] = $current_menu_item[4] . ' adminify-menu-separator';
530 - }
531 - // }
366 +
532 367 array_push( $tempmenu, $current_menu_item );
533 368 if ( isset( $menu_settings[$current_menu_item[2]] ) ) {
534 - unset($menu_settings[$current_menu_item[2]]);
369 + unset( $menu_settings[$current_menu_item[2]] );
535 370 }
536 371 }
537 372 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
538 373 foreach ( $menu_settings as $key => $menu_s ) {
539 - // Skip if $menu_s is not an array
540 - if ( !is_array( $menu_s ) ) {
541 - continue;
542 - }
543 - // Ensure required keys exist with defaults
544 - $menu_s = wp_parse_args( $menu_s, [
545 - 'name' => '',
546 - 'link' => '',
547 - 'icon' => '',
548 - 'order' => 0,
549 - 'separator' => 0,
550 - 'external_link' => 0,
551 - 'hidden_for' => [],
552 - ] );
553 374 $new_array = [
554 375 $menu_s['name'],
555 376 'read',
556 - ( !empty( $menu_s['link'] ) ? $menu_s['link'] : '' ),
377 + ( !empty($menu_s['link']) ? $menu_s['link'] : '' ),
557 378 '',
558 379 'menu-top menu-icon-custom',
559 380 $key,
560 - ( !empty( $menu_s['icon'] ) ? $menu_s['icon'] : '' ),
381 + ( !empty($menu_s['icon']) ? $menu_s['icon'] : '' ),
561 382 'order' => $menu_s['order'],
562 - 'separator' => ( !empty( $menu_s['separator'] ) ? $menu_s['separator'] : 0 ),
563 - 'external_link' => ( !empty( $menu_s['external_link'] ) ? $menu_s['external_link'] : 0 ),
564 - 'hidden_for' => ( !empty( $menu_s['hidden_for'] ) ? $menu_s['hidden_for'] : [] )
383 + 'separator' => ( !empty($menu_s['separator']) ? $menu_s['separator'] : 0 ),
384 + 'hidden_for' => ( !empty($menu_s['hidden_for']) ? $menu_s['hidden_for'] : [] )
565 385 ];
566 - // if (empty($this->options['admin_ui'])) {
567 - if ( strpos( $menu_s['icon'], 'dashicons ' ) !== false ) {
568 - $menu_icon = str_replace( 'dashicons ', '', $menu_s['icon'] );
569 - } else {
570 - if ( empty( $menu_s['icon'] ) || strpos( $menu_s['icon'], ',' ) !== false ) {
571 - if ( empty( $menu_s['icon'] ) ) {
572 - $menu_icon = PXLBSADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
386 +
387 + if ( empty($this->options['admin_ui']) ) {
388 +
389 + if ( strpos( $menu_s['icon'], 'dashicons ' ) !== false ) {
390 + $menu_icon = str_replace( 'dashicons ', '', $menu_s['icon'] );
391 + } else {
392 +
393 + if ( empty($menu_s['icon']) || strpos( $menu_s['icon'], ',' ) !== false ) {
394 +
395 + if ( empty($menu_s['icon']) ) {
396 + $menu_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
397 + } else {
398 + $menu_icon = explode( ',', $menu_s['icon'] )[1];
399 + }
400 +
573 401 } else {
574 - $menu_icon = explode( ',', $menu_s['icon'] )[1];
402 + $menu_icon = 'dashicons-adminify- ' . $menu_s['icon'];
575 403 }
576 - } else {
577 - $menu_icon = 'dashicons-adminify- ' . $menu_s['icon'];
404 +
578 405 }
406 +
407 + if ( $menu_s['separator'] == 1 ) {
408 + $new_array[4] = $new_array[4] . ' adminify-menu-separator';
409 + }
410 + $new_array[6] = $menu_icon;
579 411 }
580 - if ( !empty( $menu_s['separator'] ) && $menu_s['separator'] == 1 ) {
581 - $new_array[4] = $new_array[4] . ' adminify-menu-separator';
582 - }
583 - // if (!empty($menu_s['external_link']) && $menu_s['external_link'] == 1) {
584 - // $new_array[4] = $new_array[4] . ' adminify-menu-external_link';
585 - // }
586 - $new_array[6] = $menu_icon;
587 - // }
412 +
588 413 array_push( $tempmenu, $new_array );
589 414 }
590 415 }
591 416 return $this->sort_array( $tempmenu );
592 417 }
593 -
418 +
594 419 /**
595 420 * usort function for menu arrays
596 421 */
597 - public function sort_array_helper( $a, $b ) {
422 + public function sort_array_helper( $a, $b )
423 + {
598 424 $result = 0;
599 425 if ( !isset( $a['order'] ) ) {
600 426 return $result;
601 427 }
428 +
602 429 if ( $a['order'] > $b['order'] ) {
603 430 $result = 1;
604 431 } elseif ( $a['order'] < $b['order'] ) {
605 432 $result = -1;
606 433 }
434 +
607 435 return $result;
608 436 }
609 -
437 +
610 438 /**
611 439 * Sorts arrays by key 'order'
612 440 */
613 - public function sort_array( $tosort ) {
614 - usort( $tosort, [$this, 'sort_array_helper'] );
441 + public function sort_array( $tosort )
442 + {
443 + usort( $tosort, [ $this, 'sort_array_helper' ] );
615 444 return $tosort;
616 445 }
617 -
446 +
618 447 /**
619 448 * Sorts Sub Menu for settings
620 449 *
621 450 * @since 1.4
622 451 */
623 - public function sort_sub_menu_settings( $themenu, $thesubmenu ) {
452 + public function sort_sub_menu_settings( $themenu, $thesubmenu )
453 + {
624 454 $menu_settings = $this->menu_settings;
625 455 $tempsubmenu = [];
626 456 foreach ( $themenu as $current_menu_item ) {
627 457 $optiongroup = [];
628 458 $submenu_items = [];
459 +
629 460 if ( isset( $thesubmenu[$current_menu_item[2]] ) ) {
630 461 $submenuitems = $thesubmenu[$current_menu_item[2]];
631 462 foreach ( $submenuitems as $key => $subitem ) {
632 463 $subitem['order'] = $key;
464 +
633 465 if ( is_array( $menu_settings ) && isset( $menu_settings[$current_menu_item[2]] ) && isset( $menu_settings[$current_menu_item[2]]['submenu'] ) ) {
634 466 $submenugroup = $menu_settings[$current_menu_item[2]]['submenu'];
467 +
635 468 if ( isset( $submenugroup[$subitem[2]] ) ) {
636 469 $itemoptions = $submenugroup[$subitem[2]];
637 470 if ( isset( $itemoptions['order'] ) ) {
638 471 $subitem['order'] = $itemoptions['order'];
@@ -637,18 +470,23 @@
637 470 if ( isset( $itemoptions['order'] ) ) {
638 471 $subitem['order'] = $itemoptions['order'];
639 472 }
640 473 }
474 +
641 475 }
476 +
642 477 array_push( $submenu_items, $subitem );
643 478 }
644 479 $submenu_items = $this->sort_array( $submenu_items );
645 480 $tempsubmenu[$current_menu_item[2]] = $submenu_items;
646 481 }
482 +
647 483 }
484 +
648 485 if ( is_array( $menu_settings ) ) {
649 486 $tmp_menu = [];
650 487 foreach ( $menu_settings as $key => $menu_s ) {
488 +
651 489 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
652 490 $tmp_sub_menu = [];
653 491 $i = 0;
654 492 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
@@ -667,15 +505,16 @@
667 505 // processing submenu array
668 506 $tmp_sub_menu[$order] = $new_array;
669 507 $i++;
670 508 }
671 - if ( !empty( $tmp_sub_menu ) ) {
509 + if ( !empty($tmp_sub_menu) ) {
672 510 // adding submenu into temp variable
673 511 $tmp_menu[$key] = $tmp_sub_menu;
674 512 }
675 513 }
514 +
676 515 }
677 - if ( !empty( $tmp_menu ) ) {
516 + if ( !empty($tmp_menu) ) {
678 517 $tempsubmenu = array_merge_recursive( $tempsubmenu, $tmp_menu );
679 518 }
680 519 foreach ( $tempsubmenu as $m_k => $m_menu ) {
681 520 $tempsubmenu[$m_k] = $this->sort_array( $tempsubmenu[$m_k] );
@@ -680,28 +519,31 @@
680 519 foreach ( $tempsubmenu as $m_k => $m_menu ) {
681 520 $tempsubmenu[$m_k] = $this->sort_array( $tempsubmenu[$m_k] );
682 521 }
683 522 }
523 +
684 524 return $tempsubmenu;
685 525 }
686 -
526 +
687 527 /**
688 528 * Applies menu settings
689 529 */
690 - public function apply_menu( $parent_file ) {
530 + public function apply_menu( $parent_file )
531 + {
691 532 // Not applicable for Network Admin
692 533 if ( is_multisite() && is_network_admin() ) {
693 534 return;
694 535 }
695 - global $menu, $submenu;
536 + global $menu, $submenu ;
696 537 $tempmenu = [];
697 538 $tempsub = [];
698 539 $submenu = $this->sort_sub_menu_settings( $menu, $submenu );
699 540 if ( $this->menu && is_array( $this->menu ) ) {
700 541 foreach ( $this->menu as $key => $menu_item ) {
701 - if ( empty( $menu_item[2] ) ) {
542 + if ( empty($menu_item[0]) ) {
702 543 continue;
703 544 }
545 +
704 546 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
705 547 // Build Separator
706 548 $newitem = $this->apply_separator_settings( $menu_item, $key );
707 549 if ( $newitem ) {
@@ -709,27 +551,16 @@
709 551 }
710 552 } else {
711 553 // Build Top Level
712 554 $newitem = $this->apply_top_level_settings( $menu_item, $key );
555 +
713 556 if ( $newitem ) {
714 557 array_push( $tempmenu, $newitem );
715 - // Menu Editor Custom Separator
716 - if ( !empty( $newitem['separator'] ) ) {
717 - $separator_order = $this->menu[$key]['order'];
718 - $empty_separator = array(
719 - 0 => '',
720 - 1 => 'read',
721 - 2 => 'separator_' . wp_rand( 200, 1000 ) * 1000,
722 - 3 => '',
723 - 4 => 'wp-menu-separator',
724 - 'order' => $separator_order + 0.5,
725 - );
726 - array_push( $tempmenu, $empty_separator );
727 - }
728 558 $parent_key = $newitem[2];
729 559 if ( strpos( $newitem[5], 'adminify-custom-menu-' ) !== false ) {
730 560 $parent_key = $newitem[5];
731 561 }
562 +
732 563 if ( isset( $this->submenu[$parent_key] ) ) {
733 564 $subitem = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
734 565 if ( $subitem ) {
735 566 $tempsub[$newitem[2]] = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
@@ -734,10 +565,13 @@
734 565 if ( $subitem ) {
735 566 $tempsub[$newitem[2]] = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
736 567 }
737 568 }
569 +
738 570 }
571 +
739 572 }
573 +
740 574 }
741 575 }
742 576 $submenu = $tempsub;
743 577 $menu = $this->sort_array( $tempmenu );
@@ -742,17 +576,16 @@
742 576 $submenu = $tempsub;
743 577 $menu = $this->sort_array( $tempmenu );
744 578 return $parent_file;
745 579 }
746 -
580 +
747 581 /**
748 - * Applies sub level menu item settings
582 + * Applies top level menu item settings
749 583 *
750 - * @return $tempsub | false
751 - *
752 584 * @since 1.4
753 585 */
754 - public function apply_sub_level_settings( $subitems, $parentname ) {
586 + public function apply_sub_level_settings( $subitems, $parentname )
587 + {
755 588 if ( !is_array( $this->menu_settings ) ) {
756 589 return $subitems;
757 590 }
758 591 if ( !isset( $this->menu_settings[$parentname]['submenu'] ) ) {
@@ -760,15 +593,10 @@
760 593 }
761 594 $submenu_settings = $this->menu_settings[$parentname]['submenu'];
762 595 $tempsub = [];
763 596 foreach ( $subitems as $current_menu_item ) {
764 - $sub_level = apply_filters( 'pxlbsadminify/menu_editor', [
765 - 'sub_level' => false,
766 - ] );
767 - if ( !empty( $sub_level['sub_level'] ) ) {
768 - if ( empty( $current_menu_item[0] ) || $current_menu_item[2] === 'wp-adminify-settings-pricing' ) {
769 - continue;
770 - }
597 + if ( empty($current_menu_item[0]) || $current_menu_item[2] === 'wp-adminify-settings-pricing' && jltwp_adminify()->can_use_premium_code__premium_only() ) {
598 + continue;
771 599 }
772 600 $name = '';
773 601 $link = '';
774 602 $disabled_for = [];
@@ -773,10 +601,12 @@
773 601 $link = '';
774 602 $disabled_for = [];
775 603 $optiongroup = [];
776 604 // NO SETTINGS
605 +
777 606 if ( isset( $submenu_settings[$current_menu_item[2]] ) ) {
778 607 $optiongroup = $submenu_settings[$current_menu_item[2]];
608 +
779 609 if ( isset( $optiongroup['name'] ) ) {
780 610 $name = $optiongroup['name'];
781 611 if ( $name != '' ) {
782 612 $current_menu_item[0] = $name;
@@ -781,54 +611,65 @@
781 611 if ( $name != '' ) {
782 612 $current_menu_item[0] = $name;
783 613 }
784 614 }
615 +
616 +
785 617 if ( isset( $optiongroup['link'] ) ) {
786 618 $link = $optiongroup['link'];
619 +
787 620 if ( $link != '' ) {
788 621 $current_menu_item[2] = $link;
789 622 $current_menu_item['link'] = $link;
790 623 }
624 +
791 625 }
792 - if ( isset( $optiongroup['external_link'] ) ) {
793 - $external_link = $optiongroup['external_link'];
794 - }
626 +
627 +
795 628 if ( isset( $optiongroup['hidden_for'] ) ) {
796 629 $disabled_for = $optiongroup['hidden_for'];
630 +
797 631 if ( $this->is_hidden( $disabled_for ) ) {
798 - $current_menu_item['hidden_for'] = true;
632 + $current_menu_item['hidden'] = true;
799 633 continue;
800 634 }
635 +
801 636 }
637 +
802 638 }
639 +
803 640 $custom_menu = ( isset( $current_menu_item['key'] ) ? $current_menu_item['key'] : '' );
641 +
804 642 if ( strpos( $custom_menu, 'adminify-custom-submenu-' ) !== false ) {
805 643 if ( isset( $submenu_settings[$current_menu_item['key']]['hidden_for'] ) ) {
806 644 $disabled_for = $submenu_settings[$current_menu_item['key']]['hidden_for'];
807 645 }
808 - if ( isset( $submenu_settings[$current_menu_item['key']]['external_link'] ) ) {
809 - $external_link = $submenu_settings[$current_menu_item['key']]['external_link'];
810 - }
646 +
811 647 if ( $this->is_hidden( $disabled_for ) ) {
812 - $current_menu_item['hidden_for'] = true;
648 + $current_menu_item['hidden'] = true;
813 649 continue;
814 650 }
651 +
815 652 }
653 +
816 654 array_push( $tempsub, $current_menu_item );
817 655 }
656 +
818 657 if ( count( $tempsub ) < 1 ) {
819 658 return false;
820 659 } else {
821 660 return $tempsub;
822 661 }
662 +
823 663 }
824 -
664 +
825 665 /**
826 666 * Applies top level menu item settings
827 667 *
828 668 * @since 1.4
829 669 */
830 - public function apply_top_level_settings( $current_menu_item, $key ) {
670 + public function apply_top_level_settings( $current_menu_item, $key )
671 + {
831 672 $name = '';
832 673 $link = '';
833 674 $icon = '';
834 675 $disabled_for = [];
@@ -833,19 +674,14 @@
833 674 $icon = '';
834 675 $disabled_for = [];
835 676 $optiongroup = [];
836 677 $order = $key;
678 +
837 679 if ( is_array( $this->menu_settings ) ) {
838 - // Direct slug match first, then fallback for dynamic-slug plugins (e.g. Yoast SEO)
680 +
839 681 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
840 682 $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 ) ) {
683 +
848 684 if ( isset( $optiongroup['name'] ) ) {
849 685 $name = $optiongroup['name'];
850 686 if ( $name != '' ) {
851 687 $current_menu_item[0] = $name;
@@ -850,18 +686,21 @@
850 686 if ( $name != '' ) {
851 687 $current_menu_item[0] = $name;
852 688 }
853 689 }
690 +
691 +
854 692 if ( isset( $optiongroup['link'] ) ) {
855 693 $link = $optiongroup['link'];
694 +
856 695 if ( $link != '' ) {
857 696 $current_menu_item[2] = $link;
858 697 $current_menu_item['link'] = $link;
859 698 }
699 +
860 700 }
861 - if ( isset( $optiongroup['external_link'] ) ) {
862 - $external_link = ( $optiongroup['external_link'] ? $optiongroup['external_link'] : '' );
863 - }
701 +
702 +
864 703 if ( isset( $optiongroup['icon'] ) ) {
865 704 $icon = $optiongroup['icon'];
866 705 if ( $icon != '' ) {
867 706 $current_menu_item['icon'] = $icon;
@@ -866,50 +705,51 @@
866 705 if ( $icon != '' ) {
867 706 $current_menu_item['icon'] = $icon;
868 707 }
869 708 }
709 +
870 710 if ( isset( $optiongroup['order'] ) ) {
871 711 $order = $optiongroup['order'];
872 712 }
713 +
873 714 if ( isset( $optiongroup['hidden_for'] ) ) {
874 715 $disabled_for = $optiongroup['hidden_for'];
875 716 if ( $this->is_hidden( $disabled_for ) ) {
876 - $current_menu_item['hidden_for'] = true;
877 - } else {
878 - $current_menu_item['hidden_for'] = false;
717 + $current_menu_item['hidden'] = true;
879 718 }
880 719 }
720 +
881 721 }
722 +
882 723 $custom_menu = ( isset( $current_menu_item[5] ) ? $current_menu_item[5] : '' );
724 +
883 725 if ( strpos( $custom_menu, 'adminify-custom-menu-' ) !== false ) {
884 - if ( isset( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) && !empty( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) ) {
726 + if ( isset( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) ) {
885 727 $disabled_for = $this->menu_settings[$current_menu_item[5]]['hidden_for'];
886 - if ( $this->is_hidden( $disabled_for ) ) {
887 - $current_menu_item['hidden_for'] = true;
888 - }
889 728 }
890 - if ( isset( $this->menu_settings[$current_menu_item[5]]['external_link'] ) ) {
891 - $external_link = $this->menu_settings[$current_menu_item[5]]['external_link'];
729 + if ( $this->is_hidden( $disabled_for ) ) {
730 + $current_menu_item['hidden'] = true;
892 731 }
893 732 }
733 +
894 734 }
735 +
895 736 $current_menu_item['order'] = $order;
896 - // Check hidden_for: boolean true means hide, array means check via is_hidden
897 - if ( isset( $current_menu_item['hidden_for'] ) ) {
898 - if ( $current_menu_item['hidden_for'] === true ) {
737 +
738 + if ( isset( $current_menu_item['hidden'] ) ) {
739 +
740 + if ( $current_menu_item['hidden'] == true ) {
899 741 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 - }
742 + } else {
743 + return $current_menu_item;
905 744 }
906 - return $current_menu_item;
745 +
907 746 } else {
908 747 return $current_menu_item;
909 748 }
749 +
910 750 }
911 -
751 +
912 752 /**
913 753 * Hidden for method
914 754 *
915 755 * @param [type] $disabled_for
@@ -915,84 +755,64 @@
915 755 * @param [type] $disabled_for
916 756 *
917 757 * @return boolean
918 758 */
919 - public function is_hidden( $disabled_for ) {
759 + public function is_hidden( $disabled_for )
760 + {
920 761 if ( !is_array( $disabled_for ) ) {
921 762 return false;
922 763 }
923 764 $current_user = wp_get_current_user();
765 + $current_name = $current_user->display_name;
924 766 $current_roles = $current_user->roles;
925 767 $all_roles = wp_roles()->get_names();
926 - foreach ( $current_roles as $current_role ) {
927 - if ( isset( $all_roles[$current_role] ) && in_array( $all_roles[$current_role], $disabled_for ) ) {
928 - return true;
929 - }
930 - }
931 - // Normalize disabled_for array
932 - $disabled_for_arr = [];
933 - foreach ( $disabled_for as $v ) {
934 - $disabled_for_arr[] = Utils::sluggify_with_underscores( $v );
935 - }
936 - $slugify_user_login = Utils::sluggify_with_underscores( $current_user->user_login );
937 - // Check Username
938 - if ( in_array( $current_user->user_login, $disabled_for_arr ) || in_array( $slugify_user_login, $disabled_for_arr ) ) {
768 + if ( in_array( $current_name, $disabled_for ) ) {
939 769 return true;
940 770 }
941 - // Check User Roles and Capabilities
942 - foreach ( $current_roles as $role ) {
943 - $role_obj = get_role( $role );
944 - if ( !$role_obj ) {
945 - continue;
946 - }
947 - // Check if role slug is in disabled array
948 - if ( in_array( $role, $disabled_for_arr ) ) {
771 + // MULTISITE SUPER ADMIN
772 + if ( is_super_admin() && is_multisite() ) {
773 +
774 + if ( in_array( 'Super Admin', $disabled_for ) ) {
949 775 return true;
776 + } else {
777 + return false;
950 778 }
951 - // Check if role display name is in disabled array
952 - if ( isset( $disabled_for_arr[$role] ) && (in_array( $all_roles[$role], $disabled_for ) || in_array( strtolower( $all_roles[$role] ), array_map( 'strtolower', $disabled_for ) )) ) {
953 - return true;
954 - }
955 - // Check for custom roles
956 - foreach ( $disabled_for as $disabled_item ) {
957 - // Convert role names to match WordPress format
958 - $disabled_role = str_replace( ' ', '_', strtolower( $disabled_item ) );
959 - if ( $role === $disabled_role ) {
960 - return true;
961 - }
962 - }
779 +
963 780 }
964 - // Handle Super Admin specially
965 - if ( is_super_admin( $current_user->ID ) ) {
966 - if ( in_array( 'Super Admin', $disabled_for_arr ) || in_array( 'super_admin', $disabled_for_arr ) || in_array( 'administrator', $disabled_for_arr ) ) {
781 + // NORMAL SUPER ADMIN
782 + if ( $current_user->ID === 1 ) {
783 +
784 + if ( in_array( 'Super Admin', $disabled_for ) ) {
967 785 return true;
786 + } else {
787 + return false;
968 788 }
969 - // Super admin sees everything by default unless explicitly disabled
970 - return false;
789 +
971 790 }
972 - // Special check for user ID 1 (default admin)
973 - if ( $current_user->ID === 1 ) {
974 - if ( in_array( 'Super Admin', $disabled_for_arr ) || in_array( 'super_admin', $disabled_for_arr ) || in_array( 'administrator', $disabled_for_arr ) ) {
791 + foreach ( $current_roles as $role ) {
792 + $role_name = $all_roles[$role];
793 + if ( in_array( $role_name, $disabled_for ) ) {
975 794 return true;
976 795 }
977 - return false;
978 796 }
979 - return false;
980 797 }
981 -
798 +
982 799 /**
983 800 * Applies separator menu item settings
984 801 *
985 802 * @since 1.0.0
986 803 */
987 - public function apply_separator_settings( $current_menu_item, $key ) {
804 + public function apply_separator_settings( $current_menu_item, $key )
805 + {
988 806 $name = '';
989 807 $disabled_for = [];
990 808 $optiongroup = [];
991 809 $order = $key;
992 810 if ( is_array( $this->menu_settings ) ) {
811 +
993 812 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
994 813 $optiongroup = $this->menu_settings[$current_menu_item[2]];
814 +
995 815 if ( isset( $optiongroup['name'] ) ) {
996 816 $name = $optiongroup['name'];
997 817 if ( $name != '' ) {
998 818 $current_menu_item['name'] = $name;
@@ -997,43 +817,70 @@
997 817 if ( $name != '' ) {
998 818 $current_menu_item['name'] = $name;
999 819 }
1000 820 }
821 +
1001 822 if ( isset( $optiongroup['order'] ) ) {
1002 823 $order = $optiongroup['order'];
1003 824 }
825 +
1004 826 if ( isset( $optiongroup['hidden_for'] ) ) {
1005 827 $disabled_for = $optiongroup['hidden_for'];
1006 828 if ( $this->is_hidden( $disabled_for ) ) {
1007 - $current_menu_item['hidden_for'] = true;
829 + $current_menu_item['hidden'] = true;
1008 830 }
1009 831 }
832 +
1010 833 }
834 +
1011 835 }
1012 836 $current_menu_item['order'] = $order;
1013 - if ( isset( $current_menu_item['hidden_for'] ) ) {
1014 - if ( $current_menu_item['hidden_for'] == true ) {
837 +
838 + if ( isset( $current_menu_item['hidden'] ) ) {
839 +
840 + if ( $current_menu_item['hidden'] == true ) {
1015 841 return false;
1016 842 } else {
1017 843 return $current_menu_item;
1018 844 }
845 +
1019 846 } else {
1020 847 return $current_menu_item;
1021 848 }
849 +
1022 850 }
1023 -
1024 - public function get_saved_sub_menu() {
851 +
852 + /**
853 + * Menu Editor Menu
854 + */
855 + public function jltwp_adminify_menu_editor_submenu()
856 + {
857 + add_submenu_page(
858 + 'wp-adminify-settings',
859 + esc_html__( 'Menu Editor by WP Adminify', 'adminify' ),
860 + esc_html__( 'Menu Editor', 'adminify' ),
861 + apply_filters( 'jltwp_adminify_capability', 'manage_options' ),
862 + 'adminify-menu-editor',
863 + // Page slug, will be displayed in URL
864 + [ $this, 'jltwp_adminify_menu_editor_contents' ]
865 + );
866 + }
867 +
868 + public function get_saved_sub_menu()
869 + {
1025 870 $menu_settings = $this->menu_settings;
1026 871 $menu = $this->menu;
1027 872 $submenu = $this->submenu;
873 +
1028 874 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
1029 875 foreach ( $menu as $menu_item ) {
1030 876 if ( isset( $menu_settings[$menu_item[2]] ) ) {
1031 - unset($menu_settings[$menu_item[2]]);
877 + unset( $menu_settings[$menu_item[2]] );
1032 878 }
1033 879 }
1034 880 $tmp_menu = [];
1035 881 foreach ( $menu_settings as $key => $menu_s ) {
882 +
1036 883 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
1037 884 $tmp_sub_menu = [];
1038 885 $i = 0;
1039 886 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
@@ -1045,29 +892,36 @@
1045 892 ];
1046 893 $tmp_sub_menu[$i] = $new_array;
1047 894 $i++;
1048 895 }
1049 - if ( !empty( $tmp_sub_menu ) ) {
896 + if ( !empty($tmp_sub_menu) ) {
1050 897 $tmp_menu[$key] = $tmp_sub_menu;
1051 898 }
1052 899 }
900 +
1053 901 }
1054 - if ( !empty( $tmp_menu ) ) {
902 + if ( !empty($tmp_menu) ) {
1055 903 $submenu = $submenu + $tmp_menu;
1056 904 }
1057 905 }
906 +
1058 907 return $submenu;
1059 908 }
1060 -
909 +
1061 910 /**
1062 911 * Render Menu Editor
1063 912 */
1064 - public function render_menu_editor() {
1065 - global $wp_roles;
913 + public function render_menu_editor()
914 + {
915 + global $wp_roles ;
916 + $users = get_users();
917 + $this->users = $users;
1066 918 $this->roles = $wp_roles->roles;
919 +
1067 920 if ( $this->menu && is_array( $this->menu ) ) {
1068 921 foreach ( $this->menu as $menu_item ) {
1069 922 $next_menu_item = next( $this->menu );
923 +
1070 924 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
1071 925 // Render Separator
1072 926 // $this->render_menu_separator($menu_item);
1073 927 } else {
@@ -1078,92 +932,41 @@
1078 932 $this->submenu,
1079 933 $next_menu_item
1080 934 );
1081 935 }
936 +
1082 937 }
1083 938 $this->render_add_new_menu_item();
939 + ?>
940 + <script>
941 + jQuery(function($) {
942 +
943 + $('.adminify-menu-settings').tokenize2({
944 + placeholder: '<?php
945 + esc_html_e( 'Select roles or users', 'adminify' );
946 + ?>'
947 + });
948 +
949 + $('.adminify-menu-settings').on('tokenize:select', function() {
950 + $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
951 + });
952 +
953 + });
954 + </script>
955 + <?php
1084 956 }
957 +
1085 958 }
1086 -
1087 - public function get_icon( $value, $default ) {
1088 - if ( empty( $value ) ) {
959 +
960 + public function get_icon( $value, $default )
961 + {
962 + if ( empty($value) ) {
1089 963 return $default;
1090 964 }
1091 965 return $value;
1092 966 }
1093 -
967 +
1094 968 /**
1095 - * Generate User Rules Select box
1096 - */
1097 - public function generate_user_rules_select_field( $menu_id, $disabled_for, $menu_type = 'menu' ) {
1098 - ob_start();
1099 - ?>
1100 - <select class="adminify-menu-settings adminify-user-role-select <?php
1101 - echo esc_attr( $menu_type );
1102 - ?>_setting" name="hidden_for" id="<?php
1103 - echo esc_attr( $menu_id );
1104 - ?>-user-role-types" multiple>
1105 - <optgroup label="<?php
1106 - esc_attr_e( 'Roles', 'adminify' );
1107 - ?>">
1108 - <?php
1109 - foreach ( $this->roles as $role ) {
1110 - $rolename = $role['name'];
1111 - if ( 'administrator' == strtolower( $rolename ) ) {
1112 - continue;
1113 - }
1114 - $sel = '';
1115 - if ( in_array( $rolename, $disabled_for ) ) {
1116 - $sel = 'selected';
1117 - }
1118 - ?>
1119 - <option value="<?php
1120 - echo esc_attr( $rolename );
1121 - ?>" <?php
1122 - echo esc_attr( $sel );
1123 - ?>><?php
1124 - echo esc_html( $rolename );
1125 - ?></option>
1126 - <?php
1127 - }
1128 - ?>
1129 - </optgroup>
1130 -
1131 - <optgroup label="<?php
1132 - esc_attr_e( 'Users', 'adminify' );
1133 - ?>" class="adminify-users-optgroup">
1134 - <?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 - }
1158 - ?>
1159 - </optgroup>
1160 - </select>
1161 - <?php
1162 - return ob_get_clean();
1163 - }
1164 -
1165 - /**
1166 969 * Render Top Level menu Item
1167 970 *
1168 971 * @return void
1169 972 */
@@ -1171,26 +974,24 @@
1171 974 $master_menu,
1172 975 $current_menu_item,
1173 976 $master_sub_menu,
1174 977 $next_menu_item
1175 - ) {
1176 - if ( empty( $current_menu_item[2] ) ) {
1177 - return;
1178 - }
1179 - // $disabled_for = '';
978 + )
979 + {
980 + $disabled_for = '';
1180 981 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[5] );
1181 982 $name = '';
1182 983 $link = '';
1183 - $external_link = '';
1184 984 $icon = '';
1185 985 $separator = '';
1186 986 $disabled_for = [];
1187 987 $optiongroup = [];
1188 988 $menu_options = $this->menu_settings;
1189 - if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
989 + if ( !empty($next_menu_item) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
1190 990 $separator = 1;
1191 991 }
1192 992 if ( is_array( $menu_options ) ) {
993 +
1193 994 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
1194 995 $optiongroup = $menu_options[$current_menu_item[2]];
1195 996 if ( isset( $optiongroup['name'] ) ) {
1196 997 $name = $optiongroup['name'];
@@ -1206,14 +1007,13 @@
1206 1007 }
1207 1008 if ( isset( $optiongroup['separator'] ) ) {
1208 1009 $separator = $optiongroup['separator'];
1209 1010 }
1210 - if ( isset( $optiongroup['external_link'] ) ) {
1211 - $external_link = $optiongroup['external_link'];
1212 - }
1213 1011 }
1012 +
1214 1013 }
1215 1014 $name_attr = $current_menu_item[2];
1015 +
1216 1016 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1217 1017 $name_attr = $current_menu_item[5];
1218 1018 $name = $current_menu_item[0];
1219 1019 $link = $current_menu_item[2];
@@ -1228,12 +1028,10 @@
1228 1028 }
1229 1029 if ( isset( $current_menu_item['separator'] ) ) {
1230 1030 $separator = $current_menu_item['separator'];
1231 1031 }
1232 - if ( isset( $current_menu_item['external_link'] ) ) {
1233 - $external_link = $current_menu_item['external_link'];
1234 - }
1235 1032 }
1033 +
1236 1034 if ( !is_array( $disabled_for ) ) {
1237 1035 $disabled_for = [];
1238 1036 }
1239 1037 // LIST OF AVAILABLE MENU ICONS
@@ -1254,14 +1052,14 @@
1254 1052 ];
1255 1053 $default_icons = ( isset( $current_menu_item ) ? $current_menu_item[6] : 'dashicons dashicons-external' );
1256 1054 ?>
1257 1055 <div class="accordion adminify_menu_item" name="<?php
1258 - echo esc_attr( $name_attr );
1056 + echo esc_attr( $name_attr ) ;
1259 1057 ?>" id="wp-adminify-top-menu-<?php
1260 - echo esc_attr( $menu_id );
1058 + echo esc_attr( $menu_id ) ;
1261 1059 ?>">
1262 1060 <input type="number" class="top_level_order" value="" style="display:none;">
1263 - <a class="menu-editor-title accordion-button adminify-flex adminify-flex-center adminify-gap-2" href="#">
1061 + <a class="menu-editor-title accordion-button p-4" href="#">
1264 1062 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1265 1063 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
1266 1064 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
1267 1065 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
@@ -1272,18 +1070,18 @@
1272 1070 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
1273 1071 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
1274 1072 </svg>
1275 1073 <?php
1276 - echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1074 + echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) ) ;
1277 1075 ?>
1278 1076 </a>
1279 1077
1280 1078 <div class="accordion-body adminify_top_level_settings">
1281 - <div class="tabs tabbable">
1282 - <ul class="adminify-flex adminify-flex-center adminify-m-0 nav nav-tabs">
1079 + <div class="tabs tabbable m-0">
1080 + <ul class="m-0 b-0 nav nav-tabs">
1283 1081 <li class="nav-item active">
1284 1082 <a class="nav-link is-clickable active" href="#tab-<?php
1285 - echo esc_attr( $menu_id );
1083 + echo esc_attr( $menu_id ) ;
1286 1084 ?>-1">
1287 1085 <?php
1288 1086 esc_html_e( 'Settings', 'adminify' );
1289 1087 ?>
@@ -1290,9 +1088,9 @@
1290 1088 </a>
1291 1089 </li>
1292 1090 <li class="nav-item" role="presentation">
1293 1091 <a class="nav-link is-clickable" href="#tab-<?php
1294 - echo esc_attr( $menu_id );
1092 + echo esc_attr( $menu_id ) ;
1295 1093 ?>-2">
1296 1094 <?php
1297 1095 esc_html_e( 'Submenu', 'adminify' );
1298 1096 ?>
@@ -1300,17 +1098,17 @@
1300 1098 </li>
1301 1099 </ul>
1302 1100 </div>
1303 1101
1304 - <div class="tab-content tab-panel panel adminify-p-4">
1102 + <div class="tab-content tab-panel panel p-4">
1305 1103 <div id="tab-<?php
1306 - echo esc_attr( $menu_id );
1104 + echo esc_attr( $menu_id ) ;
1307 1105 ?>-1" class="tab-pane">
1308 1106 <div class="menu-editor-form">
1309 1107 <div class="columns">
1310 1108 <div class="column">
1311 1109 <label for="<?php
1312 - echo esc_attr( $current_menu_item[2] );
1110 + echo esc_attr( $current_menu_item[2] ) ;
1313 1111 ?>">
1314 1112 <?php
1315 1113 esc_html_e( 'Rename as', 'adminify' );
1316 1114 ?>
@@ -1315,37 +1113,80 @@
1315 1113 esc_html_e( 'Rename as', 'adminify' );
1316 1114 ?>
1317 1115 </label>
1318 1116 <input class="menu_setting" type="text" name="name" data-top-menu-id="<?php
1319 - echo esc_attr( $menu_id );
1117 + echo esc_attr( $menu_id ) ;
1320 1118 ?>" placeholder="<?php
1321 - echo esc_attr( $current_menu_item[0] );
1119 + echo esc_attr( $current_menu_item[0] ) ;
1322 1120 ?>" value='<?php
1323 - echo esc_attr( $name );
1121 + echo esc_attr( $name ) ;
1324 1122 ?>' />
1325 1123 </div>
1326 1124 <div class="column">
1327 1125 <label for="<?php
1328 - echo esc_attr( $current_menu_item[2] );
1126 + echo esc_attr( $current_menu_item[2] ) ;
1329 1127 ?>">
1330 1128 <?php
1331 - esc_html_e( 'Hidden For Roles or Users', 'adminify' );
1129 + esc_html_e( 'Hidden For Rules', 'adminify' );
1332 1130 ?>
1333 1131 </label>
1334 1132
1335 1133 <div class="select is-small">
1336 -
1337 - <?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 - echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1134 + <select class="adminify-menu-settings menu_setting" name="hidden_for" id="<?php
1135 + echo esc_attr( $menu_id ) ;
1136 + ?>-user-role-types" multiple>
1137 + <?php
1138 + $sel = '';
1139 + if ( in_array( 'Super Admin', $disabled_for ) ) {
1140 + $sel = 'selected';
1141 + }
1340 1142 ?>
1143 + <option value="Super Admin" <?php
1144 + echo esc_attr( $sel ) ;
1145 + ?>><?php
1146 + esc_html_e( 'Super Admin', 'adminify' );
1147 + ?></option>
1148 + <?php
1149 + foreach ( $this->roles as $role ) {
1150 + $rolename = $role['name'];
1151 + $sel = '';
1152 + if ( in_array( $rolename, $disabled_for ) ) {
1153 + $sel = 'selected';
1154 + }
1155 + ?>
1156 + <option value="<?php
1157 + echo esc_attr( $rolename ) ;
1158 + ?>" <?php
1159 + echo esc_attr( $sel ) ;
1160 + ?>><?php
1161 + echo esc_html( $rolename ) ;
1162 + ?></option>
1163 + <?php
1164 + }
1165 + foreach ( $this->users as $user ) {
1166 + $username = $user->display_name;
1167 + $sel = '';
1168 + if ( in_array( $username, $disabled_for ) ) {
1169 + $sel = 'selected';
1170 + }
1171 + ?>
1172 + <option value="<?php
1173 + echo esc_attr( $username ) ;
1174 + ?>" <?php
1175 + echo esc_attr( $sel ) ;
1176 + ?>><?php
1177 + echo esc_attr( $username ) ;
1178 + ?></option>
1179 + <?php
1180 + }
1181 + ?>
1182 + </select>
1341 1183
1342 1184 </div>
1343 1185 </div>
1344 1186 </div>
1345 -
1346 1187 <div class="columns">
1347 - <!-- <div class="column">
1188 + <div class="column">
1348 1189 <label for="">
1349 1190 <?php
1350 1191 esc_html_e( 'Change Link', 'adminify' );
1351 1192 ?>
@@ -1352,104 +1193,13 @@
1352 1193 </label>
1353 1194 <input class="menu_setting" name="link" type="url" placeholder="<?php
1354 1195 esc_html_e( 'New link', 'adminify' );
1355 1196 ?>" value="<?php
1356 - echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1357 - ?>" onchange="checkForLinkTarget(this)" >
1358 -
1359 - <label for="external_link-<?php
1360 - echo esc_attr( $name_attr );
1197 + echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) ) ;
1361 1198 ?>">
1362 - <?php
1363 - esc_html_e( 'New Window?', 'adminify' );
1364 - ?>
1365 - <input class="menu_setting" id="external_link-<?php
1366 - echo esc_attr( $name_attr );
1367 - ?>" name="external_link" type="checkbox" value="0" <?php
1368 - checked( (int) $external_link, 1 );
1369 - ?> disabled>
1370 -
1371 - </label>
1372 - <script>
1373 - function checkForLinkTarget(inputField) {
1374 - var checkbox = inputField.closest('.column').querySelector('input[type="checkbox"]');
1375 -
1376 - if (inputField.value.trim() !== "") {
1377 - checkbox.disabled = false; // Enable checkbox if input is not empty
1378 - } else {
1379 - checkbox.disabled = true; // Disable checkbox if input is empty
1380 - }
1381 - }
1382 - </script>
1383 - </div> -->
1384 -
1199 + </div>
1385 1200 <div class="column">
1386 1201 <label for="">
1387 - <?php
1388 - esc_html_e( 'Change Link', 'adminify' );
1389 - ?>
1390 - </label>
1391 - <input class="menu_setting" name="link" type="url"
1392 - placeholder="<?php
1393 - esc_html_e( 'New link', 'adminify' );
1394 - ?>"
1395 - value="<?php
1396 - echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1397 - ?>"
1398 - oninput="checkForLinkTarget(this)">
1399 - <div class="new-tab-settings" style="padding-top: 10px;">
1400 - <label for="external_link-<?php
1401 - echo esc_attr( $name_attr );
1402 - ?>" style="display: flex; align-items: center; gap: 8px;">
1403 -
1404 - <input class="menu_setting" id="external_link-<?php
1405 - echo esc_attr( $name_attr );
1406 - ?>"
1407 - name="external_link" type="checkbox" value="1"
1408 - <?php
1409 - checked( (int) $external_link, 1 );
1410 - ?> disabled style="margin-top: 0;" >
1411 - <span><?php
1412 - esc_html_e( 'New Window?', 'adminify' );
1413 - ?></span>
1414 - </label>
1415 - </div>
1416 -
1417 - <script>
1418 - // Function to validate URL
1419 - function isValidURL(url) {
1420 - // Allow absolute URLs (with http:// or https://)
1421 - var absolutePattern = /^(https?:\/\/)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}.*$/;
1422 -
1423 - // Allow relative URLs (starting with "/")
1424 - var relativePattern = /^\/[a-zA-Z0-9-_\/]+$/;
1425 -
1426 - return absolutePattern.test(url) || relativePattern.test(url);
1427 - }
1428 -
1429 -
1430 - function checkForLinkTarget(inputField) {
1431 - var checkbox = inputField.closest('.column').querySelector('input[type="checkbox"]');
1432 -
1433 - if (isValidURL(inputField.value.trim())) {
1434 - checkbox.disabled = false; // Enable if URL is valid
1435 - } else {
1436 - checkbox.disabled = true; // Disable if invalid
1437 - checkbox.checked = false; // Also uncheck if disabled
1438 - }
1439 - }
1440 -
1441 - // Run on page load
1442 - document.addEventListener("DOMContentLoaded", function() {
1443 - document.querySelectorAll('.column input[name="link"]').forEach(function(inputField) {
1444 - checkForLinkTarget(inputField);
1445 - });
1446 - });
1447 - </script>
1448 - </div>
1449 -
1450 - <div class="column">
1451 - <label for="">
1452 1202 <?php
1453 1203 esc_html_e( 'Set Custom Icon', 'adminify' );
1454 1204 ?>
1455 1205 </label>
@@ -1456,39 +1206,45 @@
1456 1206 <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable is-pulled-left">
1457 1207 <ul class="icon-picker">
1458 1208 <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1459 1209 <li class="select-icon <?php
1460 - echo ( !empty( $icon ) && preg_match( '/http(s?)\\:\\/\\//i', $icon ) || empty( $icon ) && empty( $icons[$default_icons] ) ? 'custom-icon' : '' );
1210 + echo ( !empty($icon) && preg_match( '/http(s?)\\:\\/\\//i', $icon ) || empty($icon) && empty($icons[$default_icons]) ? 'custom-icon' : '' ) ;
1461 1211 ?>" title="Icon Library">
1462 1212 <?php
1463 - if ( !empty( $icon ) ) {
1213 +
1214 + if ( !empty($icon) ) {
1215 +
1464 1216 if ( preg_match( '/http(s?)\\:\\/\\//i', $icon ) ) {
1465 1217 $image = explode( ',', $icon );
1466 - echo '<i class=""><img width="24" height="24" src=' . esc_url( $image[1] ) . ' ></i>';
1218 + echo '<i class=""><img src=' . esc_url( $image[1] ) . ' ></i>' ;
1467 1219 } else {
1468 1220 ?>
1469 1221 <i class="<?php
1470 - echo esc_attr( $this->get_icon( esc_attr( $icon ), '' ) );
1222 + echo esc_attr( $this->get_icon( esc_attr( $icon ), '' ) ) ;
1471 1223 ?>"></i>
1472 - <?php
1224 + <?php
1473 1225 }
1226 +
1474 1227 } else {
1475 - $adminify_icon = PXLBSADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1476 - if ( empty( $icons[$default_icons] ) ) {
1477 - echo '<i class=""><img width="24" height="24" src=' . esc_url( $adminify_icon ) . ' ></i>';
1228 + $adminify_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1229 +
1230 + if ( empty($icons[$default_icons]) ) {
1231 + echo '<i class=""><img src=' . esc_url( $adminify_icon ) . ' ></i>' ;
1478 1232 } else {
1479 1233 ?>
1480 1234 <i class="<?php
1481 - echo wp_kses_post( $this->get_icon( esc_attr( $icon ), $icons[$default_icons] ) );
1235 + echo wp_kses_post( $this->get_icon( esc_attr( $icon ), $icons[$default_icons] ) ) ;
1482 1236 ?>"></i>
1483 - <?php
1237 + <?php
1484 1238 }
1239 +
1485 1240 }
1241 +
1486 1242 ?>
1487 1243
1488 1244 </li>
1489 1245 <input type="hidden" class="menu_setting" name="icon" value="<?php
1490 - echo esc_attr( $icon );
1246 + echo esc_attr( $icon ) ;
1491 1247 ?>">
1492 1248 </ul>
1493 1249 </div>
1494 1250 </div>
@@ -1493,46 +1249,38 @@
1493 1249 </div>
1494 1250 </div>
1495 1251 </div>
1496 1252 <div class='columns'>
1497 - <?php
1498 - $upgrade_pro = '';
1499 - $separator_name_attr = '';
1500 - $upgrade_pro = 'upgrade-pro';
1501 - $separator_name_attr = Utils::upgrade_pro_notice( 'Add Separator' );
1502 - ?>
1503 -
1504 1253 <div class='column <?php
1505 - echo esc_attr( $upgrade_pro );
1254 + echo ( !jltwp_adminify()->can_use_premium_code__premium_only() ? 'upgrade-pro' : '' ) ;
1506 1255 ?>'>
1507 - <label for="seperator-<?php
1508 - echo esc_attr( $name_attr );
1509 - ?>">
1510 - <?php
1511 - $separator_content = apply_filters( 'pxlbsadminify/menu_editor/add_separator', $separator_name_attr, $separator );
1512 - // Apply the filter
1513 - echo wp_kses_post( $separator_content || "" );
1256 + <?php
1514 1257 ?>
1515 - </label>
1258 + <?php
1259 + echo Utils::adminify_upgrade_pro( 'Add Separator' ) ;
1260 + ?>
1516 1261 </div>
1517 1262 </div>
1518 1263 </div>
1519 1264 <?php
1265 +
1520 1266 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1521 1267 ?>
1522 1268 <div class="remove-add-new-menu"><span data-id="<?php
1523 - echo esc_attr( $current_menu_item[5] );
1269 + echo esc_attr( $current_menu_item[5] ) ;
1524 1270 ?>"><i class="icon-close"></i> Delete</span></div>
1525 1271 <?php
1526 1272 }
1273 +
1527 1274 ?>
1528 1275 </div>
1529 1276 <div id="tab-<?php
1530 - echo esc_attr( $menu_id );
1277 + echo esc_attr( $menu_id ) ;
1531 1278 ?>-2" class="tab-pane tab-pane--submenu">
1532 1279 <?php
1533 1280 // Sub Menu Items Check
1534 1281 $link = $current_menu_item[2];
1282 +
1535 1283 if ( isset( $master_sub_menu[$name_attr] ) && is_array( $master_sub_menu[$name_attr] ) ) {
1536 1284 foreach ( $master_sub_menu[$name_attr] as $sub_menu_item ) {
1537 1285 $this->build_sub_menu_item( $sub_menu_item, $optiongroup, $name_attr );
1538 1286 }
@@ -1540,10 +1288,11 @@
1540 1288 ?>
1541 1289 <span><?php
1542 1290 esc_html_e( 'No sub menu items', 'adminify' );
1543 1291 ?></span>
1544 - <?php
1292 + <?php
1545 1293 }
1294 +
1546 1295 $this->render_add_new_menu_item( true );
1547 1296 // true for submenu item
1548 1297 ?>
1549 1298
@@ -1552,17 +1301,19 @@
1552 1301
1553 1302 </div>
1554 1303 </div>
1555 1304
1556 - <?php
1305 + <?php
1557 1306 }
1558 -
1559 - public function render_menu_separator( $current_menu_item ) {
1307 +
1308 + public function render_menu_separator( $current_menu_item )
1309 + {
1560 1310 $disabled_for = [];
1561 1311 $name = '';
1562 1312 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[2] );
1563 1313 $menu_options = $this->menu_settings;
1564 1314 if ( is_array( $menu_options ) ) {
1315 +
1565 1316 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
1566 1317 $optiongroup = $menu_options[$current_menu_item[2]];
1567 1318 if ( isset( $optiongroup['name'] ) ) {
1568 1319 $name = $optiongroup['name'];
@@ -1570,8 +1321,9 @@
1570 1321 if ( isset( $optiongroup['hidden_for'] ) ) {
1571 1322 $disabled_for = $optiongroup['hidden_for'];
1572 1323 }
1573 1324 }
1325 +
1574 1326 }
1575 1327 if ( !is_array( $disabled_for ) ) {
1576 1328 $disabled_for = [];
1577 1329 }
@@ -1576,11 +1328,11 @@
1576 1328 $disabled_for = [];
1577 1329 }
1578 1330 ?>
1579 1331 <div class="accordion adminify_menu_item" name="<?php
1580 - echo esc_attr( $current_menu_item[2] );
1332 + echo esc_attr( $current_menu_item[2] ) ;
1581 1333 ?>" id="<?php
1582 - echo esc_attr( $menu_id );
1334 + echo esc_attr( $menu_id ) ;
1583 1335 ?>">
1584 1336 <input type="number" class="top_level_order" value="" style="display:none;">
1585 1337 <a class="menu-editor-title accordion-button p-4" href="#">
1586 1338 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -1609,21 +1361,87 @@
1609 1361 ?></label>
1610 1362 <input class="menu_setting" type="text" name="name" placeholder="<?php
1611 1363 esc_html_e( 'New Name', 'adminify' );
1612 1364 ?>" value="<?php
1613 - echo esc_attr( $name );
1365 + echo esc_attr( $name ) ;
1614 1366 ?>">
1615 1367 </div>
1616 1368 <div class="column">
1617 1369 <label for=""><?php
1618 - esc_html_e( 'Hidden For Roles or Users', 'adminify' );
1370 + esc_html_e( 'Hidden For Rules', 'adminify' );
1619 1371 ?></label>
1620 1372
1621 1373 <div class="select is-small">
1622 - <?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 - echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1374 + <select class="adminify-menu-settings menu_setting" name="hidden_for" id="<?php
1375 + echo esc_attr( $menu_id ) ;
1376 + ?>-user-role-types" multiple>
1377 + <?php
1378 + $sel = '';
1379 + if ( in_array( 'Super Admin', $disabled_for ) ) {
1380 + $sel = 'selected';
1381 + }
1625 1382 ?>
1383 + <option value="Super Admin" <?php
1384 + echo esc_attr( $sel ) ;
1385 + ?>><?php
1386 + esc_html_e( 'Super Admin', 'adminify' );
1387 + ?></option>
1388 + <?php
1389 + foreach ( $this->roles as $role ) {
1390 + $rolename = $role['name'];
1391 + $sel = '';
1392 + if ( in_array( $rolename, $disabled_for ) ) {
1393 + $sel = 'selected';
1394 + }
1395 + ?>
1396 + <option value="<?php
1397 + echo esc_attr( $rolename ) ;
1398 + ?>" <?php
1399 + echo esc_attr( $sel ) ;
1400 + ?>><?php
1401 + echo esc_html( $rolename ) ;
1402 + ?></option>
1403 + <?php
1404 + }
1405 + foreach ( $this->users as $user ) {
1406 + $username = $user->display_name;
1407 + $sel = '';
1408 + if ( in_array( $username, $disabled_for ) ) {
1409 + $sel = 'selected';
1410 + }
1411 + ?>
1412 + <option value="<?php
1413 + echo esc_attr( $username ) ;
1414 + ?>" <?php
1415 + echo esc_attr( $sel ) ;
1416 + ?>><?php
1417 + echo esc_html( $username ) ;
1418 + ?></option>
1419 + <?php
1420 + }
1421 + ?>
1422 + </select>
1423 +
1424 + <script>
1425 + jQuery('#<?php
1426 + echo esc_attr( $menu_id ) ;
1427 + ?> #<?php
1428 + echo esc_attr( $menu_id ) ;
1429 + ?>-user-role-types').tokenize2({
1430 + placeholder: '<?php
1431 + esc_html_e( 'Select roles or users', 'adminify' );
1432 + ?>'
1433 + });
1434 + jQuery(document).ready(function($) {
1435 + $('#<?php
1436 + echo esc_attr( $menu_id ) ;
1437 + ?> #<?php
1438 + echo esc_attr( $menu_id ) ;
1439 + ?>-user-role-types').on('tokenize:select', function(container) {
1440 + $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1441 + });
1442 + })
1443 + </script>
1626 1444 </div>
1627 1445 </div>
1628 1446 </div>
1629 1447 </div>
@@ -1631,20 +1449,21 @@
1631 1449 </div>
1632 1450 </div>
1633 1451 </div>
1634 1452
1635 - <?php
1453 + <?php
1636 1454 }
1637 -
1638 - public function build_sub_menu_item( $current_menu_item, $optiongroup, $name_attr ) {
1455 +
1456 + public function build_sub_menu_item( $current_menu_item, $optiongroup, $name_attr )
1457 + {
1639 1458 $name = '';
1640 1459 $link = '';
1641 1460 $icon = '';
1642 - $external_link = '';
1643 1461 $disabled_for = [];
1644 1462 $suboptiongroup = [];
1645 1463 $menu_options = $this->menu_settings;
1646 1464 if ( isset( $optiongroup['submenu'] ) ) {
1465 +
1647 1466 if ( isset( $optiongroup['submenu'][$current_menu_item[2]] ) ) {
1648 1467 $suboptiongroup = $optiongroup['submenu'][$current_menu_item[2]];
1649 1468 if ( isset( $suboptiongroup['name'] ) ) {
1650 1469 $name = $suboptiongroup['name'];
@@ -1651,11 +1470,8 @@
1651 1470 }
1652 1471 if ( isset( $suboptiongroup['link'] ) ) {
1653 1472 $link = $suboptiongroup['link'];
1654 1473 }
1655 - if ( isset( $suboptiongroup['external_link'] ) ) {
1656 - $external_link = $suboptiongroup['external_link'];
1657 - }
1658 1474 if ( isset( $suboptiongroup['icon'] ) ) {
1659 1475 $icon = $suboptiongroup['icon'];
1660 1476 }
1661 1477 if ( isset( $suboptiongroup['hidden_for'] ) ) {
@@ -1661,13 +1477,15 @@
1661 1477 if ( isset( $suboptiongroup['hidden_for'] ) ) {
1662 1478 $disabled_for = $suboptiongroup['hidden_for'];
1663 1479 }
1664 1480 }
1481 +
1665 1482 }
1666 1483 $sub_menu_name_attr = $current_menu_item[2];
1667 1484 if ( isset( $current_menu_item['key'] ) ) {
1668 1485 $sub_menu_name_attr = $current_menu_item['key'];
1669 1486 }
1487 +
1670 1488 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1671 1489 $name = $current_menu_item[0];
1672 1490 $link = $current_menu_item[2];
1673 1491 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'] ) ) {
@@ -1675,12 +1493,10 @@
1675 1493 }
1676 1494 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['icon'] ) ) {
1677 1495 $icon = $optiongroup['submenu'][$sub_menu_name_attr]['icon'];
1678 1496 }
1679 - if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['external_link'] ) ) {
1680 - $external_link = $optiongroup['submenu'][$sub_menu_name_attr]['external_link'];
1681 - }
1682 1497 }
1498 +
1683 1499 if ( !is_array( $disabled_for ) ) {
1684 1500 $disabled_for = [];
1685 1501 }
1686 1502 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $sub_menu_name_attr );
@@ -1685,14 +1501,14 @@
1685 1501 }
1686 1502 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $sub_menu_name_attr );
1687 1503 ?>
1688 1504 <div class="accordion adminify_sub_menu_item" name="<?php
1689 - echo esc_attr( $sub_menu_name_attr );
1505 + echo esc_attr( $sub_menu_name_attr ) ;
1690 1506 ?>" id="wp-adminify-sub-menu-<?php
1691 - echo esc_attr( $menu_id );
1507 + echo esc_attr( $menu_id ) ;
1692 1508 ?>">
1693 1509 <input type="number" class="top_level_order" value="" style="display:none;">
1694 - <a class="menu-editor-title accordion-button adminify-flex adminify-flex-center adminify-gap-2" href="#">
1510 + <a class="menu-editor-title accordion-button p-4" href="#">
1695 1511 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1696 1512 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
1697 1513 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
1698 1514 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
@@ -1703,11 +1519,9 @@
1703 1519 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
1704 1520 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
1705 1521 </svg>
1706 1522 <?php
1707 - if ( !empty( $current_menu_item[0] ) ) {
1708 - echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1709 - }
1523 + echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) ) ;
1710 1524 ?>
1711 1525 </a>
1712 1526
1713 1527 <div class="accordion-body">
@@ -1719,25 +1533,92 @@
1719 1533 <label for=""><?php
1720 1534 esc_html_e( 'Rename as', 'adminify' );
1721 1535 ?></label>
1722 1536 <input class="sub_menu_setting" type="text" data-sub-menu-id="<?php
1723 - echo esc_attr( $menu_id );
1537 + echo esc_attr( $menu_id ) ;
1724 1538 ?>" name="name" placeholder="<?php
1725 1539 esc_html_e( 'New Menu name...', 'adminify' );
1726 1540 ?>" value="<?php
1727 - echo esc_attr( $name );
1541 + echo esc_attr( $name ) ;
1728 1542 ?>">
1729 1543 </div>
1730 1544 <div class="column">
1731 1545 <label for=""><?php
1732 - esc_html_e( 'Hidden For Roles or Users', 'adminify' );
1546 + esc_html_e( 'Hidden For Rules', 'adminify' );
1733 1547 ?></label>
1734 1548
1735 1549 <div class="select is-small">
1736 - <?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 - echo $this->generate_user_rules_select_field( $menu_id, $disabled_for, 'sub_menu' );
1550 + <select class="adminify-menu-settings sub_menu_setting" name="hidden_for" id="<?php
1551 + echo esc_attr( $menu_id ) ;
1552 + ?>-user-role-types" multiple>
1553 + <?php
1554 + $sel = '';
1555 + if ( in_array( 'Super Admin', $disabled_for ) ) {
1556 + $sel = 'selected';
1557 + }
1739 1558 ?>
1559 + <option value="Super Admin" <?php
1560 + echo esc_attr( $sel ) ;
1561 + ?>><?php
1562 + esc_html_e( 'Super Admin', 'adminify' );
1563 + ?></option>
1564 + <?php
1565 + foreach ( $this->roles as $role ) {
1566 + $rolename = $role['name'];
1567 + $sel = '';
1568 + if ( in_array( $rolename, $disabled_for ) ) {
1569 + $sel = 'selected';
1570 + }
1571 + ?>
1572 + <option value="<?php
1573 + echo esc_attr( $rolename ) ;
1574 + ?>" <?php
1575 + echo esc_attr( $sel ) ;
1576 + ?>><?php
1577 + echo esc_html( $rolename ) ;
1578 + ?></option>
1579 + <?php
1580 + }
1581 + foreach ( $this->users as $user ) {
1582 + $username = $user->display_name;
1583 + $sel = '';
1584 + if ( in_array( $username, $disabled_for ) ) {
1585 + $sel = 'selected';
1586 + }
1587 + ?>
1588 + <option value="<?php
1589 + echo esc_attr( $username ) ;
1590 + ?>" <?php
1591 + echo esc_attr( $sel ) ;
1592 + ?>><?php
1593 + echo esc_html( $username ) ;
1594 + ?></option>
1595 + <?php
1596 + }
1597 + ?>
1598 + </select>
1599 +
1600 + <script>
1601 + jQuery('#wp-adminify-sub-menu-<?php
1602 + echo esc_attr( $menu_id ) ;
1603 + ?> #<?php
1604 + echo esc_attr( $menu_id ) ;
1605 + ?>-user-role-types').tokenize2({
1606 + placeholder: '<?php
1607 + esc_html_e( 'Select roles or users', 'adminify' );
1608 + ?>'
1609 + });
1610 + jQuery(document).ready(function($) {
1611 + $('#wp-adminify-sub-menu-<?php
1612 + echo esc_attr( $menu_id ) ;
1613 + ?> #<?php
1614 + echo esc_attr( $menu_id ) ;
1615 + ?>-user-role-types').on('tokenize:select', function(container) {
1616 + $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1617 + });
1618 + })
1619 + </script>
1620 +
1740 1621 </div>
1741 1622 </div>
1742 1623 </div>
1743 1624 <div class="columns">
@@ -1745,42 +1626,57 @@
1745 1626 <label for=""><?php
1746 1627 esc_html_e( 'Change Link', 'adminify' );
1747 1628 ?></label>
1748 1629 <input class="sub_menu_setting" name="link" type="url" placeholder="New link" value="<?php
1749 - echo esc_attr( ( $sub_menu_name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1750 - ?>" onchange="checkForLinkTarget(this)" >
1751 -
1752 - <label for="external_link-<?php
1753 - echo esc_attr( $sub_menu_name_attr );
1630 + echo esc_attr( ( $sub_menu_name_attr != ltrim( $link, '#' ) ? $link : '' ) ) ;
1754 1631 ?>">
1755 - <?php
1756 - esc_html_e( 'New Window?', 'adminify' );
1757 - ?>
1758 - <input class="sub_menu_setting" id="external_link-<?php
1759 - echo esc_attr( $sub_menu_name_attr );
1760 - ?>" name="external_link" type="checkbox" value="0" <?php
1761 - checked( (int) $external_link, 1 );
1762 - ?>disabled />
1763 -
1764 - </label>
1765 1632 </div>
1766 1633 <div class="column">
1767 - <label for="" style="margin-top:25px">
1768 - <?php
1769 - esc_html_e( 'Custom Icon is not allowed for Submenu', 'adminify' );
1634 + <label for=""><?php
1635 + esc_html_e( 'Set Custom Icon', 'adminify' );
1636 + ?> <i>(<?php
1637 + esc_html_e( 'Not available for Submenu.', 'adminify' );
1638 + ?>)</i></label>
1639 +
1640 + <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable-no is-pulled-left">
1641 + <ul class="icon-picker">
1642 + <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1643 + <?php
1644 + $custom_class = '';
1645 + $icon = '<i class="' . $this->get_icon( esc_attr( $icon ), 'dashicons dashicons-external' ) . '"></i>';
1646 +
1647 + if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1648 + $custom_class = 'custom-icon';
1649 + $icon = '<img src="' . esc_url( WP_ADMINIFY_ASSETS_IMAGE ) . 'logos/menu-icon.svg" />';
1650 + }
1651 +
1770 1652 ?>
1771 - </label>
1653 + <li class="select-icon <?php
1654 + echo esc_attr( $custom_class ) ;
1655 + ?>" title="Icon Library">
1656 + <?php
1657 + echo wp_kses_post( $icon ) ;
1658 + ?>
1659 + </li>
1660 + <input type="hidden" class="sub_menu_setting" name="icon" value="<?php
1661 + echo esc_attr( $icon ) ;
1662 + ?>">
1663 + </ul>
1664 + </div>
1665 +
1772 1666 </div>
1773 1667 </div>
1774 1668 </div>
1775 1669 <?php
1670 +
1776 1671 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1777 1672 ?>
1778 1673 <div class="remove-add-new-menu"><span data-id="<?php
1779 - echo esc_attr( $sub_menu_name_attr );
1674 + echo esc_attr( $sub_menu_name_attr ) ;
1780 1675 ?>"><i class="icon-close"></i> Delete</span></div>
1781 1676 <?php
1782 1677 }
1678 +
1783 1679 ?>
1784 1680 </div>
1785 1681 </div>
1786 1682 </div>
@@ -1785,24 +1681,21 @@
1785 1681 </div>
1786 1682 </div>
1787 1683 </div>
1788 1684
1789 - <?php
1685 + <?php
1790 1686 }
1791 -
1687 +
1792 1688 /**
1793 1689 * Add New Menu Item.
1794 1690 */
1795 - public function render_add_new_menu_item( $submenu = false ) {
1796 - $add_item = apply_filters( 'pxlbsadminify/menu_editor', [
1797 - 'upgrade_pro' => Utils::upgrade_pro_notice( ' ' ),
1798 - 'upgrade_class' => 'upgrade-pro',
1799 - ] );
1691 + public function render_add_new_menu_item( $submenu = false )
1692 + {
1800 1693 ?>
1801 - <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 - echo esc_attr( ( $submenu ? 'submenu' : '' ) );
1694 + <div class="accordion add-new-menu-editor-item <?php
1695 + echo esc_attr( ( $submenu ? 'submenu' : '' ) ) ;
1803 1696 ?> <?php
1804 - echo esc_attr( $add_item['upgrade_class'] );
1697 + echo ( !jltwp_adminify()->can_use_premium_code__premium_only() ? 'upgrade-pro' : '' ) ;
1805 1698 ?>">
1806 1699 <div class="inner-text">
1807 1700 <i class="dashicons dashicons-plus-alt"></i>
1808 1701 <span class="title"><?php
@@ -1809,83 +1702,81 @@
1809 1702 esc_html_e( 'Add Item', 'adminify' );
1810 1703 ?></span>
1811 1704 </div>
1812 1705 <?php
1813 - echo wp_kses( $add_item['upgrade_pro'], Utils::kses_allowed_html() );
1706 + echo Utils::adminify_upgrade_pro( ' ' ) ;
1814 1707 ?>
1815 1708 </div>
1816 - <?php
1709 + <?php
1817 1710 }
1818 -
1711 +
1819 1712 /**
1820 1713 * Menu Editor Header
1821 1714 *
1822 1715 * @return void
1823 1716 */
1824 - public static function render_menu_editor_header() {
1717 + public function render_menu_editor_header()
1718 + {
1825 1719 ?>
1826 1720
1827 - <div class="adminify-flex adminify-flex-center adminify-justify-between">
1828 - <div class="adminify-menu-editor-help-urls adminify-flex adminify-flex-center adminify-gap-2">
1829 - <?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(
1721 + <div class="adminify-menu-editor-help-urls wp-heading-inline is-pulled-left is-flex is-align-items-center">
1722 + <?php
1723 + echo Utils::adminfiy_help_urls(
1832 1724 __( 'Menu Editor', 'adminify' ),
1833 1725 'https://wpadminify.com/kb/wordpress-dashboard-menu-editor/',
1834 1726 'https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8',
1835 1727 'https://www.facebook.com/groups/jeweltheme',
1836 - esc_url( \PXLBSAdminify\Inc\Admin\AdminSettings::support_url() )
1837 - );
1728 + 'https://wpadminify.com/support/'
1729 + ) ;
1838 1730 ?>
1839 - </div>
1731 + </div>
1840 1732
1841 1733
1842 - <div class="wp-adminify--page--title--actions adminify-flex adminify-flex-center adminify-gap-2">
1734 + <div class="wp-adminify--page--title--actions mt-1 is-pulled-right">
1843 1735
1844 - <button class="adminify-btn adminify-btn-outline-primary adminify_menu_save_settings">
1845 - <?php
1736 + <button class="page-title-action mr-3 adminify_menu_save_settings">
1737 + <?php
1846 1738 esc_html_e( 'Save', 'adminify' );
1847 1739 ?>
1848 - </button>
1740 + </button>
1849 1741
1850 - <div class="adminify-dropdown">
1851 - <div class="adminify-dropdown-trigger">
1852 - <button class="adminify-btn adminify-btn-outline-primary" aria-haspopup="true" aria-controls="dropdown-menu">
1853 - <svg class="icon" width="16" height="12" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg">
1854 - <path d="M5 12C3.63144 12.0007 2.43589 11.0751 2.09375 9.75H0.5V8.25H2.0945C2.48423 6.74059 3.96509 5.78119 5.50196 6.04243C7.03883 6.30366 8.11953 7.69847 7.98865 9.25188C7.85776 10.8053 6.55892 11.9996 5 12ZM5 7.5C4.18055 7.50083 3.51342 8.15914 3.50167 8.97851C3.48993 9.79788 4.13792 10.475 4.95702 10.4993C5.77611 10.5237 6.46312 9.88613 6.5 9.0675V9.3675V9C6.5 8.17158 5.82843 7.5 5 7.5ZM15.5 9.75H8.75V8.25H15.5V9.75ZM8.75 6C7.38172 6.00035 6.18657 5.07483 5.8445 3.75H0.5V2.25H5.8445C6.23423 0.740588 7.71509 -0.218809 9.25196 0.0424253C10.7888 0.30366 11.8695 1.69847 11.7386 3.25188C11.6078 4.80529 10.3089 5.99961 8.75 6ZM8.75 1.5C7.93055 1.50083 7.26342 2.15914 7.25167 2.97851C7.23993 3.79788 7.88792 4.47503 8.70702 4.49934C9.52611 4.52365 10.2131 3.88613 10.25 3.0675V3.3675V3C10.25 2.17158 9.57843 1.5 8.75 1.5ZM15.5 3.75H12.5V2.25H15.5V3.75Z" fill="#0347FF" />
1855 - </svg>
1856 - </button>
1857 - </div>
1858 - <div class="adminify-dropdown-menu" id="dropdown-menu" role="menu">
1859 - <div class="adminify-dropdown-content adminify-flex adminify-flex-col adminify-gap-2">
1860 - <a href="#" class="adminify-dropdown-item adminify_export_menu_settings">
1861 - <?php
1742 + <div class="dropdown is-right is-hoverable is-pulled-right">
1743 + <div class="dropdown-trigger">
1744 + <button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
1745 + <svg class="icon" width="16" height="12" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg">
1746 + <path d="M5 12C3.63144 12.0007 2.43589 11.0751 2.09375 9.75H0.5V8.25H2.0945C2.48423 6.74059 3.96509 5.78119 5.50196 6.04243C7.03883 6.30366 8.11953 7.69847 7.98865 9.25188C7.85776 10.8053 6.55892 11.9996 5 12ZM5 7.5C4.18055 7.50083 3.51342 8.15914 3.50167 8.97851C3.48993 9.79788 4.13792 10.475 4.95702 10.4993C5.77611 10.5237 6.46312 9.88613 6.5 9.0675V9.3675V9C6.5 8.17158 5.82843 7.5 5 7.5ZM15.5 9.75H8.75V8.25H15.5V9.75ZM8.75 6C7.38172 6.00035 6.18657 5.07483 5.8445 3.75H0.5V2.25H5.8445C6.23423 0.740588 7.71509 -0.218809 9.25196 0.0424253C10.7888 0.30366 11.8695 1.69847 11.7386 3.25188C11.6078 4.80529 10.3089 5.99961 8.75 6ZM8.75 1.5C7.93055 1.50083 7.26342 2.15914 7.25167 2.97851C7.23993 3.79788 7.88792 4.47503 8.70702 4.49934C9.52611 4.52365 10.2131 3.88613 10.25 3.0675V3.3675V3C10.25 2.17158 9.57843 1.5 8.75 1.5ZM15.5 3.75H12.5V2.25H15.5V3.75Z" fill="#0347FF" />
1747 + </svg>
1748 + </button>
1749 + </div>
1750 + <div class="dropdown-menu" id="dropdown-menu" role="menu">
1751 + <div class="dropdown-content">
1752 + <a href="#" class="dropdown-item adminify_export_menu_settings">
1753 + <?php
1862 1754 esc_html_e( 'Export menu', 'adminify' );
1863 1755 ?>
1864 - </a>
1865 - <input accept=".json" type="file" single="" id="adminify_import_menu" class="hidden">
1866 - <a href="#" class="adminify-dropdown-item adminify_import_menu_settings">
1867 - <?php
1756 + </a>
1757 + <input accept=".json" type="file" single="" id="adminify_import_menu" class="hidden">
1758 + <a href="#" class="dropdown-item adminify_import_menu_settings">
1759 + <?php
1868 1760 esc_html_e( 'Import menu', 'adminify' );
1869 1761 ?>
1870 - </a>
1871 - <a href="#" class="adminify-dropdown-item adminify_reset_menu_settings">
1872 - <?php
1762 + </a>
1763 + <a href="#" class="dropdown-item adminify_reset_menu_settings">
1764 + <?php
1873 1765 esc_html_e( 'Reset menu', 'adminify' );
1874 1766 ?>
1875 - </a>
1876 - </div>
1767 + </a>
1877 1768 </div>
1878 1769 </div>
1879 1770 </div>
1880 1771 </div>
1881 1772
1882 - <div class="adminify-text-wrap">
1773 + <div class="is-inline-block">
1883 1774 <p><?php
1884 1775 esc_html_e( 'Edit each menu item\'s name, link, icon and visibility. Drag and drop to rearange the menu. Changes will take effect after page refresh.', 'adminify' );
1885 1776 ?></p>
1886 - <p class="adminify-flex adminify-flex-center adminify-gap-1">
1887 - <svg class="" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
1777 + <p>
1778 + <svg class="is-pulled-left mr-1 mt-1" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
1888 1779 <path d="M7.33398 7.32002C7.33398 7.14321 7.40422 6.97364 7.52925 6.84861C7.65427 6.72359 7.82384 6.65335 8.00065 6.65335C8.17746 6.65335 8.34703 6.72359 8.47206 6.84861C8.59708 6.97364 8.66732 7.14321 8.66732 7.32002V11.32C8.66732 11.4968 8.59708 11.6664 8.47206 11.7914C8.34703 11.9164 8.17746 11.9867 8.00065 11.9867C7.82384 11.9867 7.65427 11.9164 7.52925 11.7914C7.40422 11.6664 7.33398 11.4968 7.33398 11.32V7.32002Z" fill="#4E4B66" />
1889 1780 <path d="M8.00065 4.034C7.82384 4.034 7.65427 4.10423 7.52925 4.22926C7.40422 4.35428 7.33398 4.52385 7.33398 4.70066C7.33398 4.87747 7.40422 5.04704 7.52925 5.17207C7.65427 5.29709 7.82384 5.36733 8.00065 5.36733C8.17746 5.36733 8.34703 5.29709 8.47206 5.17207C8.59708 5.04704 8.66732 4.87747 8.66732 4.70066C8.66732 4.52385 8.59708 4.35428 8.47206 4.22926C8.34703 4.10423 8.17746 4.034 8.00065 4.034Z" fill="#4E4B66" />
1890 1781 <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 1782 </svg>
@@ -1890,9 +1781,9 @@
1890 1781 <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 1782 </svg>
1892 1783
1893 1784 <?php
1894 - esc_html_e( 'If you have Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1785 + esc_html_e( 'If you have WP Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1895 1786 ?>
1896 1787
1897 1788 </p>
1898 1789 </div>
@@ -1897,24 +1788,26 @@
1897 1788 </p>
1898 1789 </div>
1899 1790
1900 1791
1901 - <?php
1792 + <?php
1902 1793 }
1903 -
1904 - public function menu_editor_contents() {
1794 +
1795 + public function jltwp_adminify_menu_editor_contents()
1796 + {
1905 1797 ?>
1906 1798
1907 1799 <div class="wrap">
1908 - <div class="wp-adminify--menu--editor--container">
1800 + <div class="wp-adminify--menu--editor--container mt-4">
1909 1801
1910 - <!-- <div id="adminify-data-saved-message"></div> -->
1802 + <div id="adminify-data-saved-message"></div>
1911 1803
1912 1804 <?php
1913 - //self::render_menu_editor_header();
1805 + $this->render_menu_editor_header();
1914 1806 ?>
1915 1807
1916 - <div class="wp-adminify--menu--editor--settings adminify-flex adminify-flex-col adminify-gap-4">
1808 +
1809 + <div class="wp-adminify--menu--editor--settings mt-5 pt-3">
1917 1810 <div class="wp-adminify-menu-editor-loader"></div>
1918 1811 <?php
1919 1812 $this->render_menu_editor();
1920 1813 ?>
@@ -1922,10 +1815,9 @@
1922 1815
1923 1816 </div>
1924 1817 </div>
1925 1818 <a href="#" id="adminify_download_settings" style="display: none;" ?></a>
1926 -<?php
1819 + <?php
1927 1820 }
1928 -
1821 +
1929 1822 }
1930 -
1931 1823 }