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