it-swarm.cn

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

有没有办法向WordPress管理菜单添加任意超链接(我的意思是当您登录管理仪表板时左侧的菜单)?例如,是否可以添加指向Google的链接?

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

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

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()重定向会出错( 无法修改标题信息 )。

20
Tom

@Tom

如果我正确理解你的问题你不需要知道如何添加菜单的链接(看起来你已经知道了),而是需要学习如何正确地重定向你的链接,对吧?

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

如果是这样你需要做的是不使用菜单项功能,而是使用 “hook” WordPress足够早,这样它除了可能的HTTP头之外没有输出任何东西。调用/wp-admin/themes.php时最早的钩子似乎是after_setup_theme,它似乎运行良好。

使用 “Menu Slug” 所以你可以在一个钩子里测试它

但要使其工作,我们首先需要在add_theme_page hook/your create_theme_style_page()函数中修改对admin_menu的调用。我们删除了第五个参数(调用实现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

作为我们的最后一段代码,我们在redirect_from_admin_menu()函数中实现了after_setup_theme钩子。我们测试当前页面是否为themes.php并确保在URL上传递了goto的URL参数。然后它使用goto/switch语句测试case的值,看它是否具有'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 hook/redirect_from_admin_menu()函数中使用switch/case语句,以便在需要时更容易添加额外的goto重定向;只需添加更多案例陈述。

  2. wp_redirect()wp_safe_redirect()函数实际上并未终止;你需要明确发出一个退出语句来让WordPress停止而不是覆盖你的重定向。

希望这可以帮助!

13
MikeSchinkel

如果通过将项目直接添加到$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表示父菜单的键/链接,因此在示例中我基本上将项添加到 Dashboard menu ..

当然,它不如使用add_{type}_page函数那么漂亮,但它确实可以解决WordPress防止管理菜单链接中的异地URL的问题。

我使用类似的东西将我的各种虚拟主机添加到菜单中,所以我可以直接从管理菜单切换到其他安装(所有这些都是用脚本完成的,但基本上使用了上面代码的美化版本)。

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

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

21
t31os

我已经实现了同样的目的:

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是否存在并重定向到你想要的位置。

3
Bobz