问题描述

有没有办法添加一个任意的超链接到 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()进行重定向会发生错误 (无法修改标题信息) 。

最佳解决方案

你好汤姆,

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

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

如果是这样,您需要做的就是不要使用菜单项功能,而是使用”hook” WordPress,以便它不会输出除 HTTP 头之外的任何东西。调用/wp-admin/themes.php 时,最早的挂钩似乎是 after_setup_theme,它似乎工作正常。

使用”Menu Slug” 所以你可以在钩子测试它

但是要使其正常工作,我们首先需要在 admin_menu 钩子/create_theme_style_page()函数中修改您对 add_theme_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'
  );
}

BTW,我们摆脱了您的 build_styleguide_page()功能,因为我们不需要这个解决方案。

themes.php 最早挂钩重定向:after_setup_theme

作为我们最后一代的代码,我们在 redirect_from_admin_menu()功能中实现了 after_setup_theme 钩子。我们测试了当前页面是否为 themes.php,并确保 URL 上传递了 goto 的 URL 参数。然后使用 switch /case 语句测试 goto 的值,看它是否具有值'build-styleguide-page'; 如果是这样,它会重定向到您所述的假设的例如否则我们只需重定向到管理员信息中心:

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. 我选择在 after_setup_theme 钩子/redirect_from_admin_menu()函数中使用 switch /case 语句,以便如果需要,可以更容易地添加其他 goto 重定向; 只需添加更多的 case 语句。

  2. wp_redirect()wp_safe_redirect()功能实际上并不终止; 你需要明确的发出一个退出语句来让 WordPress 停止,而不会重写你的重定向。

希望这可以帮助!

次佳解决方案

如果您直接将它添加到 $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 功能那么漂亮,但它确实是 work-around 事实上 WordPress 在管理菜单链接中阻止 off-site URL 。

我使用类似的东西将我的各种虚拟主机添加到菜单中,所以我可以直接从管理菜单切换到其他安装 (全部使用脚本,但基本上使用上述代码的荣耀版本) 。

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

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

参考文献

注:本文内容整合自 google/baidu/bing 翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为 @) 。