在管理菜单中添加任意链接?


20

有没有一种方法可以向WordPress管理菜单中添加任意超链接(我是指登录管理仪表盘时位于左侧的菜单)?例如,可以添加指向Google的链接吗?

在我的特定情况下,我想为正在使用的Wordpress主题添加一个样式指南页面,以便向用户展示如何用该主题设置不同的HTML元素,并演示如何很好地设置各种样式。

这是我到目前为止的代码(注意:它是不完整的):在functions.php中,我在外观部分中添加了一个新菜单项:

add_action('admin_menu', 'create_theme_style_page');

function create_theme_style_page() {
  add_theme_page('Theme Styleguide', 'Theme Styleguide', 'administrator', basename(__FILE__),'build_styleguide_page');
}

function build_styleguide_page() {
 echo "Not sure what goes here to redirect admin to a arbitrary url?";
}

在中build_styleguide_page(),尝试使用重定向header()会出现错误(无法修改标头信息)。

Answers:


13

@汤姆

如果我正确理解了您的问题,那么您就不需要了解如何向菜单添加链接(似乎您已经知道),而是需要学习如何使链接正确重定向,对吗?

从管理菜单项重定向到外部URL

如果是这样,您需要做的是不使用菜单项功能,而应尽早“钩住” WordPress,以使它除了可能输出HTTP标头外,没有输出任何内容。呼叫时最早/wp-admin/themes.php出现的异常显示after_setup_theme似乎有效。

使用“菜单条”,以便可以在挂钩中对其进行测试

但是要使其正常工作,我们首先需要add_theme_pageadmin_menuhook /您的create_theme_style_page()函数中修改对的调用。我们删除了第五个参数(用于实现admin选项的调用函数),因为我们不需要它,并将第四个参数(“ menu slug”)更改为themes.php?goto=build-styleguide-page

尽管我们几乎可以为第四个参数选择任何内容,但考虑到我们要重定向,我将路由themes.php和其他外观选项一起路由到同一页面(),以实现一致性。我也只是随意提出了这个名字,goto因为WordPress不使用它,这似乎很有意义。

add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
  add_theme_page(
    'Theme Styleguide',
    'Theme Styleguide',
    'administrator',
    'themes.php?goto=build-styleguide-page'
  );
}

顺便说一句,我们摆脱了您的build_styleguide_page()功能,因为此解决方案不需要它。

在最早的挂钩中重定向themes.phpafter_setup_theme

作为最后的代码,我们after_setup_themeredirect_from_admin_menu()函数中实现了钩子。我们对其进行测试,以查看当前页面是否为,themes.php并确保URL上goto传递了URL参数。然后,它goto使用switch/ case语句测试其值,以查看其值是否为 'build-styleguide-page'; 如果是这样,它将重定向到您陈述的假设,例如Google,否则我们将重定向回管理控制台:

add_action('after_setup_theme', 'redirect_from_admin_menu');
function redirect_from_admin_menu($value) {
  global $pagenow;
  if ($pagenow=='themes.php' && !empty($_GET['goto'])) {
    switch ($_GET['goto']) {
      case 'build-styleguide-page':
        wp_redirect("http://www.google.com");
        break;
      default:
        wp_safe_redirect('/wp-admin/');
        break;
    }
    exit;
  }
}

笔记:

  1. 我选择在hook / 函数中使用switch/ case语句,以便在需要时添加其他重定向更加容易。只需添加更多的case语句。after_setup_themeredirect_from_admin_menu()goto

  2. wp_redirect()wp_safe_redirect()功能并不会真正结束; 您需要明确发出退出语句,以使WordPress停止并且不覆盖您的重定向。

希望这可以帮助!


22

如果您通过$submenu直接将项目添加到菜单中来将其添加到菜单中,则无需进行重定向,并且能够使用完整的异地URL作为菜单链接(我自己这样做)。

add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
    global $submenu;
    $submenu['index.php'][500] = array( 'Menu item name', 'manage_options' , 'http://example.com' ); 
}  

index.php代表父菜单的键/链接,因此在示例中,我基本上是在“ 仪表板”菜单中添加一个项目。

当然,它不像使用这些add_{type}_page功能那么漂亮,但是它确实可以解决WordPress阻止管理员菜单链接中的非现场URL的问题。

我使用类似的方法将各种虚拟主机添加到菜单中,因此可以直接从管理菜单切换到其他安装(所有操作均通过脚本完成,但基本上使用上述代码的美化版本)。

注意:如果您决定使用该代码,请注意不要分配正在使用的密钥(示例代码中的500数组密钥)。

提示:实际上,您可以在菜单键中使用负值,以便您可以强制菜单项位于任何本机WordPress项之前。


注意:我认为您将需要将该负键设置为字符串,即。'-5'而不是-5,否则,该键就被认为是无效的(我认为)..(但是,如果我没记错的话,负字符串也可以工作)..
t31os 2010年

谢谢,糟透了,您不能使用真正的功能来做到这一点,但这比只添加一个挂钩/重定向组合只是一个链接要好得多。
El Yobo

2
这个特别的答案对我的插件“发布状态菜单项”有帮助(您可能会猜到它的作用)。无论如何,因为我不知道还有哪些其他插件会向菜单中添加内容,所以我想补充一下,我曾经array_push()附加菜单项,以避免与其他插件发生冲突。
mrwweb 2012年

像吊饰一样工作,加上使用如此小的片段的奖励积分。
若昂

2
+1。与其选择一个键并希望,不如抓住最后一个键并递增。例如,添加一个子菜单项的工具菜单时:global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] =
webaware

3

我已经做到了这一点:

function add_custom_menu_item(){
    add_menu_page( 'Menu Item Title', 'Page Title', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );

function custom_menu_item_redirect() {

    $menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;

    if($menu_redirect == 'page_slug' ) {
        wp_safe_redirect( home_url('/my-page') );
        exit();
    }

}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );

您要做的是添加菜单项并定义slug,然后在“ admin_init”上检查slug是否存在并重定向到所需的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.