首先,你要在wp-content/plugins/下建立一個文件夾,文件夾的名字最好只由字母、數字、“-”和下滑組成。同時,還要在這個文件夾下建立一個同名的php文件。比如你的文件夾名字為my-plugin,則php的名字就是my-plugin.php,這個文件做為你plugin的主文件,像主題文件的sytle.css文件一樣,它的頭部包含了對這個插件的描述信息。下面是一個簡單的例子:
代碼如下:
< ?php
/*
Plugin Name: 插件名稱
Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
Description: 插件的簡單描述
Version: 插件版本號, 例如: 1.0
Author: 插件作者
Author URI: http://URI_Of_The_Plugin_Author作者地址
*/
?>
另外如果你想要把你的插件提交到wordpress.org上,你還要在文件夾中添加一個readme.txt文件。就像主題中的style.css文件一樣。類似的,readme.txt的頭部包含了對這個插件的基本描述信息。關于readme.txt的格式,可以參考WordPress的官方示例。因為這里只是簡單的寫一個可用的Plugin,就不介紹reaadme.txt了。
WordPress的插件其實就是一堆php的方法。這些方法通過調用系統自帶的鉤子來為博客增加新的功能。下面我們就來看一下什么是系統的鉤子。
插件鉤子
WordPress定義了很多不同用途的鉤子,在Wordpress運行的不同階段,它會檢測當前階段是否注冊了鉤子函數,如果有,則優先執行這些函數。添加filter的方法如下:
代碼如下:
add_fitler的四個參數分別是:要掛載的鉤子的名稱,鉤子的回調函數,回調函數的優先級,回調函數的參數個數。一個例子如下:
代碼如下:
add_fitler('the_title', 'my_title', 10, 2);
function my_title($title, $id) {
return News:$title;
}
這個例子中,我們在the_title鉤子上掛載了一個my_title的函數,這個函數接受兩個參數,每別是文章的標題和ID,當Wordpress要把文章post給瀏覽器之前,會首先調用到這個函數,在這里,我們在每個文章的標題前加了一個“News:”。
關于Wordpress所提供的所有鉤子,可以參考Wordpress的官網文檔:Filter Reference。
另外你可能會在某些文章中看到令一個添加鉤子的函數add_action。我們來看一下wordpress的內核你或許就明白了:
代碼如下:
function add_action($tag, $function_to_add, $priority = 10, $accept_args = 1) {
return add_filter($tag, $function_to_add, $priority, $accept_args);
}
所以add_action和add_filter本質上沒有任何區別。
之前說過,Wordpress會在系統的不同階段調用不同的鉤子,其實,如果需要,你也可以在你的代碼里手動調用這些鉤子。方法如下:
代碼如下:
$return_values = apply_filtere('filter_name', $args ... );
有了這些filter,你就可以在wordpress處理流程中的任意地方修改數據內容,實現插件所需要的功能。
Option機制
僅僅有了filter還不夠,很多插件還需要保存一些信息,比方插件的屬性設置之類,這個時候你就要用到Wordpress的Option機制了。
WordPress的Option機制通過add_option,get_option, update_option三個函數來實現,三個函數的定義如下:
代碼如下:
add_option($name, $value, $deprecated, $autoload);
get_option($name);
update_option($option_name, $newvalue);
add_option有4個參數,功能分別如下:
$name:必選,變量名
$value:可選,變量值,默認為空字符
$deprecated:沒用的參數,純粹是歷史遺留問題。留著它只是為了兼容以有的插件。當然如果你要調用到后面的$autoload,你需要為它傳入一個空字符或null。
$autoload: “yes” or “no”,默認是”yes”,當設為”yes”時,該屬性會在wp_load_alloptions調用時獲取到。
get_option用來獲取你添加的參數,同時系統中已經默認定義了一些參數,你可以參考Wordpress的官方列表:Option Refernce。
而update_option則是用來更新option。
三個方法都比較好理解,我也不多說了。通過這三個方法你可以把你需要長久保存的數據放在數據庫中。
設置頁面
有了filter和option,我們已經完成了一個插件的核心工作。不過做為一個插件,它經常還需要為用戶提供一個設置頁面,也就是在Wordpress后臺插件列表中所看到的settings鏈接,如下圖:
settings
這里我們用一個最簡單的例子還說明如何添加一個設置頁面:
代碼如下:
<?php class wctest{
public function __construct(){
if(is_admin()){
add_action('admin_menu', array($this, 'add_plugin_page'));
add_action('admin_init', array($this, 'page_init'));
}
}
public function add_plugin_page(){
// This page will be under "Settings"
add_options_page('Settings Admin', 'Settings', 'manage_options', 'test-setting-admin', array($this, 'create_admin_page'));
}
public function create_admin_page(){
?>
<div>
< ?php screen_icon(); ?>
<h2>Settings</h2>
<form method=”post” action=”options.php”>
< ?php
// This prints out all hidden setting fields
settings_fields(‘test_option_group’);
do_settings_sections(‘test-setting-admin’);
?>
< ?php submit_button(); ?>
</form>
</div>
< ?php
}
public function page_init(){
register_setting(‘test_option_group’, ‘array_key’, array($this, ‘check_ID’));
add_settings_section(
‘setting_section_id’,
‘Setting’,
array($this, ‘print_section_info’),
‘test-setting-admin’
);
add_settings_field(
‘some_id’,
‘Some ID(Title)’,
array($this, ‘create_an_id_field’),
‘test-setting-admin’,
‘setting_section_id’
);
}
public function check_ID($input){
if(is_numeric($input['some_id'])){
$mid = $input['some_id'];
if(get_option(‘test_some_id’) === FALSE){
add_option(‘test_some_id’, $mid);
}else{
update_option(‘test_some_id’, $mid);
}
}else{
$mid = ”;
}
return $mid;
}
public function print_section_info(){
print ‘Enter your setting below:’;
}
public function create_an_id_field(){
?><input type=”text” id=”input_whatever_unique_id_I_want” name=”array_key[some_id]” value=”<?=get_option(‘test_some_id’);?/>” />< ?php
}
}
$wctest = new wctest();
上面創建的類會在你的Wordpress后臺添加一個新頁面,同時它允許用戶保存一個id值。
到這里,我們一個簡單的Wordpress插件就完成了。雖然這個插件本身沒有什么用途。謝謝大家。