主题作者可能需要提供设置屏幕,以便用户可以自定义其主题的使用方式或工作方式。最好的方法是创建一个管理菜单项,允许用户从所有管理屏幕访问设置屏幕。
功能参考
菜单页
add_menu_page()
add_object_page()
add_utility_page()
remove_menu_page()
子菜单页
add_submenu_page()
remove_submenu_page()
WordPress管理菜单
add_dashboard_page()
add_posts_page()
add_media_page()
add_links_page()
add_pages_page()
add_comments_page()
add_theme_page()
add_plugins_page()
add_users_page()
add_management_page()
add_options_page()
每个情节都需要一个钩子
要添加管理菜单,您需要做三件事:
- 创建一个包含菜单构建代码的函数。
- 使用上述功能使用
admin_menu
动作钩 – 或network_admin_menu
,如果您添加了网络菜单。 - 创建屏幕的HTML输出,单击菜单项时显示。
大多数开发人员忽略了此列表中的第二步。您不能简单地调用菜单代码。你需要说 在功能内部,然后注册此功能。
这是描述这三个步骤的简单示例。这将在“设置”顶级菜单下添加一个子级菜单项。选择后,该菜单项将显示一个非常基本的屏幕。
<?php
/** Step 2 (from text above). */
add_action( 'admin_menu', 'my_menu' );
/** Step 1. */
function my_menu() {
add_options_page(
'My Options',
'My Menu',
'manage_options',
'my-unique-identifier',
'my_options'
);
}
/** Step 3. */
function my_options() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
echo 'Here is where I output the HTML for my screen.';
echo '</div><pre>';
}
在此示例中,功能my_menu()
通过 add_options_page()
功能。
笔记:请注意 add_action() 在步骤2中致电寄存器my_menu()函数 admin_menu 钩。 没有那,add_action() 呼叫,将抛出未定义功能的PHP错误。最后,add_options_page()
电话指的是my_options()
当有人单击菜单项时,包含要显示的实际页面(以及要处理的PHP代码)的函数。
这些步骤在以下各节中更详细地描述。记住将菜单的创建和页面包装在功能中,并使用admin_menu
钩 要在正确的时间开始整个过程。
确定新菜单的位置
在创建新菜单之前,首先确定菜单是否应该是 顶层 菜单或 子级别 菜单项。顶级菜单显示为管理菜单中的新部分,并包含子级菜单项。这意味着子级菜单项是现有顶级菜单的成员。
很少有一个主题需要创建新的顶级菜单。如果该主题向WordPress引入了一个全新的概念,并且需要许多屏幕才能完成,那么该主题可能需要一个新的顶级菜单。仅当您确实需要多个相关的屏幕来使WordPress做一些最初设计的事情时,才应考虑添加顶级菜单。新的顶级菜单的示例可能包括工作管理或会议管理。请注意,与本地人 帖子类型 注册,WordPress会自动创建顶级菜单来管理此类功能。
如果不需要创建顶级菜单,则需要在哪个顶级菜单下进行决定以放置新的子级菜单项。作为参考点,几个主题在现有WordPress顶级菜单下添加了子级菜单项。
使用WordPress顶级菜单的本指南确定子级菜单项的正确位置:
- 仪表板 – 网站的信息中心,并包括更新WordPress Core,插件和主题的更新选项。
- 帖子 – 显示用于编写帖子的工具(面向时间的内容)。
- 媒体 – 上传和管理图片,视频和音频。
- 链接 – 管理对其他关注的博客和网站的参考。
- 页面 – 显示用于编写静态内容的工具,称为页面。
- 评论 – 控制和监管读者对帖子的回答。
- 外观 – 显示控制主题/样式文件,侧边栏等的控件。
- 插件 – 显示处理插件管理的控件,而不是插件本身的配置选项。
- 用户 – 显示用于用户管理的控件。
- 工具 – 管理博客数据的导出,导入甚至备份。
- 设置 – 显示只有管理员应查看的插件选项。
- 网络管理员 – 显示网络上设置的插件选项。代替
admin_menu
,你应该使用network_admin_menu
(也可以看看 创建一个网络)
顶级菜单
如果您已经确定主题需要一个全新的顶级菜单,那么您需要做的第一件事就是与add_menu_page()
功能。笔记:跳到 子级菜单 如果您不需要顶级菜单。
参数值:
page_title
– 选择菜单时要在页面标题中显示的文本。menu_title
– 菜单上的屏幕名称文字。capability
– 将此菜单显示给用户所需的功能。使用设置API处理您的表格时,应使用manage_options
在这里,如果没有它,用户将无法保存选项。用户级别被弃用,不应在此处使用。menu_slug
– 通过此菜单引用此菜单的slug名称(对于此菜单应该是唯一的)。在版本3.0之前,这被称为文件(或句柄)参数。如果省略了函数参数,menu_slug
应该是处理菜单页面内容显示的PHP文件。function
– 显示菜单页面的页面内容的功能。icon_url
– 用于此菜单的图标的URL。此参数是可选的。position
– 菜单上的位置应该出现此菜单。默认情况下,如果省略此参数,则菜单将出现在菜单结构的底部。要查看当前菜单位置,请使用print_r( $GLOBALS[ 'menu' ] )
菜单加载后。- 子级菜单 – 一旦定义了顶级菜单,或者您选择使用现有的WordPress顶级菜单,您就可以使用“一个或多个子级菜单”项使用“
add_submenu_page()
功能。
子级菜单
如果您希望您的新菜单项是子菜单项目,则可以使用add_submenu_page()
功能。
参数值:
parent_slug
– 父菜单的slug名称,或提供您要在其中插入sub-menu的顶级菜单的标准WordPress admin文件的文件名,或者如果此sub-menu进入了一个自定义顶级菜单。例子:- 仪表板 –
add_submenu_page('index.php', ...)
- 帖子 –
add_submenu_page('edit.php', ...)
- 媒体 –
add_submenu_page('upload.php', ...)
- 链接 –
add_submenu_page('link-manager.php', ...)
- 页 –
add_submenu_page('edit.php?post_type=page', ...)
- 评论 –
add_submenu_page('edit-comments.php', ...)
- 自定义帖子类型 –
add_submenu_page('edit.php?post_type=your_post_type', ...)
- 外貌 –
add_submenu_page('themes.php', ...)
- 插件 –
add_submenu_page('plugins.php', ...)
- 用户 –
add_submenu_page('users.php', ...)
- 工具 –
add_submenu_page('tools.php', ...)
- 设置 –
add_submenu_page('options-general.php', ...)
- 仪表板 –
page_title
– 当子菜单处于活动状态时,将进入页面的HTML页面标题的文本。menu_title
– 选择菜单时要在页面标题中显示的文本。capability
– 将此菜单显示给用户所需的功能。用户级别被弃用,不应在此处使用。menu_slug
– 对于现有的WordPress菜单,处理菜单页面内容显示的PHP文件。对于自定义顶级菜单的子菜单,这是此子菜单页面的唯一标识符。function
– 显示菜单页面的页面内容的功能。从技术上讲,就像在add_menu_page
函数,函数参数是可选的,但是如果不提供该参数,那么WordPress基本上将假设包括PHP文件将生成管理屏幕,而无需调用函数。
使用包装器功能
由于大多数子级菜单都属于设置,工具或外观菜单,因此WordPress提供包装器功能,使得在这些顶级菜单中添加子级菜单项。请注意,随着时间的推移,函数名称可能与Admin UI中看到的名称不匹配:
仪表板
<?php
add_dashboard_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
帖子
<?php
add_posts_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
媒体
<?php
add_media_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
链接
<?php
add_links_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
页面
<?php
add_pages_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
评论
add_comments_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
外貌
<?php
add_theme_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
插件
<?php
add_plugins_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
用户
<?php
add_users_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
工具
<?php
add_management_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
设置
<?php
add_options_page(
$page_title,
$menu_title,
$capability,
$menu_slug,
$function
);
也看 主题选项 对于当前推荐的方法,可以通过定制器API创建选项。
例子
这是一个快速示例,说明了如何插入顶级菜单页面和子菜单页面,其中子菜单页面上的标题与顶级页面不同。在此示例中register_my_theme_more_settings_menu
是显示第一个子菜单页面的函数的名称:
<?php
function register_my_theme_settings_menu() {
add_menu_page(
"My Theme's Settings",
'My Theme',
'manage_options',
'my-theme-settings-menu'
);
}
function register_my_theme_more_settings_menu() {
add_submenu_page(
'my-theme-settings-menu',
'More Settings for My Theme',
'More Settings',
'manage_options',
'my-theme-more-settings-menu'
);
}
add_action( 'admin_menu', 'register_my_theme_settings_menu' );
add_action( 'admin_menu', 'register_my_theme_more_settings_menu' );
这是在自定义发布类型菜单块下添加选项页面的示例(另请参见此处):
代码
插入页面
这是如何将多个菜单插入各个地方的示例:
<?php
// Hook for adding admin menus
add_action( 'admin_menu', 'mt_add_pages' );
// Action function for hook above
function mt_add_pages() {
// Add a new submenu under Settings:
add_options_page( __( 'Test Settings', 'menu-test' ), __( 'Test Settings', 'menu-test' ), 'manage_options', 'testsettings', 'mt_settings_page' );
// Add a new submenu under Tools:
add_management_page( __( 'Test Tools', 'menu-test' ), __( 'Test Tools', 'menu-test' ), 'manage_options', 'testtools', 'mt_tools_page' );
// Add a new top-level menu (ill-advised):
add_menu_page( __( 'Test Toplevel', 'menu-test' ), __( 'Test Top-level', 'menu-test' ), 'manage_options', 'mt-top-level-handle', 'mt_toplevel_page' );
// Add a submenu to the custom top-level menu:
add_submenu_page( 'mt-top-level-handle', __( 'Test Sub-Level', 'menu-test' ), __( 'Test Sub-Level', 'menu-test' ), 'manage_options', 'sub-page', 'mt_sublevel_page' );
// Add a second submenu to the custom top-level menu:
add_submenu_page( 'mt-top-level-handle', __( 'Test Sub-Level 2', 'menu-test' ), __( 'Test Sub-Level 2', 'menu-test' ), 'manage_options', 'sub-page2', 'mt_sublevel_page2' );
}
// mt_settings_page() displays the page content for the Test settings sub-menu.
function mt_settings_page() {
echo '</pre><h2>' . __( 'Test Settings', 'menu-test' ) . '</h2><pre>';
}
// mt_tools_page() displays the page content for the Test Tools sub-menu.
function mt_tools_page() {
echo '</pre><h2>' . __( 'Test Tools', 'menu-test' ) . '</h2><pre>';
}
// mt_toplevel_page() displays the page content for the custom Test Top-Level menu.
function mt_toplevel_page() {
echo '</pre><h2>' . __( 'Test Top-Level', 'menu-test' ) . '</h2><pre>';
}
// mt_sublevel_page() displays the page content for the first sub-menu of the custom Test Toplevel menu.
function mt_sublevel_page() {
echo '</pre><h2>' . __( 'Test Sub-Level', 'menu-test' ) . '</h2><pre>';
}
// mt_sublevel_page2() displays the page content for the second sub-menu of the custom Test Top-Level menu.
function mt_sublevel_page2() {
echo '</pre><h2>' . __( 'Test Sub-Level 2', 'menu-test' ) . '</h2><pre>';
}
示例菜单页
笔记:看到 设置API 有关创建设置页面的信息。
上一个示例包含几个虚拟功能,例如mt_settings_page()
,作为实际页面内容的占位符。让我们扩展它们。如果您想创建一个名为的选项怎么办mt_favorite_color
这使网站所有者可以通过设置页面输入自己喜欢的颜色?这mt_options_page()
功能将需要在屏幕上输出数据输入表格以及处理输入的数据。
这是一个执行此操作的函数:
<?php
// mt_settings_page() displays the page content for the Test settings sub-menu.
function mt_settings_page() {
// Must check that the user has the required capability.
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
// Variables for the field and option names
$opt_name = 'mt_favorite_color';
$hidden_field_name = 'mt_submit_hidden';
$data_field_name = 'mt_favorite_color';
// Read in existing option value from database
$opt_val = get_option( $opt_name );
// See if the user has posted us some information. If they did, this hidden field will be set to 'Y'.
if ( isset( $_POST[ $hidden_field_name ] ) && $_POST[ $hidden_field_name ] == 'Y' ) {
// Read their posted value.
$opt_val = $_POST[ $data_field_name ];
// Save the posted value in the database.
update_option( $opt_name, $opt_val );
// Put a "Settings updated" message on the screen
?>
<div class="updated"></div><!-- .updated -->
<div class="wrap">
<?php echo '<h2>' . __( 'Menu Test Settings', 'menu-test' ) . '</h2>'; ?>
<form action="" method="post" name="form1"></form>
<?php _e( 'Favorite Color:', 'menu-test' ); ?>
<hr />
</div><!-- .wrap -->
<?php
}
}
一些笔记:
- WordPress功能,例如
add_menu_page()
和add_submenu_page()
采用功能,该功能将用于确定显示顶级还是子级菜单。 - 挂在处理页面输出的功能必须检查用户是否具有所需功能。
- WordPress管理功能需要验证用户登录,因此您不必在功能中担心它。
- 上面的功能示例已国际化 – 请参阅 WordPress开发人员的I18N 更多细节。
- 该函数在将数据输入表格放在屏幕上之前处理任何输入的数据,以便将新值以表单显示(而不是数据库中的值)。
- 您不必担心第一次有效,因为WordPress
update_option
如果尚不存在,功能将自动将选项添加到数据库中。 - 每当您每次导航到Admin中的页面时,这些管理员添加程序都会被解析。因此,如果您正在编写一个没有选项页面的主题,但是稍后再添加,您只需使用上面的说明并重新上传添加它,然后调整直到您对此感到满意。换句话说,菜单不会“永久添加”或在激活主题时放入数据库中。它们是随意解析的,因此您可以随意添加或减去菜单项,重新上计划,更改将立即反映。
页面挂钩后缀
每个添加新管理菜单的功能 – add_menu_page()
,add_submenu_page()
及其专业版本,例如add_options_page()
– 返回一个特殊价值称为 页面挂钩后缀。它可以在以后用作钩子,仅在该特定页面上只能在该钩子上注册。
一个这样的动作钩是load-{page_hook}
,在哪里{page_hook}
是其中之一归还的价值add_*_page()
功能。加载特定页面时,该挂钩被调用。在下面的示例中,它用于在所有管理页面上显示“未配置”的“主题未配置”通知,除了插件的选项页面:
<?php
add_action( 'admin_menu', 'my_menu' );
// Here you can check if plugin is configured (e.g. check if some option is set). If not, add new hook.
// In this example hook is always added.
add_action( 'admin_notices', 'my_admin_notices' );
function my_menu() {
// Add the new admin menu and page and save the returned hook suffix
$hook_suffix = add_options_page( 'My Options', 'My Theme', 'manage_options', 'my-unique-identifier', 'my_options' );
// Use the hook suffix to compose the hook and register an action executed when plugin's options page is loaded
add_action( 'load-' . $hook_suffix, 'my_load_function' );
}
function my_load_function() {
// Current admin page is the options page for our plugin, so do not display the notice
// (remove the action responsible for this)
remove_action( 'admin_notices', 'my_admin_notices' );
}
function my_admin_notices() {
echo '<pre><div class="updated fade" id="notice">My Plugin is not configured yet. Please do it now.</div></pre>';
}
function my_options() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
echo '</pre><div class="wrap">';
echo 'Here is where the form would go if I actually had options.';
echo '</div><pre>';
}