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