在我的特定情况下,我想为我正在使用的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项目之前。
#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是否存在并重定向到您想要的位置。
评论
注意:我认为您将需要将该负键设置为字符串,即。 '-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