*/ if (!class_exists('MenuEditor')) { class MenuEditor extends MenuEditorModel { public $url; public $menu; public $submenu; public function __construct() { $this->url = WP_ADMINIFY_URL . 'Inc/Modules/MenuEditor'; $this->menu_settings = (new MenuEditorOptions())->get(); add_action('admin_menu', [$this, 'jltwp_adminify_menu_editor_submenu'], 51); 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('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']); new MenuEditorAssets(); } // 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 = array(); $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) { $options = $_POST['options']; $options = $this->clean_ajax_input($options); if ($options == "" || !is_array($options)) { $message = __("No options supplied to save", 'adminify'); echo $this->ajax_error_message($message); die(); } if (is_array($options)) { update_option($this->prefix, $options); $returndata = array(); $returndata['success'] = true; $returndata['message'] = __('Settings saved', 'adminify'); echo json_encode($returndata); die(); } else { $message = __("Something went wrong", 'adminify'); echo $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) { update_option($this->prefix, array()); $menu_editor_options = get_option($this->prefix); if (!$menu_editor_options) { $returndata = array(); $returndata['success'] = true; $returndata['message'] = __('Settings reset', 'adminify'); echo json_encode($returndata); die(); } else { $message = __("Something went wrong", 'adminify'); echo $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) { $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) { $new_options = $this->clean_ajax_input($_POST['settings']); if (is_array($new_options)) { update_option($this->prefix, $new_options); } echo __("Menu Imported", 'adminify'); } 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 = array(); foreach ($thismenu as $key => $current_menu_item) { $optiongroup = array(); $order = $key; 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']; } } } $current_menu_item['order'] = $order; array_push($tempmenu, $current_menu_item); } 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; } else if ($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 = array(); foreach ($themenu as $current_menu_item) { $optiongroup = array(); $submenu_items = array(); 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; } } return $tempsubmenu; } /** * Applies menu settings */ public function apply_menu($parent_file) { global $menu, $submenu; $tempmenu = array(); $tempsub = array(); $submenu = $this->sort_sub_menu_settings($menu, $submenu); if ($menu && is_array($menu)) { foreach ($menu as $key => $menu_item) { 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); if (isset($submenu[$newitem[2]])) { $subitem = $this->apply_sub_level_settings($submenu[$newitem[2]], $newitem[2]); if ($subitem) { $tempsub[$newitem[2]] = $this->apply_sub_level_settings($submenu[$newitem[2]], $newitem[2]); } } } } } } $submenu = $tempsub; $menu = $this->sort_array($tempmenu); return $parent_file; } /** * Applies top level menu item settings * @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 = array(); foreach ($subitems as $current_menu_item) { $name = ''; $link = ''; $disabled_for = array(); $optiongroup = array(); ///NO SETTINGS if (!isset($submenu_settings[$current_menu_item[2]])) { array_push($tempsub, $current_menu_item); continue; } $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['hidden_for'])) { $disabled_for = $optiongroup['hidden_for']; if ($this->is_hidden($disabled_for)) { $current_menu_item['hidden'] = 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 = array(); $optiongroup = array(); $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['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'] = true; } } } } $current_menu_item['order'] = $order; if (isset($current_menu_item['hidden'])) { if ($current_menu_item['hidden'] == 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_name = $current_user->display_name; $current_roles = $current_user->roles; $all_roles = wp_roles()->get_names(); if (in_array($current_name, $disabled_for)) { return true; } ///MULTISITE SUPER ADMIN if (is_super_admin() && is_multisite()) { if (in_array('Super Admin', $disabled_for)) { return true; } else { return false; } } ///NORMAL SUPER ADMIN if ($current_user->ID === 1) { if (in_array('Super Admin', $disabled_for)) { return true; } else { return false; } } foreach ($current_roles as $role) { $role_name = $all_roles[$role]; if (in_array($role_name, $disabled_for)) { return true; } } } /** * Applies separator menu item settings * @since 1.0.0 */ public function apply_separator_settings($current_menu_item, $key) { $name = ''; $disabled_for = array(); $optiongroup = array(); $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'] = true; } } } } $current_menu_item['order'] = $order; if (isset($current_menu_item['hidden'])) { if ($current_menu_item['hidden'] == true) { return false; } else { return $current_menu_item; } } else { return $current_menu_item; } } /** * Menu Editor Menu */ public function jltwp_adminify_menu_editor_submenu() { add_submenu_page( 'wp-adminify-settings', esc_html__('Menu Editor by WP Adminify', 'adminify'), esc_html__('Menu Editor', 'adminify'), apply_filters('jltwp_adminify_capability', 'manage_options'), 'adminify-menu-editor', // Page slug, will be displayed in URL [$this, 'jltwp_adminify_menu_editor_contents'] ); } /** * Render Menu Editor */ public function render_menu_editor() { global $wp_roles; $users = get_users(); $this->users = $users; $this->roles = $wp_roles->roles; if ($this->menu && is_array($this->menu)) { foreach ($this->menu as $menu_item) { 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); } } ?> 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['link'])) { $link = $optiongroup['link']; } if (isset($optiongroup['icon'])) { $icon = $optiongroup['icon']; } if (isset($optiongroup['hidden_for'])) { $disabled_for = $optiongroup['hidden_for']; } } } if (!is_array($disabled_for)) { $disabled_for = array(); } /// LIST OF AVAILABLE MENU ICONS $icons = array( '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', WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg' => WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg' ); $default_icons = (isset($current_menu_item)) ? $current_menu_item[6] : 'dashicons dashicons-external'; ?>
.*?\<\/span><\/span>/s', '', $current_menu_item[0])); ?>
build_sub_menu_item($sub_menu_item, $optiongroup); } } else { ?>
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 = array(); } ?>
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['icon'])) { $icon = $suboptiongroup['icon']; } if (isset($suboptiongroup['hidden_for'])) { $disabled_for = $suboptiongroup['hidden_for']; } } } if (!is_array($disabled_for)) { $disabled_for = array(); } $menu_id = preg_replace("/[^A-Za-z0-9 ]/", '', $current_menu_item[2]); ?>
.*?\<\/span><\/span>/s', '', $current_menu_item[0])); ?>

render_menu_editor_header(); ?>
render_menu_editor(); ?>