这不再是推荐使用主题选项的方法。这 定制器API 是推荐给用户提供更多控制和灵活性的方法

主题作者可能需要提供设置屏幕,以便用户可以自定义其主题的使用方式或工作方式。最好的方法是创建一个管理菜单项,允许用户从所有管理屏幕访问设置屏幕。

功能参考

菜单页

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()

每个情节都需要一个钩子

要添加管理菜单,您需要做三件事:

  1. 创建一个包含菜单构建代码的函数。
  2. 使用上述功能使用admin_menu动作钩 – 或network_admin_menu,如果您添加了网络菜单。
  3. 创建屏幕的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 更多细节。
  • 该函数在将数据输入表格放在屏幕上之前处理任何输入的数据,以便将新值以表单显示(而不是数据库中的值)。
  • 您不必担心第一次有效,因为WordPressupdate_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>';
}

资源

WP-Hackers的顶级菜单讨论
管理菜单编辑器插件

By zhuon

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注