怎樣開發一個 WordPress 插件

WordPress 並非僅僅是一個簡單的博客平臺,同時也是一個功能極其強大並且有着無限擴展能力的 CMS 平臺。現在不管是在國內還是國外,WordPress 都有着龐大的用戶數量,而且這等用戶數量也是其它博客平臺難以匹敵的,一直以來也都有着數量巨大的 WordPress 愛好者爲其開發主題和插件,藉助於這些主題和插件,你幾乎可以把 WordPress 配置成任何類型的站點。

我一直認爲開發插件不是一件容易的事情,我也一直很佩服那些開發插件的大牛們,感謝他們的無私奉獻。但是有時候,別人開發好的插件,並不一定完全適合每個人的需求,自己想去修改吧,又不敢動手。其實,只要我們能理解插件的工作機制,並且參考一下 WordPress 的官方文檔,再多藉助於搜索引擎,我們自己也能對那些插件進行一些修改,並且自己也可以開發出一些簡單的插件。今天這片文章就來了解一下插件的工作機制,並且嘗試寫一個插件。

作爲一個入門的練習,這個插件的功能將相當簡單,要實現的功能僅僅是在博客正文頁面的最底部加上一個段落,內容是版權聲明,例如:“本站點所有文章均爲原創,轉載請註明出處!”,相信大家都見過很多博文底部都有這樣的版權聲明吧,他們都是在寫文章的時候手工寫上去的嗎,肯定不是,而且很有可能是通過插件實現的。

在開始之前,需要注意三件事情

  1. 給插件取一個個性化的名字,越個性化越好,以防和其他插件重名衝突。
  2. 代碼裏面,一定要包含註釋,不爲自己,也要爲想修改你代碼的別人想想。
  3. 儘量用最新版的 WordPress 進行開發和測試。

插件名稱和插件相關 PHP 代碼文件

一般來說,都是在 wp-content/plugins 目錄下建立一個文件夾,文件夾的名字取插件的名字,我們插件名字爲 “Copyright plugin”,文件結構如下

插件的文件結構

插件的文件結構

這裏的 readme.txt 文件中包含了一些插件的介紹,使用說明等信息,主要是提交到 WordPress 官方網站時候用到的,可以參考他們給的模板 http://wordpress.org/extend/plugins/about/readme.txt,另外還有插件截圖預覽的功能,需要另外添加圖片,但是我們現在是練習,不需要提交到官網,所以暫時先不涉及這些。

插件的核心

總的來說,插件的核心是兩個 function,用來添加 Hooks(中文譯爲鉤子)

  • add_action ($hookname, $callbackfunction)
  • add_filter ($hookname,$callbackfunction)

這兩個方法相當重要,幾乎所有的插件都要用到他們。

  • Actions,我理解就是 wordpress 核心代碼預留的一些特殊的切入點,或者說是在執行一些特定事件時候發生,例如文章發佈時,或者訪客留言時觸發。想情參見 Action Reference
  • Filters,應該就是 wordpress 執行時,對數據傳輸過程的一種過濾機制,例如當文章保存到數據庫的過程,或者文章從事數據庫中取出,展現到瀏覽器中的這個過程。詳情參見 Filter Reference

我們今天要製作的插件,應該是用 Filters,因爲我們要在文章顯示在瀏覽器之前,在最後面加上一段字符竄,用來顯示版權信息,後面添加菜單項的時候,也要用到 Actions。

插件概要信息

用文本編輯器打開 copyright-plugin.php 文件,輸入如下信息:

<?php
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.akasuna.com/plugins/
Description: 此插件將在文章正文最下面,顯示一行版權信息
Version: 1.0
Author: akasuna
Author URI: http://www.akasuna.com/
License: GPL
*/
?>

保存好文件,然後登錄 WordPress 後臺,打開插件菜單,應該就可以看到這個插件,已經顯示在插件列表裏面了,並且可以啓用這個插件試試,不過沒有任何效果,因爲到目前爲止,這個插件還沒有實現任何功能。

爲插件實現功能

<?php
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.akasuna.com/plugins/
Description: 插件將在文章正文最下面,顯示一行版權信息
Version: 1.0
Author: akasuna
Author URI: http://www.akasuna.com/
License: GPL
*/

/* 此插件將在文章正文最下面,顯示一行版權信息 */
function display_copyright() {
	return "<p style='color:red'>本站點所有文章均爲原創,轉載請註明出處!</p>";
}
?>

保存好這個文件,然後打開正在用的主題文件夾,打開 single.php 文件夾,找到 <?php the_content(); ?> 並在下面添加如下代碼

<?php
if(function_exists('display_copyright')) {
	echo display_copyright();
}
?>

function_exists 是判斷 display_copyright 函數是否存在,因爲當插件停用的時候,主題代碼裏面是找不到這個函數的,所以要判斷一下,防止出錯。

然後啓用在 wordpress 後臺啓用該插件,再打開博客日誌正文看看效果吧!

插件顯示效果

插件顯示效果

至此,這段代碼,應該可以勉強算是一個插件了。之所以說勉強,是因爲這個插件存在一個問題,需要手工去修改主題代碼,如果用戶換了主題的話,需要在新主題裏面再次修改代碼,這個不好。

改良插件

還記得我們前面說過的 Hooks (鉤子)嗎,我們要開始用 Filter 鉤子了!

代碼修改如下:

<?php
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.akasuna.com/plugins/
Description: 此插件將在文章正文最下面,顯示一行版權信息
Version: 1.0
Author: akasuna
Author URI: http://www.akasuna.com/
License: GPL
*/

add_filter( 'the_content',  'display_copyright' );

/* 這個函數在日誌正文結尾處添加一段版權信息,並且只在 single 頁面才添加 */
function display_copyright( $content ) {
	if( is_single() )
		$content = $content . "<p style='color:red'>本站點所有文章均爲原創,轉載請指明出處!</p>";

	return $content;
}

?>

參看以上代碼,其中 the_content 是鉤子的名字,display_copyright 是回調函數名稱。這樣一來,只要啓用插件就可以實現功能,無需去修改主題了,請把剛纔在 single.php 文件中添加的代碼刪掉,然後啓用插件,看看效果吧,顯示效果應該是一樣的,無論怎麼換主題,還是會自動顯示版權信息。

更進一步

至此一個真正的插件算是完成了。但是此插件將版權信息直接寫在代碼裏,如果用戶想自定義版權信息的話,需要修改插件的源代碼,仍然不方便,所以此插件仍需改進。其實,我們可以在 WordPress 後臺中爲插件單獨添加一個菜單和頁面,用戶可以在這裏來自定義設置設置版權信息,信息可以保存在數據庫裏面。

<?php
/* 註冊激活插件時要調用的函數 */
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');
}
?>

以上代碼自己要是在啓用插件時和停用插件時調用,註釋中已經寫得很詳細了。

添加菜單和頁面的代碼如下:

<?php
/* 判斷是否在 WordPress 後臺 */
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('版權設置頁面', '版權設置菜單', 'administrator','display_copyright', 'display_copyright_html_page');
}
?>

至此,已經可以在後臺看到菜單項了,但是點擊的話,還會出錯,因爲還沒有添加對應的頁面

下面開始添加頁面,主要代碼如下:

<?php
function display_copyright_html_page() {
?>
	<div>
		<h2>版權信息設置</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>
				<?php /* 下面這兩個隱藏字段爲必須,其中第二個字段的值爲要修改的字段名 */ ?>
				<input type="hidden" name="action" value="update" />
				<input type="hidden" name="page_options" value="display_copyright_text" />

				<input type="submit" value="保存設置" class="button-primary" />
			</p>
		</form>
	</div>
<?php
}
?>

現在再去點擊剛纔新加的菜單,可以顯示出來一個頁面了,我們可以在這裏設置版權信息文本。

插件設置頁面

插件設置頁面

另外還有如下代碼要修改

/* 這個函數在日誌正文結尾處添加一段版權信息,並且只在 single 頁添加 */
function display_copyright( $content ) {
	if( is_single() )
		$content = $content . get_option('display_copyright_text');

	return $content;
}

將原來的靜態化文本,改成動態的,之所以要這麼改,是因爲我們已經將數據存到數據庫裏面了,這裏要從數據庫裏面取出數據。

最後附上完整的代碼

<?php
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.akasuna.com/plugins/
Description: 此插件將在文章正文最下面,顯示一行版權信息
Version: 1.0
Author: akasuna
Author URI: http://www.akasuna.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('版權設置頁面', '版權設置菜單', 'administrator','display_copyright', 'display_copyright_html_page');
}

function display_copyright_html_page() {
?>
	<div>
		<h2>版權信息設置</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="保存設置" class="button-primary" />
			</p>
		</form>
	</div>
<?php
}

add_filter( 'the_content',  'display_copyright' );

/* 這個函數在日誌正文結尾處添加一段版權信息,並且只在 single 頁添加 */
function display_copyright( $content ) {
	if( is_single() )
		$content = $content . get_option('display_copyright_text');

	return $content;
}
?>

文章出處:http://www.akasuna.com/2010/10/20/how-to-develop-a-plug-in/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章