/** * Re-order the submenu items so all Freemius added new submenu items * are added right after the plugin's settings submenu item. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ private function order_sub_submenu_items() { global $submenu; $menu_slug = $this->_menu->get_top_level_menu_slug(); /** * Before "admin_menu" fires, WordPress will loop over the default submenus and remove pages for which the user * does not have permissions. So in case a plugin does not have top-level menu but does have submenus under any * of the default menus, only users that have the right role can access its sub-submenus (Account, Contact Us, * Support Forum, etc.) since $submenu[ $menu_slug ] will be empty if the user doesn't have permission. * * In case a plugin does not have submenus under any of the default menus but does have submenus under the menu * of another plugin, only users that have the right role can access its sub-submenus since we will use the * capability needed to access the parent menu as the capability for the submenus that we will add. */ if (empty($submenu[$menu_slug])) { return; } $top_level_menu =& $submenu[$menu_slug]; $all_submenu_items_after = array(); $found_submenu_item = false; foreach ($top_level_menu as $submenu_id => $meta) { if ($found_submenu_item) { // Remove all submenu items after the plugin's submenu item. $all_submenu_items_after[] = $meta; unset($top_level_menu[$submenu_id]); } if ($this->_menu->get_raw_slug() === $meta[2]) { // Found the submenu item, put all below. $found_submenu_item = true; continue; } } // Embed all plugin's new submenu items. $this->embed_submenu_items(); // Start with specially high number to make sure it's appended. $i = max(10000, max(array_keys($top_level_menu)) + 1); foreach ($all_submenu_items_after as $meta) { $top_level_menu[$i] = $meta; $i++; } // Sort submenu items. ksort($top_level_menu); }
/** * Remove plugin's all admin menu items & pages, and replace with activation page. * * @author Vova Feldman (@svovaf) * @since 1.0.1 */ private function override_plugin_menu_with_activation() { $this->_logger->entrance(); $hook = false; if ($this->_menu->is_top_level()) { $menu = $this->_menu->remove_menu_item(); if (false !== $menu) { // Override menu action. $hook = add_menu_page($menu['menu'][3], $menu['menu'][0], 'manage_options', $this->_menu->get_slug(), array(&$this, '_connect_page_render'), $menu['menu'][6], $menu['position']); } } else { if ($this->_menu->has_custom_parent()) { $menus = array($this->_menu->get_parent_slug()); if ($this->_menu->is_override_exact()) { // Make sure the current page is matching the activation page. $activation_url = strtolower($this->get_activation_url()); $request_url = strtolower($_SERVER['REQUEST_URI']); if (parse_url($activation_url, PHP_URL_PATH) !== parse_url($request_url, PHP_URL_PATH)) { // Different path - DO NOT OVERRIDE PAGE. return; } $activation_url_params = array(); parse_str(parse_url($activation_url, PHP_URL_QUERY), $activation_url_params); $request_url_params = array(); parse_str(parse_url($request_url, PHP_URL_QUERY), $request_url_params); foreach ($activation_url_params as $key => $val) { if (!isset($request_url_params[$key]) || $val != $request_url_params[$key]) { // Not matching query string - DO NOT OVERRIDE PAGE. return; } } } } else { $menus = array('tools.php', 'options-general.php'); } foreach ($menus as $parent_slug) { $hook = $this->_menu->override_submenu_action($parent_slug, $this->_menu->get_raw_slug(), array(&$this, '_connect_page_render')); if (false !== $hook) { // Found plugin's submenu item. break; } } } if ($this->_menu->is_activation_page()) { // Clean admin page from distracting content. $this->_clean_admin_content_section(); } if (false !== $hook) { if (fs_request_is_action($this->_slug . '_activate_existing')) { add_action("load-{$hook}", array(&$this, '_install_with_current_user')); } else { if (fs_request_is_action($this->_slug . '_activate_new')) { add_action("load-{$hook}", array(&$this, '_install_with_new_user')); } } } }
/** * Re-order the submenu items so all Freemius added new submenu items * are added right after the plugin's settings submenu item. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ private function order_sub_submenu_items() { global $submenu; $top_level_menu =& $submenu[$this->_menu->get_top_level_menu_slug()]; $all_submenu_items_after = array(); $found_submenu_item = false; foreach ($top_level_menu as $submenu_id => $meta) { if ($found_submenu_item) { // Remove all submenu items after the plugin's submenu item. $all_submenu_items_after[] = $meta; unset($top_level_menu[$submenu_id]); } if ($this->_menu->get_raw_slug() === $meta[2]) { // Found the submenu item, put all below. $found_submenu_item = true; continue; } } // Embed all plugin's new submenu items. $this->embed_submenu_items(); // Start with specially high number to make sure it's appended. $i = 10000; foreach ($all_submenu_items_after as $meta) { $top_level_menu[$i] = $meta; $i++; } // Sort submenu items. ksort($top_level_menu); }
/** * Re-order the submenu items so all Freemius added new submenu items * are added right after the plugin's settings submenu item. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ private function order_sub_submenu_items() { global $submenu; $top_level_menu =& $submenu[$this->_menu->get_top_level_menu_slug()]; $all_submenu_items_after = array(); $found_submenu_item = false; foreach ($top_level_menu as $submenu_id => $meta) { if ($found_submenu_item) { // Remove all submenu items after the plugin's submenu item. $all_submenu_items_after[] = $meta; unset($top_level_menu[$submenu_id]); } if ($this->_menu->get_raw_slug() === $meta[2]) { // Found the submenu item, put all below. $found_submenu_item = true; continue; } } // Embed all plugin's new submenu items. $this->embed_submenu_items(); // FIX: Get highest array key value plus one foreach ($top_level_menu as $submenu_id => $meta) { $i = $submenu_id + 1; } foreach ($all_submenu_items_after as $meta) { $top_level_menu[$i] = $meta; $i++; } // Sort submenu items. ksort($top_level_menu); }