*/ if ( !class_exists( 'MenuEditor' ) ) { class MenuEditor extends MenuEditorModel { public $url; public $menu; public $users; public $roles; public $submenu; public $options = []; public $menu_settings = []; public static $instance; public static function get_instance() { if ( self::$instance === null ) { self::$instance = new self(); } return self::$instance; } public function __construct() { $this->menu_settings = ( new MenuEditorOptions() )->get(); $this->options = (array) AdminSettings::get_instance()->get(); add_filter( 'upload_mimes', [$this, 'custom_icon_mime_types'] ); add_filter( 'wp_handle_upload_prefilter', [$this, 'sanitize_svg_file'] ); add_filter( 'admin_body_class', [$this, 'jltwp_adminify_menu_editor_body_class'] ); // add_filter('parent_file', [$this, 'set_menu'], 800); // add_filter('parent_file', [$this, 'apply_menu'], 900); // add_action('jltwp_adminify_modules_menu_editor_render', [$this, 'jltwp_adminify_modules_menu_editor_render']); if ( apply_filters( 'enable_jltwp_adminify_menu_editor_render', true ) ) { add_filter( 'parent_file', [$this, 'set_menu'], 800 ); add_filter( 'parent_file', [$this, 'apply_menu'], 900 ); } add_action( 'wp_ajax_adminify_save_menu_settings', [$this, 'adminify_save_menu_settings'] ); add_action( 'wp_ajax_adminify_reset_menu_settings', [$this, 'adminify_reset_menu_settings'] ); add_action( 'wp_ajax_adminify_export_menu_settings', [$this, 'adminify_export_menu_settings'] ); add_action( 'wp_ajax_adminify_import_menu_settings', [$this, 'adminify_import_menu_settings'] ); add_action( 'wp_ajax_adminify_file_upload', [$this, 'adminify_file_upload_callback'] ); add_action( 'wp_ajax_adminify_load_custom_icons', [$this, 'adminify_load_custom_icons_callback'] ); add_action( 'wp_ajax_adminify_search_users', [$this, 'adminify_search_users_callback'] ); new MenuEditorAssets(); } public function custom_icon_mime_types( $mimes ) { if ( current_user_can( 'administrator' ) ) { $mimes['svg'] = 'image/svg+xml'; } return $mimes; } public function sanitize_svg_file( $file ) { // Step 1: Validate File Type $file_type = wp_check_filetype( $file['name'] ); // Ensure the file is an SVG if ( $file_type['ext'] === 'svg' ) { // Read the contents of the SVG file $file_contents = file_get_contents( $file['tmp_name'] ); // Validate if it's an actual SVG by checking if it contains the tag if ( strpos( $file_contents, 'sanitize( $file_contents ); if ( $clean_svg ) { // Save the sanitized SVG back to the file file_put_contents( $file['tmp_name'], $clean_svg ); } else { $file['error'] = 'Failed to sanitize the SVG file'; } } return $file; } public function filter_attachment( $value ) { // return $value->post_title == 'adminify-custom-icon'; return strpos( $value->guid, 'adminify-custom-icon' ) !== false; } public function adminify_load_custom_icons_callback() { // Security check - verify nonce and capability check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ); if ( !current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'You do not have permission to perform this action.', 'adminify' ), ) ); } $result['images'] = null; $query = get_posts( [ 'post_type' => 'attachment', 'numberposts' => -1, ] ); $filtered = array_filter( $query, [$this, 'filter_attachment'] ); foreach ( $filtered as $key => $value ) { $result['images'][$value->ID] = $value->guid; } echo wp_json_encode( $result ); die; } public function adminify_file_upload_callback() { $result['status'] = false; check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ); if ( !current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'You do not have permission to perform this action.', 'adminify' ), ) ); } $upload_dir = wp_upload_dir(); $targeted_dir = $upload_dir['basedir'] . '/adminify-custom-icons'; if ( !is_dir( $targeted_dir ) ) { wp_mkdir_p( $targeted_dir ); } add_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] ); $files = wp_kses_post_deep( wp_unslash( $_FILES['my_file_upload'] ) ); foreach ( $files['name'] as $key => $value ) { if ( $files['name'][$key] ) { $file = [ 'name' => $files['name'][$key], 'type' => $files['type'][$key], 'tmp_name' => $files['tmp_name'][$key], 'error' => $files['error'][$key], 'size' => $files['size'][$key], ]; $_FILES = [ 'upload_file' => $file, ]; $attachment_id = media_handle_upload( 'upload_file', 0 ); if ( is_wp_error( $attachment_id ) ) { // There was an error uploading the image. $result['status'] = false; $result['message'] = __( 'Error uploading file.', 'adminify' ); } else { // The image was uploaded successfully! $result['status'] = true; $result['message'] = __( 'File Uploaded successfully.', 'adminify' ); $result['images'][$attachment_id] = wp_get_attachment_url( $attachment_id ); } } } remove_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] ); echo wp_json_encode( $result ); wp_die(); } public function adminify_icon_custom_upload_dir( $dir_data ) { // $dir_data already you might want to use $custom_dir = 'adminify-custom-icons'; return [ 'path' => $dir_data['basedir'] . '/' . $custom_dir, 'url' => $dir_data['baseurl'] . '/' . $custom_dir, 'subdir' => '/' . $custom_dir, 'basedir' => $dir_data['basedir'], 'baseurl' => $dir_data['baseurl'], 'error' => $dir_data['error'], ]; } /** * AJAX callback to search users for Select2 * Uses 'fields' parameter for optimized database query performance */ public function adminify_search_users_callback() { check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ); if ( !current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'You do not have permission to perform this action.', 'adminify' ), ) ); } $search = ( isset( $_GET['search'] ) ? sanitize_text_field( wp_unslash( $_GET['search'] ) ) : '' ); // If no search term or less than 3 chars, return first 3 users if ( strlen( $search ) < 3 ) { $args = array( 'number' => 3, 'orderby' => 'ID', 'order' => 'DESC', 'fields' => array('ID', 'user_login', 'display_name'), ); $users = get_users( $args ); $results = array(); foreach ( $users as $user ) { $results[] = array( 'id' => $user->user_login, 'text' => $user->user_login . ' (' . $user->display_name . ')', ); } // Get total user count efficiently $user_count = count_users(); $total_users = $user_count['total_users']; wp_send_json( array( 'results' => $results, 'pagination' => array( 'more' => $total_users > 3, ), 'total_users' => $total_users, ) ); return; } // Search users when 3+ characters typed $args = array( 'search' => '*' . $search . '*', 'search_columns' => array('user_login', 'user_email', 'display_name'), 'number' => 20, 'orderby' => 'display_name', 'order' => 'ASC', 'fields' => array('ID', 'user_login', 'display_name'), ); $users = get_users( $args ); $results = array(); foreach ( $users as $user ) { $results[] = array( 'id' => $user->user_login, 'text' => $user->user_login . ' (' . $user->display_name . ')', ); } wp_send_json( array( 'results' => $results, 'pagination' => array( 'more' => false, ), ) ); } // Menu Editor Body Class public function jltwp_adminify_menu_editor_body_class( $classes ) { $classes .= ' adminify_menu_editor '; return $classes; } /** * Sanitises and strips tags of input from ajax * * @since 1.0.0 * @variables $values = item to clean (array or string) */ public function clean_ajax_input( $values ) { if ( is_array( $values ) ) { foreach ( $values as $index => $in ) { if ( is_array( $in ) ) { $values[$index] = $this->clean_ajax_input( $in ); } else { $values[$index] = strip_tags( $in ); } } } else { $values = strip_tags( $values ); } return $values; } /** * Returns ajax error * * @since 1.4 * @variables $message = error message to send back to user (string) */ public function ajax_error_message( $message ) { $returndata = []; $returndata['error'] = true; $returndata['error_message'] = $message; return json_encode( $returndata ); } public function adminify_save_menu_settings() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) { if ( !current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'You do not have permission to perform this action.', 'adminify' ), ) ); } $options = wp_kses_post_deep( wp_unslash( $_POST['options'] ) ); $options = $this->clean_ajax_input( $options ); if ( $options == '' || !is_array( $options ) ) { $message = __( 'No options supplied to save', 'adminify' ); echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ); die; } if ( is_array( $options ) ) { update_option( $this->prefix, $options ); $returndata = []; $returndata['success'] = true; $returndata['message'] = __( 'Settings saved', 'adminify' ); echo json_encode( $returndata ); die; } else { $message = __( 'Something went wrong', 'adminify' ); echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ); die; } } die; } /** * Menu Editor Settings Reset * * @return void */ public function adminify_reset_menu_settings() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) { if ( !current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'You do not have permission to perform this action.', 'adminify' ), ) ); } update_option( $this->prefix, [] ); $menu_editor_options = get_option( $this->prefix ); if ( !$menu_editor_options ) { $returndata = []; $returndata['success'] = true; $returndata['message'] = __( 'Settings reset', 'adminify' ); echo json_encode( $returndata ); die; } else { $message = __( 'Something went wrong', 'adminify' ); echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ); die; } } die; } /** * Export Menu Editor Settings * * @return void */ public function adminify_export_menu_settings() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) { if ( !current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'You do not have permission to perform this action.', 'adminify' ), ) ); } $menu_editor_options = get_option( $this->prefix ); echo json_encode( $menu_editor_options ); } die; } /** * Import Menu Editor Settings * * @since 1.0.0 */ public function adminify_import_menu_settings() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) { if ( !current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'You do not have permission to perform this action.', 'adminify' ), ) ); } $new_options = wp_kses_post_deep( $_POST['settings'] ); if ( $new_options == '' || !is_array( $new_options ) ) { $message = __( 'No options supplied to save', 'adminify' ); echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ); die; } if ( is_array( $new_options ) ) { update_option( $this->prefix, $new_options ); $returndata = []; $returndata['success'] = true; $returndata['message'] = __( 'Menu Imported', 'adminify' ); echo json_encode( $returndata ); die; } else { $message = __( 'Something went wrong', 'adminify' ); echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) ); die; } } die; } /** * Get menu items * * @param [type] $parent_file * * @return void */ public function set_menu( $parent_file ) { global $menu, $submenu; $this->menu = $this->sort_menu_settings( $menu ); $this->submenu = $this->sort_sub_menu_settings( $this->menu, $submenu ); return $parent_file; } /** * Sorts Menu's for Option settings */ public function sort_menu_settings( $thismenu ) { $menu_settings = $this->menu_settings; $tempmenu = []; foreach ( $thismenu as $key => $current_menu_item ) { if ( $current_menu_item[4] === "wp-menu-separator" ) { unset($thismenu[$key]); continue; } if ( !current_user_can( 'administrator' ) && $current_menu_item[2] === 'vc-welcome' ) { unset($thismenu[$key]); continue; } $next_menu_item = next( $thismenu ); $optiongroup = []; $order = $key; $separator = 0; $external_link = 0; $icon = null; $hidden_for = []; if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) { $separator = 1; } if ( is_array( $menu_settings ) ) { if ( isset( $menu_settings[$current_menu_item[2]] ) ) { $optiongroup = $menu_settings[$current_menu_item[2]]; if ( isset( $optiongroup['order'] ) ) { $order = $optiongroup['order']; } if ( isset( $optiongroup['separator'] ) ) { $separator = $optiongroup['separator']; } if ( isset( $optiongroup['external_link'] ) ) { $external_link = $optiongroup['external_link']; } if ( !empty( $optiongroup['icon'] ) ) { $icon = $optiongroup['icon']; } if ( !empty( $optiongroup['hidden_for'] ) ) { $hidden_for = $optiongroup['hidden_for']; } } } $current_menu_item['order'] = $order; $current_menu_item['hidden_for'] = $hidden_for; $current_menu_item['separator'] = $separator; $current_menu_item['external_link'] = $external_link; // if (empty($this->options['admin_ui'])) { if ( $icon !== null ) { if ( strpos( $icon, 'dashicons ' ) !== false ) { $menu_icon = str_replace( 'dashicons ', '', $icon ); $current_menu_item[6] = $menu_icon; } else { if ( strpos( $icon, ',' ) !== false ) { $menu_icon = explode( ',', $icon )[1]; } else { $menu_icon = 'dashicons-adminify- ' . $icon; } $current_menu_item[6] = $menu_icon; } } if ( $separator == 1 ) { $current_menu_item[4] = $current_menu_item[4] . ' adminify-menu-separator'; } // } array_push( $tempmenu, $current_menu_item ); if ( isset( $menu_settings[$current_menu_item[2]] ) ) { unset($menu_settings[$current_menu_item[2]]); } } if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) { foreach ( $menu_settings as $key => $menu_s ) { // Skip if $menu_s is not an array if ( !is_array( $menu_s ) ) { continue; } // Ensure required keys exist with defaults $menu_s = wp_parse_args( $menu_s, [ 'name' => '', 'link' => '', 'icon' => '', 'order' => 0, 'separator' => 0, 'external_link' => 0, 'hidden_for' => [], ] ); $new_array = [ $menu_s['name'], 'read', ( !empty( $menu_s['link'] ) ? $menu_s['link'] : '' ), '', 'menu-top menu-icon-custom', $key, ( !empty( $menu_s['icon'] ) ? $menu_s['icon'] : '' ), 'order' => $menu_s['order'], 'separator' => ( !empty( $menu_s['separator'] ) ? $menu_s['separator'] : 0 ), 'external_link' => ( !empty( $menu_s['external_link'] ) ? $menu_s['external_link'] : 0 ), 'hidden_for' => ( !empty( $menu_s['hidden_for'] ) ? $menu_s['hidden_for'] : [] ) ]; // if (empty($this->options['admin_ui'])) { if ( strpos( $menu_s['icon'], 'dashicons ' ) !== false ) { $menu_icon = str_replace( 'dashicons ', '', $menu_s['icon'] ); } else { if ( empty( $menu_s['icon'] ) || strpos( $menu_s['icon'], ',' ) !== false ) { if ( empty( $menu_s['icon'] ) ) { $menu_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg'; } else { $menu_icon = explode( ',', $menu_s['icon'] )[1]; } } else { $menu_icon = 'dashicons-adminify- ' . $menu_s['icon']; } } if ( !empty( $menu_s['separator'] ) && $menu_s['separator'] == 1 ) { $new_array[4] = $new_array[4] . ' adminify-menu-separator'; } // if (!empty($menu_s['external_link']) && $menu_s['external_link'] == 1) { // $new_array[4] = $new_array[4] . ' adminify-menu-external_link'; // } $new_array[6] = $menu_icon; // } array_push( $tempmenu, $new_array ); } } return $this->sort_array( $tempmenu ); } /** * usort function for menu arrays */ public function sort_array_helper( $a, $b ) { $result = 0; if ( !isset( $a['order'] ) ) { return $result; } if ( $a['order'] > $b['order'] ) { $result = 1; } elseif ( $a['order'] < $b['order'] ) { $result = -1; } return $result; } /** * Sorts arrays by key 'order' */ public function sort_array( $tosort ) { usort( $tosort, [$this, 'sort_array_helper'] ); return $tosort; } /** * Sorts Sub Menu for settings * * @since 1.4 */ public function sort_sub_menu_settings( $themenu, $thesubmenu ) { $menu_settings = $this->menu_settings; $tempsubmenu = []; foreach ( $themenu as $current_menu_item ) { $optiongroup = []; $submenu_items = []; if ( isset( $thesubmenu[$current_menu_item[2]] ) ) { $submenuitems = $thesubmenu[$current_menu_item[2]]; foreach ( $submenuitems as $key => $subitem ) { $subitem['order'] = $key; if ( is_array( $menu_settings ) && isset( $menu_settings[$current_menu_item[2]] ) && isset( $menu_settings[$current_menu_item[2]]['submenu'] ) ) { $submenugroup = $menu_settings[$current_menu_item[2]]['submenu']; if ( isset( $submenugroup[$subitem[2]] ) ) { $itemoptions = $submenugroup[$subitem[2]]; if ( isset( $itemoptions['order'] ) ) { $subitem['order'] = $itemoptions['order']; } } } array_push( $submenu_items, $subitem ); } $submenu_items = $this->sort_array( $submenu_items ); $tempsubmenu[$current_menu_item[2]] = $submenu_items; } } if ( is_array( $menu_settings ) ) { $tmp_menu = []; foreach ( $menu_settings as $key => $menu_s ) { if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) { $tmp_sub_menu = []; $i = 0; foreach ( $menu_s['submenu'] as $k => $sub_menu ) { if ( strpos( $k, 'adminify-custom-submenu' ) === false ) { continue; } $order = ( $sub_menu['order'] ? $sub_menu['order'] : $i ); $new_array = [ ( $sub_menu['name'] ? $sub_menu['name'] : '' ), 'read', ( $sub_menu['link'] ? $sub_menu['link'] : '' ), 'order' => $order, 'key' => $k, 'hidden_for' => ( isset( $sub_menu['hidden_for'] ) ? $sub_menu['hidden_for'] : [] ) ]; // processing submenu array $tmp_sub_menu[$order] = $new_array; $i++; } if ( !empty( $tmp_sub_menu ) ) { // adding submenu into temp variable $tmp_menu[$key] = $tmp_sub_menu; } } } if ( !empty( $tmp_menu ) ) { $tempsubmenu = array_merge_recursive( $tempsubmenu, $tmp_menu ); } foreach ( $tempsubmenu as $m_k => $m_menu ) { $tempsubmenu[$m_k] = $this->sort_array( $tempsubmenu[$m_k] ); } } return $tempsubmenu; } /** * Applies menu settings */ public function apply_menu( $parent_file ) { // Not applicable for Network Admin if ( is_multisite() && is_network_admin() ) { return; } global $menu, $submenu; $tempmenu = []; $tempsub = []; $submenu = $this->sort_sub_menu_settings( $menu, $submenu ); if ( $this->menu && is_array( $this->menu ) ) { foreach ( $this->menu as $key => $menu_item ) { if ( empty( $menu_item[2] ) ) { continue; } if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) { // Build Separator $newitem = $this->apply_separator_settings( $menu_item, $key ); if ( $newitem ) { array_push( $tempmenu, $newitem ); } } else { // Build Top Level $newitem = $this->apply_top_level_settings( $menu_item, $key ); if ( $newitem ) { array_push( $tempmenu, $newitem ); // Menu Editor Custom Separator if ( !empty( $newitem['separator'] ) ) { $separator_order = $this->menu[$key]['order']; $empty_separator = array( 0 => '', 1 => 'read', 2 => 'separator_' . rand( 200, 1000 ) * 1000, 3 => '', 4 => 'wp-menu-separator', 'order' => $separator_order + 0.5, ); array_push( $tempmenu, $empty_separator ); } $parent_key = $newitem[2]; if ( strpos( $newitem[5], 'adminify-custom-menu-' ) !== false ) { $parent_key = $newitem[5]; } if ( isset( $this->submenu[$parent_key] ) ) { $subitem = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key ); if ( $subitem ) { $tempsub[$newitem[2]] = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key ); } } } } } } $submenu = $tempsub; $menu = $this->sort_array( $tempmenu ); return $parent_file; } /** * Applies sub level menu item settings * * @return $tempsub | false * * @since 1.4 */ public function apply_sub_level_settings( $subitems, $parentname ) { if ( !is_array( $this->menu_settings ) ) { return $subitems; } if ( !isset( $this->menu_settings[$parentname]['submenu'] ) ) { return $subitems; } $submenu_settings = $this->menu_settings[$parentname]['submenu']; $tempsub = []; foreach ( $subitems as $current_menu_item ) { $sub_level = apply_filters( 'adminify/menu_editor', [ 'sub_level' => false, ] ); if ( !empty( $sub_level['sub_level'] ) ) { if ( empty( $current_menu_item[0] ) || $current_menu_item[2] === 'wp-adminify-settings-pricing' ) { continue; } } $name = ''; $link = ''; $disabled_for = []; $optiongroup = []; // NO SETTINGS if ( isset( $submenu_settings[$current_menu_item[2]] ) ) { $optiongroup = $submenu_settings[$current_menu_item[2]]; if ( isset( $optiongroup['name'] ) ) { $name = $optiongroup['name']; if ( $name != '' ) { $current_menu_item[0] = $name; } } if ( isset( $optiongroup['link'] ) ) { $link = $optiongroup['link']; if ( $link != '' ) { $current_menu_item[2] = $link; $current_menu_item['link'] = $link; } } if ( isset( $optiongroup['external_link'] ) ) { $external_link = $optiongroup['external_link']; } if ( isset( $optiongroup['hidden_for'] ) ) { $disabled_for = $optiongroup['hidden_for']; if ( $this->is_hidden( $disabled_for ) ) { $current_menu_item['hidden_for'] = true; continue; } } } $custom_menu = ( isset( $current_menu_item['key'] ) ? $current_menu_item['key'] : '' ); if ( strpos( $custom_menu, 'adminify-custom-submenu-' ) !== false ) { if ( isset( $submenu_settings[$current_menu_item['key']]['hidden_for'] ) ) { $disabled_for = $submenu_settings[$current_menu_item['key']]['hidden_for']; } if ( isset( $submenu_settings[$current_menu_item['key']]['external_link'] ) ) { $external_link = $submenu_settings[$current_menu_item['key']]['external_link']; } if ( $this->is_hidden( $disabled_for ) ) { $current_menu_item['hidden_for'] = true; continue; } } array_push( $tempsub, $current_menu_item ); } if ( count( $tempsub ) < 1 ) { return false; } else { return $tempsub; } } /** * Applies top level menu item settings * * @since 1.4 */ public function apply_top_level_settings( $current_menu_item, $key ) { $name = ''; $link = ''; $icon = ''; $disabled_for = []; $optiongroup = []; $order = $key; if ( is_array( $this->menu_settings ) ) { if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) { $optiongroup = $this->menu_settings[$current_menu_item[2]]; if ( isset( $optiongroup['name'] ) ) { $name = $optiongroup['name']; if ( $name != '' ) { $current_menu_item[0] = $name; } } if ( isset( $optiongroup['link'] ) ) { $link = $optiongroup['link']; if ( $link != '' ) { $current_menu_item[2] = $link; $current_menu_item['link'] = $link; } } if ( isset( $optiongroup['external_link'] ) ) { $external_link = ( $optiongroup['external_link'] ? $optiongroup['external_link'] : '' ); } if ( isset( $optiongroup['icon'] ) ) { $icon = $optiongroup['icon']; if ( $icon != '' ) { $current_menu_item['icon'] = $icon; } } if ( isset( $optiongroup['order'] ) ) { $order = $optiongroup['order']; } if ( isset( $optiongroup['hidden_for'] ) ) { $disabled_for = $optiongroup['hidden_for']; if ( $this->is_hidden( $disabled_for ) ) { $current_menu_item['hidden_for'] = true; } else { $current_menu_item['hidden_for'] = false; } } } $custom_menu = ( isset( $current_menu_item[5] ) ? $current_menu_item[5] : '' ); if ( strpos( $custom_menu, 'adminify-custom-menu-' ) !== false ) { if ( isset( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) && !empty( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) ) { $disabled_for = $this->menu_settings[$current_menu_item[5]]['hidden_for']; if ( $this->is_hidden( $disabled_for ) ) { $current_menu_item['hidden_for'] = true; } } if ( isset( $this->menu_settings[$current_menu_item[5]]['external_link'] ) ) { $external_link = $this->menu_settings[$current_menu_item[5]]['external_link']; } } } $current_menu_item['order'] = $order; if ( isset( $current_menu_item['hidden_for'] ) ) { if ( $current_menu_item['hidden_for'] === true ) { return false; } else { return $current_menu_item; } } else { return $current_menu_item; } } /** * Hidden for method * * @param [type] $disabled_for * * @return boolean */ public function is_hidden( $disabled_for ) { if ( !is_array( $disabled_for ) ) { return false; } $current_user = wp_get_current_user(); $current_roles = $current_user->roles; $all_roles = wp_roles()->get_names(); foreach ( $current_roles as $current_role ) { if ( isset( $all_roles[$current_role] ) && in_array( $all_roles[$current_role], $disabled_for ) ) { return true; } } // Normalize disabled_for array $disabled_for_arr = []; foreach ( $disabled_for as $v ) { $disabled_for_arr[] = jlt_adminify_sluggify_with_underscores( $v ); } $slugify_user_login = jlt_adminify_sluggify_with_underscores( $current_user->user_login ); // Check Username if ( in_array( $current_user->user_login, $disabled_for_arr ) || in_array( $slugify_user_login, $disabled_for_arr ) ) { return true; } // Check User Roles and Capabilities foreach ( $current_roles as $role ) { $role_obj = get_role( $role ); if ( !$role_obj ) { continue; } // Check if role slug is in disabled array if ( in_array( $role, $disabled_for_arr ) ) { return true; } // Check if role display name is in disabled array if ( isset( $disabled_for_arr[$role] ) && (in_array( $all_roles[$role], $disabled_for ) || in_array( strtolower( $all_roles[$role] ), array_map( 'strtolower', $disabled_for ) )) ) { return true; } // Check for custom roles foreach ( $disabled_for as $disabled_item ) { // Convert role names to match WordPress format $disabled_role = str_replace( ' ', '_', strtolower( $disabled_item ) ); if ( $role === $disabled_role ) { return true; } } } // Handle Super Admin specially if ( is_super_admin( $current_user->ID ) ) { if ( in_array( 'Super Admin', $disabled_for_arr ) || in_array( 'super_admin', $disabled_for_arr ) || in_array( 'administrator', $disabled_for_arr ) ) { return true; } // Super admin sees everything by default unless explicitly disabled return false; } // Special check for user ID 1 (default admin) if ( $current_user->ID === 1 ) { if ( in_array( 'Super Admin', $disabled_for_arr ) || in_array( 'super_admin', $disabled_for_arr ) || in_array( 'administrator', $disabled_for_arr ) ) { return true; } return false; } return false; } /** * Applies separator menu item settings * * @since 1.0.0 */ public function apply_separator_settings( $current_menu_item, $key ) { $name = ''; $disabled_for = []; $optiongroup = []; $order = $key; if ( is_array( $this->menu_settings ) ) { if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) { $optiongroup = $this->menu_settings[$current_menu_item[2]]; if ( isset( $optiongroup['name'] ) ) { $name = $optiongroup['name']; if ( $name != '' ) { $current_menu_item['name'] = $name; } } if ( isset( $optiongroup['order'] ) ) { $order = $optiongroup['order']; } if ( isset( $optiongroup['hidden_for'] ) ) { $disabled_for = $optiongroup['hidden_for']; if ( $this->is_hidden( $disabled_for ) ) { $current_menu_item['hidden_for'] = true; } } } } $current_menu_item['order'] = $order; if ( isset( $current_menu_item['hidden_for'] ) ) { if ( $current_menu_item['hidden_for'] == true ) { return false; } else { return $current_menu_item; } } else { return $current_menu_item; } } public function get_saved_sub_menu() { $menu_settings = $this->menu_settings; $menu = $this->menu; $submenu = $this->submenu; if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) { foreach ( $menu as $menu_item ) { if ( isset( $menu_settings[$menu_item[2]] ) ) { unset($menu_settings[$menu_item[2]]); } } $tmp_menu = []; foreach ( $menu_settings as $key => $menu_s ) { if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) { $tmp_sub_menu = []; $i = 0; foreach ( $menu_s['submenu'] as $k => $sub_menu ) { $new_array = [ $sub_menu['name'], 'read', $sub_menu['link'], 'order' => $i ]; $tmp_sub_menu[$i] = $new_array; $i++; } if ( !empty( $tmp_sub_menu ) ) { $tmp_menu[$key] = $tmp_sub_menu; } } } if ( !empty( $tmp_menu ) ) { $submenu = $submenu + $tmp_menu; } } return $submenu; } /** * Render Menu Editor */ public function render_menu_editor() { global $wp_roles; $this->roles = $wp_roles->roles; if ( $this->menu && is_array( $this->menu ) ) { foreach ( $this->menu as $menu_item ) { $next_menu_item = next( $this->menu ); if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) { // Render Separator // $this->render_menu_separator($menu_item); } else { // Render Top Level menu $this->render_top_level_menu_item( $this->menu, $menu_item, $this->submenu, $next_menu_item ); } } $this->render_add_new_menu_item(); } } public function get_icon( $value, $default ) { if ( empty( $value ) ) { return $default; } return $value; } /** * Generate User Rules Select box */ public function generate_user_rules_select_field( $menu_id, $disabled_for, $menu_type = 'menu' ) { ob_start(); ?> menu_settings; if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) { $separator = 1; } if ( is_array( $menu_options ) ) { if ( isset( $menu_options[$current_menu_item[2]] ) ) { $optiongroup = $menu_options[$current_menu_item[2]]; if ( isset( $optiongroup['name'] ) ) { $name = $optiongroup['name']; } if ( isset( $optiongroup['link'] ) ) { $link = $optiongroup['link']; } if ( isset( $optiongroup['icon'] ) ) { $icon = $optiongroup['icon']; } if ( isset( $optiongroup['hidden_for'] ) ) { $disabled_for = $optiongroup['hidden_for']; } if ( isset( $optiongroup['separator'] ) ) { $separator = $optiongroup['separator']; } if ( isset( $optiongroup['external_link'] ) ) { $external_link = $optiongroup['external_link']; } } } $name_attr = $current_menu_item[2]; if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) { $name_attr = $current_menu_item[5]; $name = $current_menu_item[0]; $link = $current_menu_item[2]; if ( isset( $menu_options[$current_menu_item[5]]['hidden_for'] ) ) { $disabled_for = $menu_options[$current_menu_item[5]]['hidden_for']; } if ( isset( $menu_options[$current_menu_item[5]] ) ) { $optiongroup = $menu_options[$current_menu_item[5]]; } if ( isset( $menu_options[$current_menu_item[5]]['icon'] ) ) { $icon = $menu_options[$current_menu_item[5]]['icon']; } if ( isset( $current_menu_item['separator'] ) ) { $separator = $current_menu_item['separator']; } if ( isset( $current_menu_item['external_link'] ) ) { $external_link = $current_menu_item['external_link']; } } if ( !is_array( $disabled_for ) ) { $disabled_for = []; } // LIST OF AVAILABLE MENU ICONS $icons = [ 'dashicons-admin-multisite' => 'dashicons dashicons-admin-multisite', 'dashicons-dashboard' => 'dashicons dashicons-dashboard', 'dashicons-admin-post' => 'dashicons dashicons-admin-post', 'dashicons-database' => 'dashicons dashicons-database', 'dashicons-admin-media' => 'dashicons dashicons-admin-media', 'dashicons-admin-page' => 'dashicons dashicons-admin-page', 'dashicons-admin-comments' => 'dashicons dashicons-admin-comments', 'dashicons-admin-appearance' => 'dashicons dashicons-admin-appearance', 'dashicons-admin-plugins' => 'dashicons dashicons-admin-plugins', 'dashicons-admin-users' => 'dashicons dashicons-admin-users', 'dashicons-admin-tools' => 'dashicons dashicons-admin-tools', 'dashicons-chart-bar' => 'dashicons dashicons-chart-bar', 'dashicons-admin-settings' => 'dashicons dashicons-admin-settings', ]; $default_icons = ( isset( $current_menu_item ) ? $current_menu_item[6] : 'dashicons dashicons-external' ); ?>
.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) ); ?>
Delete
build_sub_menu_item( $sub_menu_item, $optiongroup, $name_attr ); } } else { ?> render_add_new_menu_item( true ); // true for submenu item ?>
menu_settings; if ( is_array( $menu_options ) ) { if ( isset( $menu_options[$current_menu_item[2]] ) ) { $optiongroup = $menu_options[$current_menu_item[2]]; if ( isset( $optiongroup['name'] ) ) { $name = $optiongroup['name']; } if ( isset( $optiongroup['hidden_for'] ) ) { $disabled_for = $optiongroup['hidden_for']; } } } if ( !is_array( $disabled_for ) ) { $disabled_for = []; } ?>
menu_settings; if ( isset( $optiongroup['submenu'] ) ) { if ( isset( $optiongroup['submenu'][$current_menu_item[2]] ) ) { $suboptiongroup = $optiongroup['submenu'][$current_menu_item[2]]; if ( isset( $suboptiongroup['name'] ) ) { $name = $suboptiongroup['name']; } if ( isset( $suboptiongroup['link'] ) ) { $link = $suboptiongroup['link']; } if ( isset( $suboptiongroup['external_link'] ) ) { $external_link = $suboptiongroup['external_link']; } if ( isset( $suboptiongroup['icon'] ) ) { $icon = $suboptiongroup['icon']; } if ( isset( $suboptiongroup['hidden_for'] ) ) { $disabled_for = $suboptiongroup['hidden_for']; } } } $sub_menu_name_attr = $current_menu_item[2]; if ( isset( $current_menu_item['key'] ) ) { $sub_menu_name_attr = $current_menu_item['key']; } if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) { $name = $current_menu_item[0]; $link = $current_menu_item[2]; if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'] ) ) { $disabled_for = $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for']; } if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['icon'] ) ) { $icon = $optiongroup['submenu'][$sub_menu_name_attr]['icon']; } if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['external_link'] ) ) { $external_link = $optiongroup['submenu'][$sub_menu_name_attr]['external_link']; } } if ( !is_array( $disabled_for ) ) { $disabled_for = []; } $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $sub_menu_name_attr ); ?>
.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) ); } ?>
Delete
Utils::adminify_upgrade_pro( ' ' ), 'upgrade_class' => 'upgrade-pro', ] ); ?>

render_menu_editor(); ?>