<?php/*本文章是在網上搜尋其他關於wordpress建立外掛程式文章並親自實踐總結而來的代碼。參考文章網址有 http://www.ashuwp.com/courses/level/optionpage 很好的教程,簡單易懂http://www.akasuna.com/2010/10/20/how-to-develop-a-plug-in/ 也是一篇不錯的文章在根目錄下 wp-content/plugins 建立存放建立外掛程式檔案夾 my_wp_pluginmy_wp_plugin 中建立 my_wp_plugin.php 檔案內容:*//*Plugin Name: 外掛程式名稱Plugin URI: 外掛程式介紹的網址,沒有就填部落格網址吧Description: 這裡填外掛程式的簡短介紹Version: 版本號碼Author: 作者名Author URI: 作者的網址*//*以上外掛程式資訊在my_wp_plugin.php中要用注釋括起來再在my_wp_plugin.php中建立方法*/function my_wp_plugins_first_fun($content) { //if (is_single ())//只在 single 頁才執行 $content .= "<p style='color:red'>這是我測試的第一個wp外掛程式!</p>"; return $content;}/*到使用的主題檔案中的任意頁,在想要顯示的位置輸入(這裡在content-page.php頁 <?php the_content(); ?> 代碼下面添加)*/if(function_exists('my_wp_plugins_first_fun')) {//判斷函數是否存在 echo my_wp_plugins_first_fun("測試用-");//可以直接使用外掛程式裡的方法}/*訪問網站剛才修改的頁即可看到想要顯示的結果至此,這段代碼,應該可以勉強算是一個外掛程式了但是外掛程式存在一個問題,需要手工去修改主題代碼,如果使用者換了主題的話,需要在新主題裡面再次修改代碼,這個不好。這時要開始用 Filter 鉤子了!總的來說,外掛程式的核心是兩個 function,用來添加 Hooks(中文譯為鉤子)add_action ($hookname, $callbackfunction)add_filter ($hookname,$callbackfunction)這兩個方法相當重要,幾乎所有的外掛程式都要用到他們。Actions,目前理解就是 wordpress 核心代碼預留的一些特殊的切入點,或者說是在執行一些特定事件時候發生,例如文章發布時,或者訪客留言時觸發。Filters,應該就是 wordpress 執行時,對資料轉送過程的一種過濾機制,例如當文章儲存到資料庫的過程,或者文章從事資料庫中取出,展現到瀏覽器中的這個過程。今天要製作的外掛程式,應該是用 Filters,因為要在文章顯示在瀏覽器之前,在最後面加上一段字元竄,用來顯示著作權資訊,後面添加功能表項目的時候,也要用到 Actions。改良外掛程式再在my_wp_plugin.php中添加如下代碼*/add_filter ( 'the_content', 'my_wp_plugins_first_fun' );/*the_content 是鉤子的名字,my_wp_plugins_first_fun 是回呼函數名稱。這樣一來,只要啟用外掛程式就可以實現功能,無需去修改主題了可以把剛才主題檔案中添加的代碼刪掉,然後啟用外掛程式,再查看該頁,顯示效果應該是一樣的,無論怎麼換主題,還是會自動顯示my_wp_plugins_first_fun方法裡的資訊。至此一個真正的外掛程式算是完成了,但是此外掛程式將著作權資訊直接寫在代碼裡,可以在 WordPress 後台中為外掛程式單獨添加一個菜單和頁面,資訊可以儲存在資料庫裡面。繼續在my_wp_plugin.php中添加如下代碼*/register_activation_hook(__FILE__,'my_wp_plugins_install');/* 註冊啟用外掛程式時要調用的函數 */register_deactivation_hook( __FILE__, 'my_wp_plugins_remove' );/* 註冊停用外掛程式時要調用的函數 */function my_wp_plugins_install() { /* 在資料庫的 wp_options 表中添加一條記錄,第二個參數為儲存的值 */ add_option("my_wp_plugins_text" , "<p style='color:red'>這是我測試的第一個wp外掛程式!</p>" , '', 'yes');}function my_wp_plugins_remove() { delete_option('my_wp_plugins_text');/* 刪除 wp_options 表中的對應記錄 */}/*add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' )string $option 必填,要存到wp_options表option_name欄位的值,相當於鍵名mixed $value 選填,要存到wp_options表option_value欄位的值,相當於索引值mixed $deprecated 選填,不再使用bool $autoload 選填,預設為啟用。要存到wp_options表autoload欄位的值,WordPress的啟動時是否載入選項。接著在my_wp_plugin.php中添加如下代碼*/if( is_admin() ) {//判斷是否在 WordPress 後台 add_action('admin_menu', 'my_wp_plugins_menu');//添加菜單}function my_wp_plugins_menu() { add_options_page('資訊設定頁面', '設定功能表標題', 'administrator','my_wp_plugins', 'plugins_option_menu');//在設定欄下添加菜單,與add_submenu_page添加效果相同,只是wordpress提供的方便形式 add_theme_page( 'title標題' , '外觀功能表標題' , 'administrator' , 'my_wp_plugins_theme' , 'plugins_theme_menu');//在外觀欄下添加菜單 add_menu_page( 'title標題' , '頂級功能表標題' , 'administrator' , 'my_wp_plugins_top' , 'plugins_top_menu' , '' , 6 );//添加頂級菜單 add_submenu_page( 'my_wp_plugins_top' , 'title標題' , '子功能表標題' , 'administrator' , 'my_wp_plugins_child' , 'plugins_child_menu' );//添加子功能表}/*add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function);$page_title 頁面的title資訊$menu_title 菜單名稱$capability 訪問這個頁面需要的許可權$menu_slug 菜單別名 需要獨一無二$function 點擊該菜單時的回呼函數(用以顯示設定頁面)add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function); $page_title 頁面的title資訊$menu_title 菜單名稱$capability 訪問這個頁面需要的許可權$menu_slug 菜單別名 需要獨一無二$function 點擊該菜單時的回呼函數(用以顯示設定頁面)add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); $page_title 頁面的title資訊$menu_title 菜單名稱$capability 訪問這個頁面需要的許可權$menu_slug 菜單別名 需要獨一無二$function 點擊該菜單時的回呼函數(用以顯示設定頁面)$icon_url 菜單表徵圖url地址$position 此功能表項目在菜單中的位置,警告:如果兩個功能表項目的位置屬性相同,其中一個可能要被覆蓋上面函數的position參數,預設的功能表項目位置屬性如下:2 Dashboard4 Separator5 Posts10 Media15 Links20 Pages25 Comments59 Separator60 Appearance65 Plugins70 Users75 Tools80 Settings99 Separatoradd_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function ); $parent_slug 父級功能表項目的別名$page_title 頁面的title資訊$menu_title 菜單名稱$capability 訪問這個頁面需要的許可權$menu_slug 菜單別名 需要獨一無二$function 點擊該菜單時的回呼函數(用以顯示設定頁面)wordpress對於function參數,這個參數一般是函數名,要調用類的方法,使用 array(類名,函數名) 這樣的形式調用。如果這個參數為空白的話,menu_slug參數可以是一個檔案路徑。basename(__FILE__) 返回當前檔案完整名稱至此,已經可以在後台看到功能表項目了,但是點擊的話,還會出錯,因為還沒有添加回呼函數指向頁面繼續在my_wp_plugin.php中添加如下代碼*/function plugins_option_menu() {//如果要儲存wp_options表值,以下寫法固定?><div> <h2>資訊設定</h2> <form method="post" action="options.php"> <?php wp_nonce_field('update-options'); //用來輸出提交向options.php頁時的驗證資料?> <p> <textarea name="my_wp_plugins_text"><?php echo get_option('my_wp_plugins_text'); ?></textarea> </p> <p> <textarea name="my_wp_plugins_text2"><?php echo get_option('my_wp_plugins_text2'); ?></textarea> </p> <p> <input type="hidden" name="action" value="update" /> <!-- 要存的form控制項名 = 此處的value值 = wp_options表option_name欄位值。多個form控制項名在value值中用 , 分開--> <input type="hidden" name="page_options" value="my_wp_plugins_text,my_wp_plugins_text2" /> <input type="submit" name="submit" value="儲存設定" class="button-primary" /> </p> </form></div><?php}//要啟用wordpress內建上傳需要引用wordpress內建的JS和CSS//載入上傳圖片的js(wp內建)wp_enqueue_script('thickbox');//載入css(wp內建)wp_enqueue_style('thickbox');//載入jquery,get_bloginfo( 'stylesheet_directory' ) 返回當前網站使用主題所在檔案夾完整路徑wp_enqueue_script('my-upload', get_bloginfo( 'stylesheet_directory' ) . '/js/jquery-1.8.2.js');function plugins_theme_menu(){?><form method="post" enctype="multipart/form-data" action=""> <div> <h2>wordpress內建上傳</h2> <p> <label> <input type="text" name="img_url_txt" id="img_url_txt" value="<?php echo get_option('img_url'); ?>" size="80"/> <input type="button" name="upload_but" id="upload_but" value="上傳"/> </label> </p> <p> <input type="submit" name="submit" value="儲存設定" /> </p> </div></form><script type="text/javascript">$("#upload_but").click(function(){ //點擊按鈕,開啟wordpress內建上傳工具 tb_show('', 'media-upload.php?type=image&TB_iframe=true');})window.send_to_editor = function(html) { img_url = $('img',html).attr('src'); //將上傳後的圖片完整路徑賦給text框以儲存到資料庫中 $("#img_url_txt").val(img_url); tb_remove();}</script><?php}function plugins_top_menu(){ echo '<h1>這是頂級菜單頁面</h1>';}function plugins_child_menu() { echo '<h3>這是子功能表頁面</h3>';}/*也可以使用update_option函數來自己手動更新wp_options表資料。此時提交表單中不需要把提交地址指向wp-admin/options.php(這裡假使地址指向當前頁),就不需要寫wp_nonce_field來驗證也不需要寫action,page_options兩個隱藏控制項*/if($_POST['submit']){ if($_POST['my_wp_plugins_text']) update_option( "my_wp_plugins_text", $_POST['my_wp_plugins_text'] ); //update_option( "my_wp_plugins_text", array('ok'=>'yes!') );也可存數組,同樣取出時取出的也是數組 if($_POST['my_wp_plugins_text2']) update_option( "my_wp_plugins_text2", $_POST['my_wp_plugins_text2'] ); if($_POST['img_url_txt']) update_option( "img_url", $_POST['img_url_txt'] );}/*update_option( $option, $newvalue )$option 要更新wp_options表option_name欄位的值,相當於鍵名$newvalue 要更新wp_options表option_value欄位的值,相當於索引值原my_wp_plugins_first_fun函數中 $content 變數值即可改成 $content .= get_option('my_wp_plugins_text'); 從資料庫中擷取值外掛程式中也可直接使用PHP的資料庫操作函數*/$que_str = mysql_query("select * from wp_options limit 1");$row_op = mysql_fetch_array($que_str);echo $row_op['option_name'];?>