這不再是推薦使用主題選項的方式。 Customizer 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()
## 每個劇情需要一個鉤子
要添加管理菜單,您需要做三件事:
- 創建一個包含菜單建立代碼的函數。
- 如果要為網絡添加菜單,請使用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()函數將新項添加到設置管理菜單。
>[info] 注意:請注意,步驟2中的add_action()調用在admin_menu鉤子下注冊my_menu()函數。 沒有這個,add_action()調用,將會拋出一個未定義函數的PHP錯誤。 最后,add_options_page()調用是指當有人點擊菜單項時,包含要顯示的實際頁面(和要處理的PHP代碼)的my_options()函數。
以下部分將對這些步驟進行更詳細的描述。 請記住將菜單和頁面的創建包含在函數中,并使用admin_menu鉤子來在正確的時間開始整個過程。
## 確定新菜單的位置
在創建新菜單之前,首先決定菜單是頂級菜單還是子級菜單項。頂級菜單顯示為管理菜單中的新部分,并包含子級菜單項。這意味著子級菜單項是現有頂級菜單的成員。
主題很少需要創建一個新的頂級菜單。如果這個主題向WordPress引入了一個全新的概念,并且需要許多屏幕來做,那么這個主題可能需要一個新的頂級菜單。只有當您真正需要多個相關屏幕才能使WordPress做最初的設計時,才能考慮添加頂級菜單。新的頂級菜單的示例可能包括作業管理或會議管理。請注意,通過本機帖子類型注冊,WordPress會自動創建頂級菜單來管理此類功能。
如果不需要創建頂級菜單,則需要決定在什么頂級菜單中放置新的子級菜單項。作為參考,幾個主題添加了現有WordPress頂層菜單下的子級菜單項。
使用本指南的WordPress頂級菜單來確定您的子級菜單項的正確位置:
- Dashboard – 信息中心為您的網站,并包括更新選項更新WordPress核心,插件和主題。
- Posts – 顯示用于撰寫帖子(面向時間的內容)的工具。
- Media – 上傳和管理您的圖片,視頻和音頻。
- Links – 管理對其他博客和感興趣的網站的引用。
- Pages – 顯示用于編寫稱為頁面的靜態內容的工具。
- Comments – 控制和監管讀者對帖子的回復。
- Appearance – 顯示用于操縱theme/style文件,側邊欄等的控件。
- Plugins – 顯示處理插件管理的控件,而不是插件本身的配置選項。
- Users – 顯示用戶管理控件。
- Tools – 管理博客數據的導出,導入甚至備份。
- Settings – 顯示只有管理員應該查看的插件選項。
- Network Admin – 顯示在網絡上設置的插件選項。 而不是admin_menu,您應該使用network_admin_menu(另請參閱創建網絡)
## 頂級菜單
如果您決定了您的主題需要一個全新的頂級菜單,您需要做的第一件事是使用add_menu_page()函數創建一個。
>[warning] 注意:如果您不需要頂級菜單,請跳到“子級菜單”。
參數值:
- page_title – 選擇菜單時要顯示在頁面的標題標簽中的文本。
- menu_title – 菜單的屏幕上的名稱文本。
- capability – 該菜單顯示給用戶所需的功能。 當使用Settings API處理表單時,您應該在此處使用manage_options,因為用戶將無法保存其中的選項。 用戶級別已棄用,不能在此處使用。
- menu_slug – 這個菜單由這個菜單引用(這個菜單應該是唯一的)。 在版本3.0之前,這被稱為文件(或句柄)參數。 如果功能參數被省略,則menu_slug應該是處理菜單頁面內容顯示的PHP文件。
- function – 顯示菜單頁面的頁面內容的功能。
- icon_url – 要用于此菜單的圖標的URL。 此參數是可選的。
- position – 菜單中的位置這個菜單應該出現。 默認情況下,如果省略此參數,菜單將顯示在菜單結構的底部。 要查看當前的菜單位置,請在菜單加載后使用print_r($ GLOBALS ['menu'])。
- Sub-Level Menus – 一旦定義了頂級菜單,或者您選擇使用現有的WordPress頂級菜單,就可以使用add_submenu_page()函數定義一個或多個子級菜單項。
## 子菜單
如果您想要將新菜單項設為子菜單項,可以使用add_submenu_page()函數創建它。
參數值:
parent_slug - 父菜單的小數名稱,或標準WordPress管理員文件的文件名,提供要插入子菜單的頂級菜單,或者如果此子菜單正在進行,則為插件文件 自定義頂級菜單。 例子:
- Dashboard – add_submenu_page('index.php', ...)
- Posts – add_submenu_page('edit.php', ...)
- Media – add_submenu_page('upload.php', ...)
- Links – add_submenu_page('link-manager.php', ...)
- Pages – add_submenu_page('edit.php?post_type=page', ...)
- Comments – add_submenu_page('edit-comments.php', ...)
- Custom Post Types – add_submenu_page('edit.php?post_type=your_post_type', ...)
- Appearance – add_submenu_page('themes.php', ...)
- Plugins – add_submenu_page('plugins.php', ...)
- Users – add_submenu_page('users.php', ...)
- Tools – add_submenu_page('tools.php', ...)
- Settings – add_submenu_page('options-general.php', ...)
- page_title – 當子菜單處于活動狀態時,將進入頁面的HTML頁面標題的文本。
- menu_title – 選擇菜單時要顯示在頁面的標題標簽中的文本。
- capability – 該菜單顯示給用戶所需的功能。 用戶級別已棄用,不能在此處使用。
- menu_slug – 對于現有的WordPress菜單,處理菜單頁面內容顯示的PHP文件。 對于自定義頂級菜單的子菜單,此子菜單頁面的唯一標識符。
- function – 顯示菜單頁面的頁面內容的功能。 在技術上,如在add_menu_page函數中,函數參數是可選的,但是如果沒有提供,那么WordPress基本上會假設包含PHP文件將生成管理屏幕,而不調用函數。
## 使用包裝器功能
由于大多數子級菜單屬于“設置”,“工具”或“外觀”菜單,所以WordPress提供了包裝功能,可以使這些頂級菜單中的子級菜單項更容易。 請注意,功能名稱可能與管理UI中看到的名稱不一致,因為它們隨時間變化:
- Dashboard
```
<?php add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Posts
```
<?php add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Media
```
<?php add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Links
```
<?php add_links_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Pages
```
<?php add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Comments
```
<?php add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Appearance
```
<?php add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Plugins
```
<?php add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Users
```
<?php add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Tools
```
<?php add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
- Settings
```
<?php add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); ?>
```
另請參閱主題選項,用于通過Customizer API創建選項的當前推薦方法。
## 示例
以下是一個快速示例,說明如何插入頂層菜單頁和子菜單頁,子菜單頁上的標題與頂級頁不同。 在此示例中,register_my_theme_more_settings_menu是顯示第一個子菜單頁面的函數的名稱:
```
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");
```
以下是在自定義帖子類型菜單塊下添加選項頁面的示例(另見此處):
## 插入頁面
以下是一個如何將多個菜單插入到各個地方的示例:
```
<?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>
";
}
?>
```
## 樣品菜單頁
>[warning] 注意:有關創建設置頁面的信息,請參閱設置API。
前面的示例包含幾個虛擬函數,如mt_settings_page()作為實際頁面內容的占位符。 我們來擴大他們。 如果您想創建一個名為mt_favorite_color的選項,如果網站所有者可以通過“設置”頁面輸入最喜歡的顏色,該怎么辦? mt_options_page()函數需要在屏幕上輸出數據輸入表單,并處理輸入的數據。
這是一個這樣做的功能:
```
// 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>
<div class="wrap">
<?php
// Header
echo "<h2>" . __( 'Menu Test Settings', 'menu-test' ) . "</h2>";
// Settings form
?>
<form action="" method="post" name="form1"></form>
<?php _e("Favorite Color:", 'menu-test' ); ?>
<hr />
</div>
<?php } ?>
```
幾個注釋:
- WordPress函數(如add_menu_page()和add_submenu_page())具有一個功能,用于確定是否顯示頂級或子級菜單。
- 掛接以處理頁面輸出的功能必須檢查用戶是否具有所需的功能。
- WordPress管理功能負責驗證用戶登錄,因此您不必擔心您的功能。
- 上述功能示例已被國際化 - 有關詳細信息,請參閱I18n for WordPress開發人員。
- 在將數據輸入表單放在屏幕上之前,該函數將處理任何輸入的數據,以便新值將以表單(而不是數據庫的值)顯示。
- 您不必擔心這是第一次工作,因為WordPress update_option函數會自動向數據庫添加一個選項,如果它不存在。
- 這些管理菜單添加過程將在您每次導航到管理員中的頁面時進行解析。因此,如果您正在撰寫一個沒有選項頁面的主題,但稍后添加一個主題,您可以使用上面的說明添加它,并重新上傳,并調整,直到您滿意為止。換句話說,菜單在激活主題時不會“永久添加”或放入數據庫。他們在飛行中解析,所以您可以隨意添加或減少菜單項,重新上傳,更改將立即反映。
## 頁鉤子后綴
添加新管理菜單的每個功能 - 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的頂級菜單討論
管理員菜單編輯器插件
- 簡介
- 主題開發
- WordPress許可證
- 什么是主題
- 開發環境
- 主題開發示例
- 主題基礎
- 模板文件
- 主樣式表(style.css)
- 文章類型
- 規劃主題文件
- 模板層級
- 模板標簽
- 循環
- 主題函數
- 連接主題文件和目錄
- 使用CSS和JavaScript
- 條件標簽
- 類別,標簽和自定義分類
- 模板文件
- 內容模板文件
- 頁面模板文件
- 附件模板文件
- 自定義內容類型
- 部分和其他模板文件
- 評論模板
- 分類模板
- 404頁面
- 主題功能
- 核心支持的功能
- 管理菜單
- 自定義Headers
- 自定義Logo
- 文章格式
- 置頂文章
- Sidebars
- Widgets
- 導航菜單
- 分頁
- 媒體
- Audio
- Images
- Galleries
- Video
- 精選圖片和縮略圖
- 國際化
- 本地化
- 輔助功能
- 主題選項 – 自定義API
- 定制對象
- 改進用戶體驗的工具
- 定制JavaScript API
- JavaScript / Underscore.js渲染的自定義控件
- 高級用法
- 主題安全
- 數據消毒/逃避
- 數據驗證
- 使用隨機數
- 常見漏洞
- 高級主題
- 子主題
- UI最佳實踐
- JavaScript最佳做法
- 主題單元測試
- 驗證你的主題
- Plugin API Hooks
- 發布你的主題
- 所需的主題文件
- 測試
- 主題評論指南
- 寫文檔
- 提交你的主題到WordPress.org
- 參考文獻
- 模板標簽列表
- 條件標簽列表
- 編碼標準
- HTML編碼標準
- CSS編碼標準
- JavaScript編碼標準
- PHP編碼標準
- 插件開發
- 插件開發簡介
- 什么是插件
- 插件基礎
- 頭部要求
- 包括軟件許可證
- 啟用 / 停用 Hooks
- 卸載方法
- 最佳做法
- 插件安全
- 檢查用戶功能
- 數據驗證
- 保護輸入
- 保護輸出
- 隨機數
- Hooks
- Actions
- Filters
- 自定義Hooks
- 高級主題
- 管理菜單
- 頂級菜單
- 子菜單
- 短代碼
- 基本短碼
- 封閉短碼
- 帶參數的短代碼
- TinyMCE增強型短碼
- 設置
- 設置API
- 使用設置API
- 選項API
- 自定義設置頁面
- 元數據
- 管理帖子元數據
- 自定義元數據
- 渲染元數據
- 自定義文章類型
- 注冊自定義文章類型
- 使用自定義文章類型
- 分類
- 使用自定義分類
- 在WP 4.2+中使用“split術語”
- 用戶
- 創建和管理用戶
- 使用用戶元數據
- 角色和功能
- HTTP API
- JavaScript
- jQuery
- Ajax
- 服務器端PHP和入隊
- Heartbeat API
- 概要
- 計劃任務
- 了解WP-Cron計劃
- 安排WP-Cron 事件
- 將WP-Cron掛接到系統任務計劃程序中
- WP-Cron簡單測試
- 國際化
- 本地化
- 如何國際化您的插件
- 國際化安全
- WordPress.org
- 詳細插件指南
- 規劃您的插件
- 如何使用Subversion
- 插件開發者常見問題
- 開發工具
- Debug Bar 和附加組件
- 輔助插件
- REST API手冊
- 資源
- 文章
- 文章修訂
- 文章類型
- 文章狀態
- 類別
- 標簽
- 頁面
- 評論
- 分類
- 媒體
- 用戶
- 設置
- 使用REST API
- 全局參數
- 分頁
- 鏈接和嵌入
- 發現
- 認證
- 經常問的問題
- 骨干JavaScript客戶端
- 客戶端庫
- 擴展REST API
- 添加自定義端點
- 自定義內容類型
- 修改回應
- 模式
- 詞匯表
- 路由和端點
- 控制器類