簡介目前市面上有很多插件能夠讓用戶自行對(duì)插件進(jìn)行設(shè)置。插件開發(fā)人員可以通過幾種方法來實(shí)現(xiàn)插件的這一功能。其中一個(gè)方法就是,允許用戶編輯插件的PHP文件,但很多用戶并不適應(yīng)這種方式(這是比較禮貌的說法)。因此,插件開發(fā)人員可以為用戶創(chuàng)建一個(gè)插件管理界面,讓用戶能夠以更自然更熟悉的方式設(shè)置插件。 本文首先假設(shè)讀者對(duì)編寫插件的基本知識(shí)以及動(dòng)作和過濾器的插件API有一定了解,在此基礎(chǔ)上向讀者說明怎樣在WordPress中為插件添加自定義管理界面。 Hook鉤子要添加管理菜單,首先要進(jìn)行以下三項(xiàng)操作:
將代碼存儲(chǔ)在主插件php文件或獨(dú)立的php包含文件中。 插件開發(fā)新手經(jīng)常會(huì)忽略第二個(gè)操作。我們不能直接調(diào)用菜單代碼,必須要將代碼放入某個(gè)函數(shù),然后再記錄這個(gè)函數(shù)。 下面是一個(gè)關(guān)于以上三項(xiàng)操作的簡單實(shí)例: <?php
add_action('admin_menu', 'my_plugin_menu');
function my_plugin_menu() {
add_options_page('My Plugin Options', 'My Plugin', 8, 'your-unique-identifier', 'my_plugin_options');
}
function my_plugin_options() {
echo '< div class="wrap">';
echo '< p>Here is where the form would go if I actually had options.</p>';
echo '</div>';
}
?>
這個(gè)例子用my_plugin_menu函數(shù)為管理菜單添加新條目(通過add_options_page函數(shù),下文中有介紹)。然后調(diào)用 WordPress的鉤子來“登記”這個(gè)函數(shù)。如果不調(diào)用鉤子,激活插件時(shí)WordPress會(huì)拋出“函數(shù)未定義”PHP錯(cuò)誤。最后創(chuàng)建出一個(gè)函數(shù),函數(shù) 中含有點(diǎn)擊菜單選項(xiàng)后將要顯示的頁面(以及需要操作的PHP代碼)。 下面會(huì)介紹到后兩步的實(shí)際操作過程。不要忘記在函數(shù)中圍繞這兩步操作,然后調(diào)用admin_menu鉤子開始操作。 菜單和子菜單創(chuàng)建自定義管理界面前,我們需要斷定該管理界面屬于WordPress管理菜單系統(tǒng)的哪個(gè)部分。大多數(shù)插件將自己的管理界面作為子菜單項(xiàng),放在WordPress已有的頂級(jí)菜單下。下面分別介紹各個(gè)頂級(jí)菜單: 設(shè)置 該菜單顯示只有管理員可見的插件設(shè)置(參見創(chuàng)建設(shè)置/選項(xiàng)頁面) 插件 該菜單顯示插件管理的相關(guān)控件,而非插件本身的配置設(shè)置 外觀 該菜單顯示用以管理主題/樣式文件、工具欄等內(nèi)容的相關(guān)控件 寫日志 該菜單顯示用以編輯日志/頁面的工具 用戶 該菜單顯示用于管理用戶的控件 如果我們開發(fā)的插件對(duì)WordPress來說是個(gè)新概念,完全異于其它插件,并且需要很多頁面來實(shí)現(xiàn)這個(gè)插件,那么我們可以為插件創(chuàng)建一個(gè) 頂級(jí)菜單。不過之前一定要確定,我們的確需要多個(gè)相關(guān)頁面來實(shí)現(xiàn)插件的功能,并且這功能是WordPress本身不具備的。類似插件可能包括圖庫管理插 件、數(shù)據(jù)庫管理插件以及會(huì)議管理插件等。 在自定義管理菜單插件的幫助下,用戶可以自己決定插件是否出現(xiàn)在頂級(jí)菜單選項(xiàng)中——插件開發(fā)人員需要向用戶表明自己所開發(fā)的插件可以進(jìn)行此類設(shè)置,尤其是那些決定創(chuàng)建頂級(jí)菜單項(xiàng)的開發(fā)人員。 管理菜單相關(guān)函數(shù) 決定好在什么位置添加管理菜單/子菜單后,接著就應(yīng)該讓W(xué)ordPress知道新頁面的存在了。我們會(huì)在'admin_menu' 動(dòng)作函數(shù)(見本段最后部分的示例)中完成通知過程。 頂級(jí)菜單出于某些原因,我們可能會(huì)決定讓自己開發(fā)的插件使用一個(gè)新的頂級(jí)菜單。首先我們要?jiǎng)?chuàng)建菜單,否則插件會(huì)自動(dòng)轉(zhuǎn)入子菜單中。 我們需要用add_menu_page函數(shù)來添加新的頂級(jí)菜單: add_menu_page(page_title, menu_title, access_level/capability, file, [function], [icon_url]); 參數(shù)值: page_title 激活菜單后,出現(xiàn)在頁面上的HTML頁面標(biāo)題 menu_title (顯示在屏幕上的)菜單名 access_level/capability (顯示并使用該菜單頁所需要的)最低用戶級(jí)別或權(quán)限 file PHP文件,處理菜單頁所顯示的內(nèi)容 function 為菜單頁顯示頁面內(nèi)容的函數(shù) 從技術(shù)層面上來說,function參數(shù)是可選的,但如果不采用該參數(shù),WordPress會(huì)認(rèn)為包含PHP文件就可以生成管理頁面,于是不再調(diào)用函數(shù)。大多數(shù)插件開發(fā)人員都會(huì)將生成頁面的代碼放在主插件文件的函數(shù)中。 icon_url 該參數(shù)僅用于WordPress 2.7。參數(shù)在菜單中加入一個(gè)自定義圖標(biāo)。 子菜單對(duì)頂級(jí)菜單定義完畢或決定使用某個(gè)已有的WordPress頂級(jí)菜單后,我們用 add_submenu_page函數(shù)來定義子菜單頁面。添加頁面時(shí),請(qǐng)按照自己希望的頁面顯示順序進(jìn)行添加。 add_submenu_page(parent, page_title, menu_title, access_level/capability, file, [function]); 參數(shù)值: parent 核心WordPress管理文件的文件名,該文件為我們提供所有頂級(jí)菜單,我們可以在頂級(jí)菜單中加入我們的子菜單,也可以在自定義頂級(jí)菜單的子菜單下加入插件文件。 常用示例:
page_title 激活子菜單后,出現(xiàn)在頁面上的HTML頁面標(biāo)題 menu_title (顯示在屏幕上的)子菜單名 access_level/capability (顯示并使用該子菜單頁所需要的)最低用戶級(jí)別或權(quán)限 file 對(duì)現(xiàn)有的WordPress菜單來說,file參數(shù)值為:處理菜單頁所顯示的內(nèi)容的PHP文件。對(duì)自定義的頂級(jí)菜單的子菜單來說,file參數(shù)值為:該子菜單頁的唯一標(biāo)識(shí)符。 若某插件創(chuàng)建出屬于自己的頂級(jí)菜單,正常情況下其首個(gè)子菜單的鏈接標(biāo)題與頂級(jí)菜單相同。因此我們設(shè)置首個(gè)子菜單鏈接標(biāo)題時(shí)只需要復(fù)制頂級(jí)菜 單的鏈接。parent參數(shù)和file參數(shù)首次被賦予相同值時(shí),我們可以通過調(diào)用add_submenu_page函數(shù)來避免復(fù)制鏈接標(biāo)題。 function 為菜單頁顯示頁面內(nèi)容的函數(shù) 從技術(shù)層面上來說,在add_menu_page函數(shù)中,function參數(shù)是可選的。但如果不采用該參數(shù),WordPress會(huì)認(rèn)為包含PHP文件就可以生成管理頁面,于是不再調(diào)用函數(shù)。大多數(shù)插件開發(fā)人員都會(huì)將生成頁面的代碼放在主插件文件的函數(shù)中。 下面的例子向我們展示了在子菜單頁標(biāo)題異于頂級(jí)菜單頁時(shí),如何插入頂級(jí)菜單頁和子菜單頁。在這個(gè)例子中,用以顯示第一個(gè)子菜單頁的函數(shù)是'my_magic_function': add_menu_page('Page title', 'Top-level menu title', 8, __FILE__, 'my_magic_function');
add_submenu_page(__FILE__, 'Page title', 'Sub-menu title', 8, __FILE__, 'my_magic_function');
大多數(shù)子菜單都會(huì)進(jìn)入WordPress的設(shè)置、管理、外觀菜單,因此WordPress專門給出三個(gè)包裝器函數(shù),簡化這些菜單頁添加子菜單的過程: 用于“設(shè)置”頂級(jí)菜單 add_options_page(page_title, menu_title, access_level/capability, file, [function]); 用于“管理”菜單 add_management_page(page_title, menu_title, access_level/capability, file, [function]); 用于“外觀”菜單 add_theme_page( page_title, menu_title, access_level/capability, file, [function]); 插入頁面下面是一個(gè)能將新菜單項(xiàng)插入不同位置的WordPress插件示例: <?php /* Plugin Name: Menu Test Plugin URI: http:// Description: Menu Test Author: Nobody Author URI: http:// */ // Hook for adding admin menus add_action('admin_menu', 'mt_add_pages'); // action function for above hook function mt_add_pages() { // Add a new submenu under Options: add_options_page('Test Options', 'Test Options', 8, 'testoptions', 'mt_options_page'); // Add a new submenu under Manage:
add_management_page('Test Manage', 'Test Manage', 8, 'testmanage', 'mt_manage_page');
// Add a new top-level menu (ill-advised):
add_menu_page('Test Toplevel', 'Test Toplevel', 8, __FILE__, 'mt_toplevel_page');
// Add a submenu to the custom top-level menu: add_submenu_page(__FILE__, 'Test Sublevel', 'Test Sublevel', 8, 'sub-page', 'mt_sublevel_page'); // Add a second submenu to the custom top-level menu:
add_submenu_page(__FILE__, 'Test Sublevel 2', 'Test Sublevel 2', 8, 'sub-page2', 'mt_sublevel_page2');
}
// mt_options_page() displays the page content for the Test Options submenu
function mt_options_page() {
echo "< h2>Test Options</h2>";
}
// mt_manage_page() displays the page content for the Test Manage submenu
function mt_manage_page() {
echo "< h2>Test Manage</h2>";
}
// mt_toplevel_page() displays the page content for the custom Test Toplevel menu
function mt_toplevel_page() {
echo "< h2>Test Toplevel</h2>";
}
// mt_sublevel_page() displays the page content for the first submenu
// of the custom Test Toplevel menu
function mt_sublevel_page() {
echo "< h2>Test Sublevel</h2>";
}
// mt_sublevel_page2() displays the page content for the second submenu
// of the custom Test Toplevel menu
function mt_sublevel_page2() {
echo "< h2>Test Sublevel 2</h2>";
}
?>
菜單頁面樣例上面的例子中含有幾個(gè)虛構(gòu)函數(shù),例如mt_options_page等,這些虛構(gòu)函數(shù)可以作為實(shí)際頁面內(nèi)容的占位符。我們要將這些占位符轉(zhuǎn)換為真正 的菜單頁面。首先假設(shè)插件有一個(gè)名為mt_favorite_food的選項(xiàng),然后讓網(wǎng)站主人在插件的設(shè)置頁面中輸入自己最喜歡的食物。 mt_options_page函數(shù)需要在界面上輸入一張數(shù)據(jù)輸入表才能激活mt_favorite_food并處理輸入的數(shù)據(jù)。下面有一個(gè)函數(shù)可以幫助 mt_options_page完成以上任務(wù): // mt_options_page() displays the page content for the Test Options submenu
function mt_options_page() {
// variables for the field and option names
$opt_name = 'mt_favorite_food';
$hidden_field_name = 'mt_submit_hidden';
$data_field_name = 'mt_favorite_food';
// 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( $_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 an options updated message on the screen
?>
< div class="updated"><?php _e('Options saved.', 'mt_trans_domain' ); ?> </div><?php
}
// Now display the options editing screen
echo '< div class="wrap">';
// header
echo "< h2>" . __( 'Menu Test Plugin Options', 'mt_trans_domain' ) . "</h2>";
// options form
?>
< form name="form1" method="post" action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>">
<input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y">
< p><?php _e("Favorite Color:", 'mt_trans_domain' ); ?>
<input type="text" name="<?php echo $data_field_name; ?>" value="<?php echo $opt_val; ?>" size="20">
</p>< hr />
< p class="submit">
<input type="submit" name="Submit" value="<?php _e('Update Options', 'mt_trans_domain' ) ?>" />
</p>
</form>
</div>
<?php
注意事項(xiàng):
|
|
|