說明:本教程僅限學習,高手請繞道
開發程序:WordPress 3.9-RC1
使用主題:Twenty Fourteen
在開始之前,需要注意三件事情
I、給插件取一個個性化的名字,越個性化越好,以防和其他插件重名沖突。
II、代碼里面,一定要包含注釋,不為自己,也要為想修改你代碼的別人想想。
III、盡量用最新版的 WordPress 進行開發和測試。
插件名稱和插件結構
一般來說,都是在 wp-content\plugins 目錄下建立一個文件夾,文件夾名就是插件的名稱,我們插件名字為"copyright_plugin",文件結構如下。
\wp-content\plugins\copyright_plugin下有copyright_plugin.php和readme.txt
這里的 readme.txt 文件中包含了一些插件的介紹,使用說明等信息,主要是提交到 WordPress 官方網站時候用到的,可以參考他們給的模板 http://wordpress.org/extend/plugins/about/readme.txt,另外還有插件截圖預覽的功能,需要另外添加圖片,但是我們現在是練習,不需要提交到官網,所以暫時先不涉及這些。
插件的核心
總的來說,插件的核心是兩個 function,用來添加 Hooks(中文譯為鈎子)
add_action ($hookname, $callbackfunction)
add_filter ($hookname,$callbackfunction)
這兩個方法相當重要,幾乎所有的插件都要用到他們。
Actions,我理解就是 wordpress 核心代碼預留的一些特殊的切入點,或者說是在執行一些特定事件時候發生,例如文章發布時,或者訪客留言時觸發。
Filters,應該就是 wordpress 執行時,對數據傳輸過程的一種過濾機制,例如當文章保存到數據庫的過程,或者文章從事數據庫中取出,展現到瀏覽器中的這個過程。
我們今天要制作的插件,應該是用 Filters,因為我們要在文章顯示在瀏覽器之前,在最后面加上一段字符竄,用來顯示版權信息,后面添加菜單項的時候,也要用到 Actions。
插件概要信息
用文本編輯器打開 copyright-plugin.php 文件,輸入如下信息:
<?php /* Plugin Name: Copyright plugin Plugin URI: http://www.xxxx.com/plugins/ Description: 此插件將在文章正文最下面,顯示一行版權信息 Version: 1.0.0 Author: xcxc Author URI: http://www.xxxx.com/ License: GPL */ ?>
保存好文件,然后登錄 WordPress 后台,打開插件菜單,應該就可以看到這個插件,已經顯示在插件列表里面了,並且可以啟用這個插件試試,不過沒有任何效果,因為到目前為止,這個插件還沒有實現任何功能。
為插件實現功能
修改copyright_plugin.php
<?php /* Plugin Name: Copyright plugin Plugin URI: http://www.xxxx.com/plugins/ Description: 此插件將在文章正文最下面,顯示一行版權信息 Version: 1.0.0 Author: xcxc Author URI: http://www.xxxx.com/ License: GPL */ /* 此插件將在文章正文最下面,顯示一行版權信息 */ function display_copyright() { return "<p style='color:red'>本站點所有文章均為原創,轉載請注明出處!</p>"; } ?>
保存好這個文件,然后打開正在用的主題文件夾,打開index.php 文件夾,找到 get_template_part( 'content', get_post_format() ); 並在下面添加如下代碼
if(function_exists('display_copyright')) { echo display_copyright(); }
function_exists 是判斷 display_copyright 函數是否存在,因為當插件停用的時候,主題代碼里面是找不到這個函數的,所以要判斷一下,防止出錯。
然后在 wordpress 后台啟用該插件,再打開首頁看看效果吧!
至此,這段代碼,應該可以勉強算是一個插件了。之所以說勉強,是因為這個插件存在一個問題,需要手工去修改主題代碼,如果用戶換了主題的話,需要在新主題里面再次修改代碼,這個不好。
改良插件
還記得我們前面說過的 Hooks (鈎子)嗎,我們要開始用 Filter 鈎子了!
代碼修改copyright_plugin.php如下:
<?php /* Plugin Name: Copyright plugin Plugin URI: http://www.xxxx.com/plugins/ Description: 此插件將在文章正文最下面,顯示一行版權信息 Version: 1.0.0 Author: xcxc Author URI: http://www.xxxx.com/ License: GPL */ add_filter( 'the_content', 'display_copyright' ); /* 這個函數在日志正文結尾處添加一段版權信息,並且只在 首頁 頁面才添加 */ function display_copyright( $content ) { if( is_home() ) $content = $content . "<p style='color:red'>本站點所有文章均為原創,轉載請指明出處!</p>"; return $content; } ?>
參看以上代碼,其中 the_content 是鈎子的名字,display_copyright 是回調函數名稱。這樣一來,只要啟用插件就可以實現功能,無需去修改主題了,請把剛才在index.php 文件中添加的代碼刪掉,然后啟用插件,看看效果吧,顯示效果應該是一樣的,無論怎么換主題,還是會自動顯示版權信息。
is_home是判斷是不是主頁
更進一步
至此一個真正的插件算是完成了。但是此插件將版權信息直接寫在代碼里,如果用戶想自定義版權信息的話,需要修改插件的源代碼,仍然不方便,所以此插件仍需改進。其實,我們可以在 WordPress 后台中為插件單獨添加一個菜單和頁面,用戶可以在這里來自定義設置設置版權信息,信息可以保存在數據庫里面。
先附上完整代碼,后面會做說明
<?php /* Plugin Name: Copyright plugin Plugin URI: http://www.xxxx.com/plugins/ Description: 此插件將在文章正文最下面,顯示一行版權信息 Version: 1.0.0 Author: xcxc Author URI: http://www.xxxx.com/ License: GPL */ /* 注冊激活插件時要調用的函數 */ register_activation_hook( __FILE__, 'display_copyright_install'); /* 注冊停用插件時要調用的函數 */ register_deactivation_hook( __FILE__, 'display_copyright_remove' ); function display_copyright_install() { /* 在數據庫的 wp_options 表中添加一條記錄,第二個參數為默認值 */ add_option("display_copyright_text", "<p style='color:red'>本站點所有文章均為原創,轉載請注明出處!</p>", '', 'yes'); } function display_copyright_remove() { /* 刪除 wp_options 表中的對應記錄 */ delete_option('display_copyright_text'); } if( is_admin() ) { /* 利用 admin_menu 鈎子,添加菜單 */ add_action('admin_menu', 'display_copyright_menu'); } function display_copyright_menu() { /* add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); */ /* 頁名稱,菜單名稱,訪問級別,菜單別名,點擊該菜單時的回調函數(用以顯示設置頁面) */ add_options_page('Set Copyright', 'Copyright Menu', 'administrator','display_copyright', 'display_copyright_html_page'); } function display_copyright_html_page() { ?> <div> <h2>Set Copyright</h2> <form method="post" action="options.php"> <?php /* 下面這行代碼用來保存表單中內容到數據庫 */ ?> <?php wp_nonce_field('update-options'); ?> <p> <textarea name="display_copyright_text" id="display_copyright_text" cols="40" rows="6"><?php echo get_option('display_copyright_text'); ?></textarea> </p> <p> <input type="hidden" name="action" value="update" /> <input type="hidden" name="page_options" value="display_copyright_text" /> <input type="submit" value="Save" class="button-primary" /> </p> </form> </div> <?php } add_filter( 'the_content', 'display_copyright' ); /* 這個函數在日志正文結尾處添加一段版權信息,並且只在 首頁 頁面才添加 */ function display_copyright( $content ) { if( is_home() ) $content = $content . get_option('display_copyright_text'); return $content; } ?>
說明:
以下代碼自己要是在啟用插件時和停用插件時調用,注釋中已經寫得很詳細了。
/* 注冊激活插件時要調用的函數 */ register_activation_hook( __FILE__, 'display_copyright_install'); /* 注冊停用插件時要調用的函數 */ register_deactivation_hook( __FILE__, 'display_copyright_remove' ); function display_copyright_install() { /* 在數據庫的 wp_options 表中添加一條記錄,第二個參數為默認值 */ add_option("display_copyright_text", "<p style='color:red'>本站點所有文章均為原創,轉載請注明出處!</p>", '', 'yes'); } function display_copyright_remove() { /* 刪除 wp_options 表中的對應記錄 */ delete_option('display_copyright_text'); }
添加菜單和頁面的代碼如下:
if( is_admin() ) { /* 利用 admin_menu 鈎子,添加菜單 */ add_action('admin_menu', 'display_copyright_menu'); } function display_copyright_menu() { /* add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); */ /* 頁名稱,菜單名稱,訪問級別,菜單別名,點擊該菜單時的回調函數(用以顯示設置頁面) */ add_options_page('Set Copyright', 'Copyright Menu', 'administrator','display_copyright', 'display_copyright_html_page'); }
至此,已經可以在后台看到菜單項了,但是點擊的話,還會出錯,因為還沒有添加對應的頁面(如何自定義添加后台菜單位置)
下面開始添加頁面,主要代碼如下:
function display_copyright_html_page() { ?> <div> <h2>Set Copyright</h2> <form method="post" action="options.php"> <?php /* 下面這行代碼用來保存表單中內容到數據庫 */ ?> <?php wp_nonce_field('update-options'); ?> <p> <textarea name="display_copyright_text" id="display_copyright_text" cols="40" rows="6"><?php echo get_option('display_copyright_text'); ?></textarea> </p> <p> <input type="hidden" name="action" value="update" /> <input type="hidden" name="page_options" value="display_copyright_text" /> <input type="submit" value="Save" class="button-primary" /> </p> </form> </div> <?php }
現在再去點擊剛才新加的菜單,可以顯示出來一個頁面了,我們可以在這里設置版權信息文本。
另外還有如下代碼要修改
/* 這個函數在日志正文結尾處添加一段版權信息,並且只在 首頁 頁面才添加 */ function display_copyright( $content ) { if( is_home() ) $content = $content . get_option('display_copyright_text'); return $content; }
將原來的靜態化文本,改成動態的,之所以要這么改,是因為我們已經將數據存到數據庫里面了,這里要從數據庫里面取出數據。