/** * Moved the actual submenu item additions to a separated function, * in order to support sub-submenu items when the plugin's settings * only have a submenu and not top-level menu item. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ private function embed_submenu_items() { $item_template = $this->_menu->is_top_level() ? '<span class="fs-submenu-item">%s</span>' : '<span class="fs-submenu-item fs-sub">%s</span>'; $top_level_menu_capability = $this->get_top_level_menu_capability(); ksort($this->_menu_items); foreach ($this->_menu_items as $priority => $items) { foreach ($items as $item) { $capability = !empty($item['capability']) ? $item['capability'] : $top_level_menu_capability; if (!isset($item['url'])) { $hook = add_submenu_page($item['show_submenu'] ? $this->get_top_level_menu_slug() : null, $item['page_title'], sprintf($item_template, $item['menu_title']), $capability, $item['menu_slug'], $item['render_function']); if (false !== $item['before_render_function']) { add_action("load-{$hook}", $item['before_render_function']); } } else { add_submenu_page($this->get_top_level_menu_slug(), $item['page_title'], sprintf($item_template, $item['menu_title']), $capability, $item['menu_slug'], array($this, '')); } } } }
/** * 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')); } } } }