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