管理菜單

  1. 主頁(yè)
  2. 文檔
  3. WordPress主題開(kāi)發(fā)手冊(cè)
  4. 主題功能
  5. 管理菜單

這不再是使用主題選項(xiàng)的推薦方式。建議使用Customizer API,以便為用戶提供更多控制和靈活性。

主題作者可能需要提供一個(gè)設(shè)置界面,以便用戶可以自定義其主題的使用或工作方式。最好的方法是創(chuàng)建一個(gè)管理菜單項(xiàng),該菜單項(xiàng)允許用戶從所有管理界面訪問(wèn)該設(shè)置界面。

函數(shù)參考

菜單頁(yè)面

子菜單頁(yè)面

WordPress管理菜單

每個(gè)情節(jié)都需要一個(gè)鉤子

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

  1. 創(chuàng)建一個(gè)包含菜單構(gòu)建代碼的函數(shù)。
  2. 如果要為網(wǎng)絡(luò)添加菜單,請(qǐng)使用admin_menu動(dòng)作掛鉤-或network_admin_menu 注冊(cè)上述函數(shù) 。
  3. 創(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>
    ';
}
?>
這篇文章對(duì)您有用嗎? 2 1
0 條回復(fù) A文章作者 M管理員
    暫無(wú)討論,說(shuō)說(shuō)你的看法吧
?
個(gè)人中心
購(gòu)物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

邵阳市| 和林格尔县| 三门峡市| 南陵县| 乌兰察布市| 稷山县| 彰化市| 宜君县| 卢氏县| 白沙| 垣曲县| 商都县| 永康市| 乐安县| 阳新县| 凌源市| 泉州市| 隆安县| 绥阳县| 万州区| 广东省| 芦溪县| 绍兴县| 大名县| 乌海市| 时尚| 黔东| 迁西县| 高平市| 墨脱县| 平远县| 连城县| 邳州市| 读书| 万宁市| 中山市| 右玉县| 方城县| 麻阳| 石棉县| 宜兴市|