*/ if (!class_exists('Core')) { class Core extends AdminBarEditorModel { public $adminify_ui; public $admin_bar_options; private $original_nodes = []; private $current_admin_bar_nodes = []; public function __construct() { $this->admin_bar_options = (new AdminBarEditorOptions())->get(); new AdminBarEditorApiEndPoints(); AdminBarEditorAssets::get_instance(); $this->initialization(); add_action('init', array($this, 'jltwp_adminbar_frontend')); add_action('admin_init', array($this, 'jltwp_adminbar_backend')); } public function initialization(){ add_action('wp_before_admin_bar_render', [$this, 'get_admin_bar_menu_list'], 999999); add_action('wp_before_admin_bar_render', [$this, 'admin_bar_menu_output'], 1000000); } // Get admin bar disable status based on disable conditions function get_adminbar_disable_status($disable_conditions) { global $current_user; $user_roles = $current_user->roles; if(!empty($current_user->data->display_name)){ $user_name = $current_user->data->display_name; } else { $user_name = !empty($current_user->data->user_nicename) ? $current_user->data->user_nicename : ''; } $disable_status = false; if (!empty($disable_conditions)) { foreach ($disable_conditions as $key => $cond) { if ($cond['condition'] == 'user_role') { if (!empty($cond['conditionValue']) && !empty($user_roles)) { $matched_roles = array_intersect($user_roles, $cond['conditionValue']); if (!empty($matched_roles)) { $disable_status = true; break; } } } else if ($cond['condition'] == 'user_name') { if (!empty($cond['conditionValue']) && in_array($user_name, $cond['conditionValue'])) { $disable_status = true; break; } } else if ($cond['condition'] == 'user_cap') { if (!empty($cond['conditionValue'])) { foreach ($cond['conditionValue'] as $key => $user_cap) { if (current_user_can($user_cap)) { $disable_status = true; break; } } } } if ($disable_status == true) { break; } } } return $disable_status; } /** * Hide Backend Admin Bar */ public function jltwp_adminbar_backend() { $disable_backend_admin_bar = !empty($this->admin_bar_options['disable_backend_admin_bar']) ? $this->admin_bar_options['disable_backend_admin_bar'] : ''; $disable_conditions = !empty($this->admin_bar_options['disable_backend_conditions']) ? $this->admin_bar_options['disable_backend_conditions'] : ''; $is_disable_adminbar = $this->get_adminbar_disable_status($disable_conditions); if (is_admin() && $disable_backend_admin_bar && $is_disable_adminbar) { add_filter('show_admin_bar', '__return_false'); } } public function sync_with_adminbar_remover(){ // Already Synceed? Bail Early if (get_option($this->prefix . '_is_synced', false)) return; // Settings Class $admin_bar_prev_option = empty( get_option('show-ab') ) ? true : false; // Update New Options $this->admin_bar_options['disable_frontend_admin_bar'] = $admin_bar_prev_option; // Save The Settings update_option($this->prefix, $this->admin_bar_options); // Operation Done update_option($this->prefix . '_is_synced', true); } /** * Hide Frontend Admin Bar */ public function jltwp_adminbar_frontend() { $disable_frontend_admin_bar = !empty($this->admin_bar_options['disable_frontend_admin_bar']) ? $this->admin_bar_options['disable_frontend_admin_bar'] : ''; $disable_frontend_all_users = !empty($this->admin_bar_options['disable_frontend_all_users']) ? $this->admin_bar_options['disable_frontend_all_users'] : ''; $disable_frontend_guest_users = !empty($this->admin_bar_options['disable_frontend_guest_users']) ? $this->admin_bar_options['disable_frontend_guest_users'] : ''; $disable_conditions = !empty($this->admin_bar_options['disable_frontend_conditions']) ? $this->admin_bar_options['disable_frontend_conditions'] : []; $user = wp_get_current_user(); $user_roles = Utils::get_user_roles($user); $user_caps = Utils::get_user_capabilities($user); if( !empty($disable_frontend_all_users) ) { show_admin_bar( false ); } else { } if( !empty($disable_frontend_guest_users) && !is_user_logged_in() ) { show_admin_bar( false ); } } public function get_frontend_items() { global $wp_admin_bar; // Save frontend items whenever visit the frontend if (!is_admin() && is_admin_bar_showing()) { update_option('adminbar_frontend_items', $wp_admin_bar->get_nodes()); return false; } $frontend_items = get_option('adminbar_frontend_items'); // If no frontend item then request to save frontend items. if (is_admin() && is_admin_bar_showing() && empty($frontend_items)) { printf('', home_url()); return false; } return $frontend_items; } public function get_admin_bar_menu_list() { if( !current_user_can('manage_options') ) return; global $wp_admin_bar; if ( ! is_object( $wp_admin_bar ) ) { return; } // Get current options $admin_bar_items = ( new AdminBarEditorOptions() )->get(); // Initialize arrays if they don't exist if ( ! isset( $admin_bar_items['existing_admin_bar'] ) ) { $admin_bar_items['existing_admin_bar'] = []; } if ( ! isset( $admin_bar_items['existing_admin_bar_frontend'] ) ) { $admin_bar_items['existing_admin_bar_frontend'] = []; } // CAPTURE DATA BASED ON CONTEXT if ( is_admin() ) { // We are in Backend - Capture Backend Nodes $current_nodes = $wp_admin_bar->get_nodes(); if ( $current_nodes ) { $nav_items = $this->nodes_to_array( $current_nodes, 'backend' ); $existing_structure = self::format_to_nested( $nav_items ); $existing_structure = self::clean_array( $existing_structure ); $admin_bar_items['existing_admin_bar'] = self::assoc_to_flat_array( $existing_structure ); } } else { // We are in Frontend - Capture Frontend Nodes $current_nodes = $wp_admin_bar->get_nodes(); if ( $current_nodes ) { $admin_bar_items['existing_admin_bar_frontend'] = $this->nodes_to_array( $current_nodes, 'frontend' ); } } // Preserve User Settings (Saved Data) // Ensure we don't overwrite saved_admin_bar with empty arrays if they exist if ( ! isset( $admin_bar_items['saved_admin_bar'] ) ) { $admin_bar_items['saved_admin_bar'] = []; } if ( ! isset( $admin_bar_items['saved_admin_bar_frontend'] ) ) { $admin_bar_items['saved_admin_bar_frontend'] = []; } // Default Settings if ( ! isset( $admin_bar_items['admin_bar_settings'] ) ) { $admin_bar_items['admin_bar_settings'] = []; } $admin_bar_items['disable_backend_admin_bar'] = isset( $admin_bar_items['disable_backend_admin_bar'] ) ? $admin_bar_items['disable_backend_admin_bar'] : 0; $admin_bar_items['disable_backend_conditions'] = isset( $admin_bar_items['disable_backend_conditions'] ) ? $admin_bar_items['disable_backend_conditions'] : array(); $admin_bar_items['disable_frontend_admin_bar'] = isset( $admin_bar_items['disable_frontend_admin_bar'] ) ? $admin_bar_items['disable_frontend_admin_bar'] : 0; $admin_bar_items['disable_frontend_conditions'] = isset( $admin_bar_items['disable_frontend_conditions'] ) ? $admin_bar_items['disable_frontend_conditions'] : array(); // Save the updated "Existing" items to the database // This ensures that when we visit the settings page, we have the latest items from each environment update_option( $this->prefix, $admin_bar_items ); // Legacy: Admin Bar Remover Sync (kept but minimized impact) $adminbar_remover_key_exists = ( get_option( 'show-ab', null ) !== null ); if ( $adminbar_remover_key_exists ) { if ( get_option( $this->prefix . '_is_synced', false ) ) { return; } $admin_bar_prev_option = empty( get_option( 'show-ab' ) ) ? true : false; $admin_bar_items['disable_frontend_admin_bar'] = $admin_bar_prev_option; update_option( $this->prefix, $admin_bar_items ); update_option( $this->prefix . '_is_synced', true ); } } public static function clean_array($array) { $formated_array = []; $to_be_removed = ['comments', 'wp-logo', 'site-name', 'updates', 'menu-toggle', 'my-account']; foreach ($array as $key => $value) { if (in_array($value['parent'], $to_be_removed)) { continue; } $formated_array[$key] = $value; } return $formated_array; } public static function assoc_to_flat_array($menu_array) { $new_array = []; foreach ($menu_array as $root_menu) { $root_submenu = !empty($root_menu['submenu']) ? $root_menu['submenu'] : []; unset($root_menu['submenu']); $new_array[$root_menu['id']] = $root_menu; if (isset($root_submenu) && (count($root_submenu) > 0)) { foreach ($root_submenu as $first_level_menu) { $first_level_submenu = !empty($first_level_menu['submenu']) ? $first_level_menu['submenu'] : []; unset($first_level_menu['submenu']); $new_array[$first_level_menu['id']] = $first_level_menu; if (isset($first_level_submenu) && (count($first_level_submenu) > 0)) { foreach ($first_level_submenu as $second_level_menu) { $second_level_submenu = !empty($second_level_menu['submenu']) ? $second_level_menu['submenu'] : []; unset($second_level_menu['submenu']); $new_array[$second_level_menu['id']] = $second_level_menu; if (isset($second_level_submenu) && (count($second_level_submenu) > 0)) { foreach ($second_level_submenu as $third_level_menu) { $third_level_submenu = !empty($third_level_menu['submenu']) ? $third_level_menu['submenu'] : []; unset($third_level_menu['submenu']); $new_array[$third_level_menu['id']] = $third_level_menu; if (isset($third_level_submenu) && (count($third_level_submenu) > 0)) { foreach ($third_level_submenu as $fourth_level_menu) { $third_level_submenu = !empty($fourth_level_menu['submenu']) ? $fourth_level_menu['submenu'] : []; unset($fourth_level_menu['submenu']); $new_array[$fourth_level_menu['id']] = $fourth_level_menu; } } } } } } } } } return $new_array; } public static function parse_menu_items($args, $default, $request_from = 'backend') { $instance = new self(); $ms_helper = new Multisite_Helper(); $mulsite_site = $ms_helper->is_network_active(); // parse menu if (empty($instance->adminify_ui)) { if ($request_from == 'backend') { $new_array = []; foreach ($default as $key => $menu) { // if($args[$key]['id'] == 'my-account'){ // continue; // } if (array_search($key, array_keys($args)) && $key == $args[$key]['id']) { // $new_array[$key] = $args[$key]; } else { if (($mulsite_site) && ($key == 'my-sites')) { $new_array[$key] = $args[$key]; unset($args[$key]); } else { $new_array[$key] = $menu; } } } $new_args = []; foreach ($args as $key => $menu) { if (str_contains($key, 'custom-menu-')) { $new_args[$key] = $menu; } if (!array_key_exists($key, $default)) { continue; } $new_args[$key] = $args[$key]; } $pos = array_search('comments', array_keys($new_array), true); // $pos += 1; unset($new_array['top-secondary']); // $new_array = array_slice($new_array, 0, $pos, true) + $new_args + array_slice($new_array, $pos, count($new_array) - 1, true); $new_array = $new_args + array_slice($new_array, $pos, count($new_array), true); return $new_array; } else if ($request_from == 'frontend') { $new_array = []; foreach ($args as $key => $menu) { if (str_contains($key, 'custom-menu-')) { $new_array[$key] = $menu; } if (!array_key_exists($key, $default)) { unset($default[$key]); continue; } $new_array[$key] = $args[$key]; unset($default[$key]); } if (!empty($default)) { foreach ($default as $key => $value) { $new_array[$key] = $value; } } return $new_array; } } else { $new_array = []; foreach ($args as $key => $menu) { if (str_contains($key, 'custom-menu-')) { $new_array[$key] = $menu; } if (!array_key_exists($key, $default)) { unset($default[$key]); continue; } $new_array[$key] = $args[$key]; unset($default[$key]); } if (!empty($default)) { foreach ($default as $key => $value) { $new_array[$key] = $value; } } return $new_array; } } public function admin_bar_menu_output() { global $wp_admin_bar; $existing_menu = $wp_admin_bar->get_nodes(); $this->original_nodes = $existing_menu; $admin_bar_items = (new AdminBarEditorOptions())->get(); if (is_admin()) { $existing_admin_bar = !empty($admin_bar_items['existing_admin_bar']) ? $admin_bar_items['existing_admin_bar'] : []; $saved_admin_bar = !empty($admin_bar_items['saved_admin_bar']) ? $admin_bar_items['saved_admin_bar'] : $existing_admin_bar; $parsed_menu = empty($saved_admin_bar) ? $existing_admin_bar : self::parse_menu_items($saved_admin_bar, $existing_admin_bar, 'backend'); } else { $existing_admin_bar_frontend = !empty($admin_bar_items['existing_admin_bar_frontend']) ? $admin_bar_items['existing_admin_bar_frontend'] : []; $saved_admin_bar_frontend = !empty($admin_bar_items['saved_admin_bar_frontend']) ? $admin_bar_items['saved_admin_bar_frontend'] : $existing_admin_bar_frontend; $parsed_menu = empty($saved_admin_bar_frontend) ? $existing_admin_bar_frontend : self::parse_menu_items($saved_admin_bar_frontend, $existing_admin_bar_frontend, 'frontend'); } // Filter parsed_menu: only keep items the current user actually has access to. // WordPress already did capability checks when generating $existing_menu, // so we use it as the source of truth for what this user can see. $filtered_menu = []; foreach ($parsed_menu as $item_id => $item) { $is_custom_item = !empty($item['newly_created']) && $item['newly_created'] == 1; $user_has_node = isset($existing_menu[$item_id]); // Keep item if: user has it (WordPress granted access) OR it's a custom item if ($user_has_node || $is_custom_item) { $filtered_menu[$item_id] = $item; } // Also keep child items whose parent the user has access to if (!$user_has_node && !$is_custom_item && !empty($item['parent'])) { if (isset($existing_menu[$item['parent']]) || isset($filtered_menu[$item['parent']])) { $filtered_menu[$item_id] = $item; } } } $parsed_menu = $filtered_menu; // Remove all nodes. foreach ($existing_menu as $node_id => $node) { if( array_key_exists($node->id, $parsed_menu ) ){ if( isset($node->href) && !empty($node->href)){ $parsed_menu[$node->id]['href'] = $node->href; } } $wp_admin_bar->remove_node($node_id); } // Convert $parsed_menu to array of nodes. if (is_array($parsed_menu) && count($parsed_menu) > 0) { $this->generate_nodes($parsed_menu); } // Restore WordPress's responsive menu-toggle node. // The rebuild above drops it, but core's common.js relies on // #wp-admin-bar-menu-toggle existing to position the left admin-menu // flyouts: adjustSubmenu() only sets the dynamic margin-top when // $('#wp-admin-bar-menu-toggle').is(':hidden') is true, and on a missing // element that test returns false, so the flyout mispositions. if ( ! $wp_admin_bar->get_node('menu-toggle') && isset($existing_menu['menu-toggle']) ) { $wp_admin_bar->add_node( (array) $existing_menu['menu-toggle'] ); } } /** * Generate WP_Admin_Bar nodes based on parsed menu. * * @param array $parsed_menu The parsed menu in flat array format. */ public function generate_nodes($parsed_menu) { global $wp_admin_bar; if( in_array('my-account', array_keys($parsed_menu))){ $account_items = $parsed_menu['my-account']; unset($parsed_menu['my-account']); $parsed_menu['my-account'] = $account_items; } foreach ($parsed_menu as $menu_id => $menu) { if( $menu_id === 'my-account' ){ $current_user = wp_get_current_user(); $user_id = get_current_user_id(); $avatar = get_avatar($user_id, 26); $display_name = $current_user->display_name; // Check if admin explicitly set a custom title (not the auto-captured title_default) $custom_title = ''; if( is_admin()){ if( !empty($this->admin_bar_options['saved_admin_bar']['my-account']['title'] ) ){ $custom_title = $this->admin_bar_options['saved_admin_bar']['my-account']['title']; } } else { if( !empty($this->admin_bar_options['saved_admin_bar_frontend']['my-account']['title'] ) ){ $custom_title = $this->admin_bar_options['saved_admin_bar_frontend']['my-account']['title']; } } if (!empty($custom_title)) { // Admin explicitly set a custom greeting if (strpos($custom_title, 'original_nodes['my-account'])) { // Use WordPress's live-rendered title for the current user $menu['title'] = $this->original_nodes['my-account']->title; } else { // Fallback $menu['title'] = 'Howdy, ' . $display_name . $avatar; } } if($menu_id === 'user-info') { $current_user = wp_get_current_user(); $user_id = get_current_user_id(); $avatar = get_avatar($user_id, 26); // size 26x26 pixels $display_name = $current_user->display_name; $menu['title_default'] = $avatar . $display_name . 'Edit Profile'; $menu['title_encoded_default'] = htmlspecialchars($menu['title_default'], ENT_QUOTES, 'UTF-8'); } // Stored defaults are snapshots taken when settings were saved. Dynamic nodes // (WooCommerce visibility badge, Query Monitor stats, etc.) change per request, // so read their default title/meta/group from the live node instead of the DB. $is_custom_item = !empty($menu['newly_created']) && $menu['newly_created'] == 1; if (!$is_custom_item && $menu_id !== 'user-info' && isset($this->original_nodes[$menu_id])) { $live_node = $this->original_nodes[$menu_id]; $menu['title_default'] = $live_node->title; $menu['meta'] = $live_node->meta; $menu['group'] = $live_node->group; } $args = array(); $role_allowed = true; $user_allowed = true; if ($role_allowed && $user_allowed && $menu['menu_status']) { foreach ($menu as $arg_key => $arg_value) { if ( false === stripos($arg_key, '_default') && 'newly_created' !== $arg_key && 'icon' !== $arg_key ) { $value = $arg_value; // For non-custom menu items, always use fresh href from original nodes if ($arg_key === 'href') { if (isset($menu['newly_created']) && $menu['newly_created'] == 1) { // Custom menu item - use the saved href $value = $arg_value; } else { // Non-custom menu item - get fresh URL from original nodes if (isset($this->original_nodes[$menu['id']])) { $value = $this->original_nodes[$menu['id']]->href; } elseif (isset($menu['href_default'])) { $value = $menu['href_default']; } else { $value = ''; } } } elseif ('' === $value) { if ($arg_key != 'hidden_for') { $value = $menu[$arg_key . '_default']; } } $args[$arg_key] = $value; } } if (isset($menu['icon']) && !empty($menu['icon'])) { $icon_font = ''; if (str_contains($menu['icon'], 'icomoon-')) { $icon_font = 'style="font-family:icomoon"'; } if (str_contains($menu['icon'], 'ti-')) { $icon_font = 'style="font-family:themify"'; } if (str_contains($menu['icon'], 'icon-')) { $icon_font = 'style="font-family:simple-line-icons"'; } if (str_contains($menu['icon'], 'eicon-')) { $icon_font = 'style="font-family:eicons"'; } $class = 'ab-label'; if ($menu['id'] == 'wp-logo' && ($menu['title'] == '')) { $class = 'screen-reader-text'; } if (str_contains($args['title'], ' ' . strip_tags($args['title']) . ' '; } $args['title'] = '
' . $label . '
'; if (str_contains($menu['icon'], '/adminify-custom-icons/')) { $args['title'] = '
' . $label . '
'; } } else { if ($menu['title'] && str_contains($menu['title_default'], ''; } } if (isset($menu['hidden_for']) && !empty($menu['hidden_for']) && is_array($menu['hidden_for'])) { $users = []; foreach ($menu['hidden_for'] as $key => $value) { if (strtolower($value['value']) == 'seo manager') { $users[] = 'wpseo_manager'; } elseif (strtolower($value['value']) == 'seo editor') { $users[] = 'wpseo_editor'; } else { $users[] = $value['value']; } } if ($this->is_hidden($users)) { $args = []; } } } $wp_admin_bar->add_node($args); } } public function is_hidden($disabled_for) { if (!is_array($disabled_for)) { return false; } $current_user = wp_get_current_user(); $current_login = $current_user->user_login; $current_roles = $current_user->roles; if (in_array($current_login, $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; } } // $disabled_for = array_map(function ($value) { // // 'rolemaster_' . // return strtolower(str_replace(' ', '_', $value)); // }, $disabled_for); foreach ($current_roles as $role) { if (in_array($role, $disabled_for)) { return true; } } } /** * Turn admin bar items object to array * * @param array $nodes The admin bar menu. * @return array Array in expected format. */ public function nodes_to_array($nodes, $type = 'backend') { $admin_bar_array = array(); foreach ($nodes as $node_id => $node) { // For custom menu items, store the URL // For all other items, don't store URLs - they'll be fetched fresh $is_custom_menu = strpos($node_id, 'custom-menu-') === 0; $href_to_store = $is_custom_menu ? $node->href : ''; $admin_bar_array[$node_id] = array( 'icon' => '', 'icon_default' => $this->add_default_icon($node->id), 'id' => $node->id, 'id_default' => $node->id, 'title' => '', 'title_default' => $node->title, 'parent' => $node->parent, 'parent_default' => $node->parent, 'href' => $href_to_store, 'href_default' => $href_to_store, // Store URL only for custom items 'group' => $node->group, 'group_default' => $node->group, 'meta' => $node->meta, 'meta_default' => $node->meta, 'submenu' => array(), 'hidden_for' => '', 'newly_created' => $is_custom_menu ? 1 : 0, 'menu_level' => 0, 'menu_status' => true, 'frontend_only' => ($type == 'backend') ? 0 : 1, ); } return $admin_bar_array; } public static function format_to_nested($flat_array) { if (isset($flat_array['menu-toggle'])) { unset($flat_array['menu-toggle']); } $nested_array = []; // Third, get the parent menu items. foreach ($flat_array as $menu_id => $menu) { // if ($menu['title'] && str_contains($menu['title_default'], ''; // } if (!isset($menu['parent']) || !$menu['parent'] || !isset($flat_array[$menu['parent']])) { $nested_array[$menu_id] = $menu; $additional = array( 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '', 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '', 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '', 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '', 'submenu' => array(), 'menu_level' => 0 ); $nested_array[$menu_id] = array_merge($nested_array[$menu_id], $additional); } } // Fourth, remove collected parent array from $flat_array. foreach ($nested_array as $key => $value) { if (isset($flat_array[$key])) { unset($flat_array[$key]); } } // Fifth, get the 1st level submenu items. foreach ($flat_array as $menu_id => $menu) { //Howdy Text Change if ($menu_id == 'my-account') { $menu['title_default'] = 'Howdy'; } if (isset($nested_array[$menu['parent']])) { $nested_array[$menu['parent']]['submenu'][$menu['id']] = $menu; $additional = array( 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '', 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '', 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '', 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '', 'submenu' => array(), 'menu_level' => 1 ); $nested_array[$menu['parent']]['submenu'][$menu['id']] = array_merge( $nested_array[$menu['parent']]['submenu'][$menu['id']], $additional ); unset($flat_array[$menu_id]); } } // Sixth, get the 2nd level submenu items. if (!empty($flat_array)) { // Loop over flat_array. foreach ($flat_array as $menu_id => $menu) { // Loop over nested_array. foreach ($nested_array as $parent_id => $parent_array) { $submenu_lv2_found = false; if (!empty($parent_array['submenu'])) { // Loop over parent array's submenu. foreach ($parent_array['submenu'] as $submenu_lv1_id => $submenu_lv1_array) { if ($menu['parent'] === $submenu_lv1_id) { if (!isset($nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'])) { $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'] = array(); } $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$menu_id] = $menu; $additional = array( 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '', 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '', 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '', 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '', 'submenu' => array(), 'menu_level' => 2 ); $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$menu_id] = array_merge( $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$menu_id], $additional ); unset($flat_array[$menu_id]); $submenu_lv2_found = true; break; } } } if ($submenu_lv2_found) { break; } } } } // Seventh, get the 3rd level submenu items. if (!empty($flat_array)) { // Loop over flat_array. foreach ($flat_array as $menu_id => $menu) { // Loop over nested_array. foreach ($nested_array as $parent_id => $parent_array) { $submenu_lv3_found = false; if (!empty($parent_array['submenu'])) { // Loop over parent array's submenu. foreach ($parent_array['submenu'] as $submenu_lv1_id => $submenu_lv1_array) { if (!empty($submenu_lv1_array['submenu'])) { // Loop over submenu level 1's submenu. foreach ($submenu_lv1_array['submenu'] as $submenu_lv2_id => $submenu_lv2_array) { if ($menu['parent'] === $submenu_lv2_id) { if (!isset($nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'])) { $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'] = array(); } $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'][$menu_id] = $menu; $additional = array( 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '', 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '', 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '', 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '', 'submenu' => array(), 'menu_level' => 3 ); $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'][$menu_id] = array_merge( $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'][$menu_id], $additional ); unset($flat_array[$menu_id]); $submenu_lv3_found = true; break; } } } if ($submenu_lv3_found) { break; } } } if ($submenu_lv3_found) { break; } } } } return $nested_array; } public static function associative_to_index_array($asoc_array) { $new_array = []; $i = 0; foreach ($asoc_array as $key => $value) { if (isset($value['submenu']) && count($value['submenu']) > 0) { $j = 0; $sub_1 = []; foreach ($value['submenu'] as $key1 => $value1) { if (isset($value1['submenu']) && count($value1['submenu']) > 0) { $k = 0; $sub_2 = []; foreach ($value1['submenu'] as $key2 => $value2) { if (isset($value2['submenu']) && count($value2['submenu']) > 0) { $l = 0; $sub_3 = []; foreach ($value2['submenu'] as $key => $value3) { if (isset($value3['submenu']) && count($value3['submenu']) > 0) { $sub_3[$l] = $value3; $sub_3[$l]['submenu'] = array_values($value3['submenu']); } else { $sub_3[$l] = $value3; } $l++; } $sub_2[$k] = $value2; $sub_2[$k]['submenu'] = $sub_3; } else { $sub_2[$k] = $value2; } $k++; } $sub_1[$j] = $value1; $sub_1[$j]['submenu'] = $sub_2; } else { $sub_1[$j] = $value1; } // $new_array[$i]['submenu'][$j] = $value1; $j++; } $new_array[$i] = $value; $new_array[$i]['submenu'] = $sub_1; } else { $new_array[$i] = $value; } $i++; } return $new_array; } public function add_default_icon($menu_id) { $icon_class = ''; if ('wp-logo' === $menu_id) { $icon_class = 'dashicons dashicons-wordpress'; } else if ('my-sites' === $menu_id) { $icon_class = 'dashicons dashicons-admin-multisite'; } else if ('site-name' === $menu_id) { $icon_class = 'dashicons dashicons-admin-home'; } else if ('site-name-frontend' === $menu_id) { $icon_class = 'dashicons dashicons-dashboard'; } else if ('customize' === $menu_id) { $icon_class = 'dashicons dashicons-admin-customizer'; } else if ('updates' === $menu_id) { $icon_class = 'dashicons dashicons-update'; } else if ('comments' === $menu_id) { $icon_class = 'dashicons dashicons-admin-comments'; } else if ('new-content' === $menu_id) { $icon_class = 'dashicons dashicons-plus'; } else if ('edit' === $menu_id) { $icon_class = 'dashicons dashicons-edit'; } else if ('site-editor' === $menu_id) { $icon_class = 'dashicons dashicons-admin-appearance'; } return $icon_class; } } }