這不再是使用主題選項(xiàng)的推薦方式。建議使用Customizer API,以便為用戶提供更多控制和靈活性。
主題作者可能需要提供一個(gè)設(shè)置界面,以便用戶可以自定義其主題的使用或工作方式。最好的方法是創(chuàng)建一個(gè)管理菜單項(xiàng),該菜單項(xiàng)允許用戶從所有管理界面訪問(wèn)該設(shè)置界面。
函數(shù)參考
菜單頁(yè)面
子菜單頁(yè)面
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()
每個(gè)情節(jié)都需要一個(gè)鉤子
要添加管理菜單,您需要做三件事:
- 創(chuàng)建一個(gè)包含菜單構(gòu)建代碼的函數(shù)。
- 如果要為網(wǎng)絡(luò)添加菜單,請(qǐng)使用
admin_menu動(dòng)作掛鉤-或network_admin_menu注冊(cè)上述函數(shù) 。 - 創(chuàng)建界面的HTML輸出,單擊菜單項(xiàng)時(shí)顯示該界面。
大多數(shù)開(kāi)發(fā)人員忽略了此列表中的第二步。您不能簡(jiǎn)單地調(diào)用菜單代碼。您需要將其放在一個(gè)函數(shù)中,然后注冊(cè)該函數(shù)。
這是描述的這三個(gè)步驟的簡(jiǎn)單示例。這將在“設(shè)置”頂級(jí)菜單下添加一個(gè)子菜單項(xiàng)。選擇后,該菜單項(xiàng)將顯示一個(gè)非常基本的界面。
<?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>';
}
?>
在此示例中,函數(shù)my_menu()通過(guò)函數(shù) add_options_page() 將新項(xiàng)目添加到“設(shè)置”管理菜單。
注意:請(qǐng)注意,步驟2?中的add_action()調(diào)用將my_menu()函數(shù)注冊(cè)在admin_menu掛鉤下。否則,add_action()調(diào)用將引發(fā)未定義函數(shù)的PHP錯(cuò)誤。最后,add_options_page()調(diào)用的my_options()包含某人單擊菜單項(xiàng)時(shí)要顯示的實(shí)際頁(yè)面(以及要處理的PHP代碼)的函數(shù)。
在下面的章節(jié)中將更詳細(xì)地描述這些步驟。請(qǐng)記住將菜單和頁(yè)面的創(chuàng)建包含在函數(shù)中,并使用該admin_menu?掛鉤在正確的時(shí)間啟動(dòng)整個(gè)過(guò)程。
確定新菜單位置
在創(chuàng)建新菜單之前,首先確定該菜單是頂級(jí)菜單還是子菜單項(xiàng)。頂級(jí)菜單在管理菜單中顯示為新部分,并包含子級(jí)菜單項(xiàng)。這意味著子級(jí)菜單項(xiàng)是現(xiàn)有頂級(jí)菜單的成員。
很少有主題需要?jiǎng)?chuàng)建一個(gè)新的頂層菜單。如果主題為WordPress引入了一個(gè)全新的概念并且需要很多界面來(lái)實(shí)現(xiàn),則該主題可能需要一個(gè)新的等級(jí)菜單。僅當(dāng)您確實(shí)需要多個(gè)相關(guān)界面以使WordPress執(zhí)行其最初設(shè)計(jì)無(wú)法完成的操作時(shí),才應(yīng)考慮添加頂級(jí)菜單。新的頂級(jí)菜單的示例可能包括作業(yè)管理或會(huì)議( conference )管理。請(qǐng)注意,通過(guò)內(nèi)置的文章類型注冊(cè),WordPress會(huì)自動(dòng)創(chuàng)建頂級(jí)菜單來(lái)管理此類功能。
如果不需要?jiǎng)?chuàng)建頂級(jí)菜單,則需要決定在哪個(gè)頂級(jí)菜單下放置新的子級(jí)菜單項(xiàng)。
可以根據(jù)WordPress頂級(jí)菜單的位置來(lái)確定子菜單項(xiàng)的正確位置:
- 儀表板–您站點(diǎn)的信息中心,包括用于更新WordPress核心、插件和主題的“更新”選項(xiàng)。
- 文章–顯示用于撰寫文章的工具。
- 媒體–上傳和管理您的圖片、視頻和音頻。
- 鏈接–管理對(duì)其他博客和感興趣站點(diǎn)的引用。(已棄用)
- 頁(yè)面–顯示用于編寫稱為頁(yè)面的靜態(tài)內(nèi)容的工具。
- 評(píng)論–控制和規(guī)范讀者對(duì)文章的回應(yīng)。
- 外觀–顯示用于控制主題/樣式文件、側(cè)邊欄等控件。
- 插件–顯示有關(guān)插件管理的控件,而不是插件本身的配置選項(xiàng)。
- 用戶–顯示用于用戶管理的控件。
- 工具–管理博客數(shù)據(jù)的導(dǎo)出,導(dǎo)入,甚至備份。
- 設(shè)置–顯示只有管理員才能查看的插件選項(xiàng)。
- 網(wǎng)絡(luò)管理員–顯示在多站點(diǎn)網(wǎng)絡(luò)上設(shè)置選項(xiàng)。對(duì)于注冊(cè)網(wǎng)絡(luò)菜單,不要用
admin_menu,應(yīng)該使用network_admin_menu(另請(qǐng)參閱創(chuàng)建網(wǎng)絡(luò))
頂級(jí)菜單
如果您確定主題需要全新的頂級(jí)菜單,則要做的第一件事就是使用該函數(shù)add_menu_page()創(chuàng)建一個(gè)菜單。注意:如果不需要頂級(jí)菜單,請(qǐng)跳至“?子菜單”。
參數(shù)值:
page_title?–選擇菜單后在頁(yè)面標(biāo)題標(biāo)簽中顯示的文本。menu_title?–菜單的界面名稱文本。capability–向用戶顯示此菜單所需的用戶權(quán)限。使用設(shè)置API處理表單時(shí),應(yīng)在此處使用manage_options,因?yàn)槿绻麤](méi)有表單,用戶將無(wú)法保存選項(xiàng)。用戶級(jí)別已棄用,在此不應(yīng)該使用。menu_slug–引用此菜單所依據(jù)的子名稱(此菜單應(yīng)唯一)。在3.0版之前,這稱為文件(或句柄)參數(shù)。如果省略function參數(shù),menu_slug則應(yīng)為處理菜單頁(yè)面內(nèi)容顯示的PHP文件。function?–顯示菜單頁(yè)面內(nèi)容的函數(shù)。icon_url–此菜單使用的圖標(biāo)的位置。此參數(shù)是可選的。position–該菜單應(yīng)在菜單順序中出現(xiàn)的位置。默認(rèn)情況下,如果省略此參數(shù),則菜單將出現(xiàn)在菜單結(jié)構(gòu)的底部。要查看當(dāng)前菜單位置, 請(qǐng)?jiān)诓藛渭虞d后使用print_r( $GLOBALS[ 'menu' ] )。- 子菜單–定義了頂層菜單或選擇使用現(xiàn)有的WordPress頂級(jí)菜單后,即可使用該
add_submenu_page()函數(shù)定義一個(gè)或多個(gè)子級(jí)菜單項(xiàng)。
子菜單
如果您希望新菜單項(xiàng)作為子菜單項(xiàng),則可以使用add_submenu_page()函數(shù)來(lái)創(chuàng)建它。
參數(shù)值:
parent_slug–父級(jí)菜單的slug別名,或提供要在其中插入子菜單的頂級(jí)菜單的標(biāo)準(zhǔn)WordPress管理文件的文件名,如果此子菜單進(jìn)入自定義頂級(jí)菜單。例子:- 儀表板 –?
add_submenu_page('index.php', ...) - 文章–?
add_submenu_page('edit.php', ...) - 媒體–?
add_submenu_page('upload.php', ...) - 鏈接–?
add_submenu_page('link-manager.php', ...) - 頁(yè)面–?
add_submenu_page('edit.php?post_type=page', ...) - 評(píng)論 –?
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', ...) - 設(shè)置–?
add_submenu_page('options-general.php', ...)
- 儀表板 –?
page_title?–子菜單頁(yè)面標(biāo)題的文本。menu_title?–選擇菜單后在頁(yè)面標(biāo)題標(biāo)簽中顯示的文本。capability–向用戶顯示此菜單所需的用戶權(quán)限。用戶級(jí)別已棄用,在此不應(yīng)該使用。menu_slug–對(duì)于現(xiàn)有的WordPress菜單,該P(yáng)HP文件用于處理菜單頁(yè)面內(nèi)容的顯示。對(duì)于自定義頂級(jí)菜單的子菜單,是此子菜單頁(yè)面的唯一標(biāo)識(shí)符。function–顯示菜單頁(yè)面內(nèi)容的函數(shù)。從技術(shù)上講,就像在add_menu_page函數(shù)中一樣,function參數(shù)是可選的,但是如果未提供該參數(shù),則WordPress將默認(rèn)認(rèn)為該P(yáng)HP文件將生成管理界面,而無(wú)需調(diào)用函數(shù)。
使用包裝函數(shù)
由于大多數(shù)子菜單都位于“設(shè)置”、“工具”或“外觀”菜單下,因此WordPress提供了包裝函數(shù),這些函數(shù)使將子菜單項(xiàng)添加到這些頂級(jí)菜單變得更加容易。請(qǐng)注意,函數(shù)名稱可能與在管理界面中看到的名稱不匹配,因?yàn)樗鼈冸S著時(shí)間的推移而發(fā)生了變化:
儀表板
<?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); ?>
頁(yè)面
<?php add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
評(píng)論
<?php 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); ?>
設(shè)置
<?php add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
另請(qǐng)參閱主題選項(xiàng),以了解當(dāng)前推薦的通過(guò)Customizer API創(chuàng)建選項(xiàng)的方式。
示例
這是一個(gè)快速示例,說(shuō)明了如何插入頂級(jí)菜單頁(yè)面和子菜單頁(yè)面,其中子菜單頁(yè)面上的標(biāo)題與頂級(jí)頁(yè)面不同。在此示例中,register_my_theme_more_settings_menu是顯示第一個(gè)子菜單頁(yè)面的函數(shù)的名稱:
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-themes-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");
插入頁(yè)面
這是一個(gè)如何在多個(gè)位置插入多個(gè)菜單的示例:
<?php
// 添加管理菜單的鉤子
add_action('admin_menu', 'mt_add_pages');
// 掛載到上面鉤子的函數(shù)
function mt_add_pages() {
// 在設(shè)置下添加子菜單
add_options_page(__('Test Settings','menu-test'), __('Test Settings','menu-test'), 'manage_options', 'testsettings', 'mt_settings_page');
// 在工具下添加子菜單
add_management_page( __('Test Tools','menu-test'), __('Test Tools','menu-test'), 'manage_options', 'testtools', 'mt_tools_page');
// 添加頂級(jí)菜單
add_menu_page(__('Test Toplevel','menu-test'), __('Test Top-level','menu-test'), 'manage_options', 'mt-top-level-handle', 'mt_toplevel_page' );
//添加子菜單到自定義的頂級(jí)菜單
add_submenu_page('mt-top-level-handle', __('Test Sub-Level','menu-test'), __('Test Sub-Level','menu-test'), 'manage_options', 'sub-page', 'mt_sublevel_page');
// 添加第二個(gè)子菜單到自定義的頂級(jí)菜單
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() 顯示設(shè)置下子菜單頁(yè)面的內(nèi)容
function mt_settings_page() {
echo "</pre>
<h2>" . __( 'Test Settings', 'menu-test' ) . "</h2>
<pre>
";
}
// mt_tools_page() 顯示工具下子菜單的內(nèi)容
function mt_tools_page() {
echo "</pre>
<h2>" . __( 'Test Tools', 'menu-test' ) . "</h2>
<pre>
";
}
// mt_toplevel_page() 顯示自定義頂級(jí)菜單的內(nèi)容
function mt_toplevel_page() {
echo "</pre>
<h2>" . __( 'Test Top-Level', 'menu-test' ) . "</h2>
<pre>
";
}
// mt_sublevel_page() 顯示第一個(gè)子菜單的內(nèi)容
// of the custom Test Toplevel menu
function mt_sublevel_page() {
echo "</pre>
<h2>" . __( 'Test Sub-Level', 'menu-test' ) . "</h2>
<pre>
";
}
// mt_sublevel_page2() 顯示第二個(gè)子菜單的內(nèi)容
// of the custom Test Top-Level menu
function mt_sublevel_page2() {
echo "</pre>
<h2>" . __( 'Test Sub-Level 2', 'menu-test' ) . "</h2>
<pre>
";
}
?>
菜單頁(yè)示例
注意:有關(guān)創(chuàng)建設(shè)置頁(yè)面的信息,請(qǐng)參見(jiàn)Settings API。
前面的示例包含幾個(gè)虛擬函數(shù),例如mt_settings_page(),作為實(shí)際頁(yè)面內(nèi)容的占位符。讓我們擴(kuò)展它們。如果您想創(chuàng)建一個(gè)名為mt_favorite_color 的選項(xiàng),該選項(xiàng)使站點(diǎn)所有者可以通過(guò)“設(shè)置”頁(yè)面鍵入自己喜歡的顏色怎么辦?mt_options_page()函數(shù)將需要在界面上輸出數(shù)據(jù)輸入表單,并處理輸入的數(shù)據(jù)。
這是執(zhí)行此操作的函數(shù):
// mt_settings_page() 顯示設(shè)置下子菜單的頁(yè)面
function mt_settings_page() {
//必須檢查當(dāng)前用戶是否有對(duì)應(yīng)的權(quán)限
if (!current_user_can('manage_options'))
{
wp_die( __('您沒(méi)有足夠的權(quán)限訪問(wèn)該頁(yè)面。') );
}
// 字段和選項(xiàng)名稱變量
$opt_name = 'mt_favorite_color';
$hidden_field_name = 'mt_submit_hidden';
$data_field_name = 'mt_favorite_color';
// 從數(shù)據(jù)庫(kù)中讀取現(xiàn)有的選項(xiàng)值
$opt_val = get_option( $opt_name );
// 查看用戶是否向我們提交了一些信息
// 如果他們這樣做了,則此隱藏字段將設(shè)置為“Y”
if( isset($_POST[ $hidden_field_name ]) && $_POST[ $hidden_field_name ] == 'Y' ) {
// 獲取所提交的信息
$opt_val = $_POST[ $data_field_name ];
// 保存所提交的信息到數(shù)據(jù)庫(kù)
update_option( $opt_name, $opt_val );
// 在屏幕上顯示“設(shè)置已更新”消息
?>
<div class="updated"></div>
<div class="wrap">
<?php
// Header
echo "<h2>" . __( 'Menu Test Settings', 'menu-test' ) . "</h2>";
// 設(shè)置表單
?>
<form action="" method="post" name="form1"></form>
<?php _e("Favorite Color:", 'menu-test' ); ?>
<hr />
</div>
<?php } ?>
一些注意事項(xiàng):
- WordPress函數(shù)(例如
add_menu_page()和)add_submenu_page()具有將用于確定顯示頂級(jí)菜單還是子菜單的功能。 - 連接到處理頁(yè)面輸出的函數(shù)必須檢查用戶是否也具有所需的權(quán)限。
- WordPress管理函數(shù)負(fù)責(zé)驗(yàn)證用戶登錄名,因此您不必在函數(shù)中擔(dān)心它。
- 上面的功能示例已國(guó)際化-?有關(guān)更多詳細(xì)信息,請(qǐng)參見(jiàn)WordPress開(kāi)發(fā)人員的I18n。
- 該函數(shù)在將數(shù)據(jù)輸入表單顯示在屏幕上之前會(huì)處理所有輸入的數(shù)據(jù),以便新的值可以在該表單顯示(而不是數(shù)據(jù)庫(kù)中的值)。
- 您不必?fù)?dān)心第一次工作,因?yàn)閃ordPress?
update_option函數(shù)會(huì)自動(dòng)將選項(xiàng)添加到數(shù)據(jù)庫(kù)(如果尚不存在)。 - 每次您導(dǎo)航到Admin中的頁(yè)面時(shí),都會(huì)解析這些管理菜單的添加過(guò)程。因此,如果您編寫的主題沒(méi)有選項(xiàng)頁(yè)面,但是以后添加了,則可以按照上述說(shuō)明添加主題選項(xiàng),然后重新上傳,然后進(jìn)行調(diào)整,直到滿意為止。換句話說(shuō),激活主題后,菜單不會(huì)“永久添加”或放入數(shù)據(jù)庫(kù)中。它們是動(dòng)態(tài)解析的,因此您可以隨意添加或減去菜單項(xiàng),重新上傳,更改將立即反映出來(lái)。
頁(yè)面鉤子后綴
增加管理菜單每一個(gè)函數(shù):add_menu_page()、add_submenu_page()都有其專有的版本,如add_options_page()-返回稱為頁(yè)面鉤子后綴的特殊值。以后可以將它用作一個(gè)鉤子,可以將僅在該特定頁(yè)面上調(diào)用的操作注冊(cè)到該鉤子。
這樣的動(dòng)作掛鉤之一是load-{page_hook},其中{page_hook}就是這些add_*_page()函數(shù)返回的值。加載特定頁(yè)面時(shí)將調(diào)用此鉤子。在以下示例中,它用于在除插件選項(xiàng)頁(yè)面之外的所有管理頁(yè)面上顯示“未配置主題”通知:
<?php
add_action('admin_menu', 'my_menu');
// 您可以在此處檢查是否已配置插件(例如,檢查是否設(shè)置了某些選項(xiàng))。如果沒(méi)有,請(qǐng)?zhí)砑有碌你^子。
// 在此示例中,始終添加鉤子。
add_action( 'admin_notices', 'my_admin_notices' );
function my_menu() {
// 添加新的管理菜單和頁(yè)面并保存返回的鉤子后綴
$hook_suffix = add_options_page('My Options', 'My Theme', 'manage_options', 'my-unique-identifier', 'my_options');
// 使用鉤子后綴組成鉤子,并注冊(cè)加載插件的選項(xiàng)頁(yè)面時(shí)執(zhí)行的操作
add_action( 'load-' . $hook_suffix , 'my_load_function' );
}
function my_load_function() {
// 當(dāng)前管理頁(yè)面是我們插件的選項(xiàng)頁(yè)面,因此不顯示通知
// (刪除對(duì)此負(fù)責(zé)的操作)
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>
';
}
?>



