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

在我的特定情况下,我想为我正在使用的Wordpress主题添加样式指南页面,以便向用户展示与众不同HTML元素以主题为样式,并演示如何很好地设置各种样式。外观部分中的菜单项:

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

#1 楼

嗨,@ Tom,

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

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

如果要这样做,您需要做的就是不要使用菜单项功能但是取而代之的是将WordPress尽早“钩住” WordPress,以至于除了可能的HTTP标头之外,它什么都不输出。呼叫/wp-admin/themes.php时最早的钩子似乎是after_setup_theme,并且看起来工作良好。

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

但是要使其正常工作,我们首先需要在add_theme_page挂钩中修改对admin_menu的调用/您的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.php函数中的after_setup_theme钩子。我们对其进行测试,以查看当前页面是否为after_setup_theme,并确保在URL上传递了redirect_from_admin_menu()的URL参数。然后,它使用themes.php / goto语句测试goto的值,以查看其值是否为switch;如果是这样,它将重定向至您陈述的假设,例如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;
  }
}


注意:我选择在case钩子/ 'build-styleguide-page'函数中使用switch / case语句,以便在需要时添加其他after_setup_theme重定向会更容易;只需添加更多的case语句。
redirect_from_admin_menu()goto函数实际上并未终止;您需要明确发出退出语句以使WordPress停止运行,而不覆盖您的重定向。

希望这会有所帮助!

#2 楼

如果将项目直接添加到菜单中(直接添加到$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-12-09 23:52



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

– El Yobo
2011-09-12 23:39

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

–mrwweb
2012年4月28日在21:42

像吊饰一样工作,加上使用这么小的片段的奖励积分。

–João
2012年11月7日10:44

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

– Webaware
13年5月29日在7:19

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