如何检查管理员(子)菜单是否已存在?

时间:2011-01-04 作者:Baruch

标题说明了一切。我正在使用WP 3.0.4

4 个回复
最合适的回答,由SO网友:John P Bloch 整理而成

像这样的事情应该行得通。$handle 应该是菜单的slug;设置$sub 若为true,则搜索子菜单(默认为顶级菜单):

function find_my_menu_item( $handle, $sub = false; ){
  if( !is_admin() || (defined(\'DOING_AJAX\') && DOING_AJAX) )
    return false;
  global $menu, $submenu;
  $check_menu = $sub ? $submenu : $menu;
  if( empty( $check_menu ) )
    return false;
  foreach( $check_menu as $k => $item ){
    if( $sub ){
      foreach( $item as $sm ){
        if($handle == $sm[2])
          return true;
      }
    } else {
      if( $handle == $item[2] )
        return true;
    }
  }
  return false;
}
最后一点提示:在设置菜单之前,不应使用此选项。\'admin_init\' 是最早使用此功能的安全赌注。我还添加了一些代码,以便在未设置菜单时优雅地离开。

SO网友:J.D.

下面是一种更简单的方法:

global $submenu;

$main_menu = \'my_menu_slug\';

if (
    isset( $submenu[ $main_menu ] )
    && in_array( \'my_submenu_slug\', wp_list_pluck( $submenu[ $main_menu ], 2 ) )
) {
    // Submenu exists.
} else {
    // Submenu doesn\'t exist.
}

SO网友:Nero_DCLXVI

含糖的在这里,我以为我是唯一一个想做这种事的疯子!

嗯,基于我认为你想要的(类似于我发布的内容here), 下面是我提出的解决方案(利用上面给出的函数)

起初,我认为每次激活一个新插件时,我必须检查哪些插件处于活动状态。

我想我会用is_plugin_active() 要查看要在父“main”菜单项下显示的菜单项。。。然而,这比我想象的要困难,因为当插件访问所有这些内容所在的文件时,该函数尚未激活。

谢天谢地,事情变得如此简单,以至于一直盯着我的脸。。。每个被激活的插件都可以简单地将该插件的子菜单添加到父菜单,而无需担心是否存在其他活动插件。。。

我将此添加到每个“我的”插件中(即我的公司发布的插件)

if(!function_exists(\'find_my_menu_item\')) {
  function find_my_menu_item($handle, $sub = false) {
    if(!is_admin() || (defined(\'DOING_AJAX\') && DOING_AJAX)) {
      return false;
    }
    global $menu, $submenu;
    $check_menu = $sub ? $submenu : $menu;
    if(empty($check_menu)) {
      return false;
    }
    foreach($check_menu as $k => $item) {
      if($sub) {
        foreach($item as $sm) {
          if($handle == $sm[2]) {
            return true;
          }
        }
      } 
      else {
        if($handle == $item[2]) {
          return true;
        }
      }
    }
    return false;
  }
}
然后,我在每个插件中添加了以下小片段:

if(!function_exists(\'wpg_add_parent_page\')) {
  function wpg_add_parent_page() {
    if(!find_my_menu_item(\'main_item_slug\')) {
      add_menu_page(\'Main Item Page Title\',\'Main Item Menu Title\', \'activate_plugins\', \'main_item_slug\', \'main_item_function\', THISPLUGIN_PATH.\'images/menu-icon.png\');
    }
    if(!function_exists(\'remove_submenu_page\')) {
      unset($GLOBALS[\'submenu\'][\'main_item_slug\'][0]);
    }
    else {
      remove_submenu_page(\'main_item_slug\',\'main_item_slug\');
    }
  }
  add_action(\'admin_menu\', \'wpg_add_parent_page\');
}
if(!function_exists(\'wpg_add_thisplugin_page\')) {
  function wpg_add_thisplugin_settings_page() {
    add_submenu_page(\'main_item_slug\', \'ThisPlugin Settings\', \'ThisPlugin Menu Item\', \'activate_plugins\', \'this_plugin_slug\', \'wpg_thisplugin_function\');
  }
  add_action(\'admin_menu\', \'wpg_add_thisplugin_page\');
}
只需在一个菜单项下为您想要添加的每个插件修改它,并在每个相关插件中插入相应的修改版本。

SO网友:webspanner

这里有一个很好的简洁方法,不用所有这些条件和foreach循环。

function submenuExists($submenuTitle)
{

    global $submenu;

    return count(array_filter($submenu[\'plugins.php\'], 
        function($submenuPage) use ($submenuTitle) {
            return $submenuPage[0] == submenuTitle;
        }
    )) > 0;
}

结束

相关推荐