現在Wordpress是世界上滿熱門的CMS,而他的外掛數量也是非常的海量,進到外掛的頁面中,包含的類型有非常多,包括銷售,安全或是信件等等的,這邊你能想像到的,只要實力夠就可以建構處自己的一把刀。
在開始前,我們先為我們即將出世的外掛命名,不過我們也要顧慮到命名是否合太常見,不然你可能跟其他人撞名,你可以在Wordpress 外掛列表這裡頭,找到是不是衝突了。
我們的檔案基本上怎麼寫,最好都是骨肉分離,不要將HTML、JS、CSS與PHP四種尬再一起,除了很噁之外,你除非是想要嚇嚇同事千萬別這麼做,第二點是盡可能將每個檔案都加入把你專屬代號(或是公司名稱)加入命名空間的前綴詞,你不回想看到宣告的問題就跑出fatal error,比如說要把很難用的is_admin()
給蓋掉,別錯過這個概念;Wordpress
的寫作原則提到:
推薦將你的函式命名為類別,並且把使用駝峰式(不過官網是寫蛇式),他應該會長得像下面的樣子
<?php
namespace GOGOPOWERRANGER\GGLA;
class Config{
function __construct(){ }
public function get_money(){ }
}
Namespace
主要是不要跟其他外掛起爭議,善用它別亂大聲,一次出錯就是八萬一,尤其是加進JS的一些檔案,你可能因為也是使用autoloader然後掛進其他外掛的海量函式庫,而在檔案命名也可以用同樣的概念,加入GOGOPOWERRANGER
來與其他的檔案做出差異,這些也可以在將專案production的時候,加入前綴與bundle來做到。
我們主要先簡單分出2個資料夾,分別是下列2個:
我們今天會加入一些啟動的檔案與刪除的檔案,按照著有邏輯的檔案架構,可以參考php fig是怎麼演繹的,裡面有關於AutoLoader
到CODING STYLES
的一些規範,接下來我們就開始編輯我們的第一個檔案吧
<?php
/**
* Plugin Name: GOGOPOWERRANGER
* Plugin URI: https://GOGOPOWERRANGER.com/plugins/the-basics/
* Description: Handle the basics with this plugin.
* Version: 1.10.3
* Requires at least: 5.2
* Requires PHP: 7.2
* Author: Rach Chen
* Author URI: https://author.GOGOPOWERRANGER.com/
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: GOGOPOWERRANGER
* Domain Path: /languages
*/
這個檔案會是加在我們最開始的創造的GOGOPOWERRANGER.php
,我們放在套件的根目錄並且與資料夾的名稱相同即可,而裡頭的每個含義我下面娓娓道來:
GPLv2
License的範圍太大,有興趣可以去看一下文本的內容,license,我們過來要了解我們的plugin會是放在/wp-content/plugins/GOGOPOWERRANGER
,你也可以藉著印出plugin_dir_path(__FILE__)
來看看外掛的位置是怎樣,我們的目的是將檔案引入就可以藉由著這個程式碼加入include plugin_dir_path(__FILE__)
,再匯入的時候也可以為了方便使用define( 'GOGOPOWERRANGER',plugin_dir_path(__FILE__)
,不過在include/require程式碼的時候,而plugin_dir_url()
與實際路徑也是有一樣的使用方式,不過如果你是傳入空的paras,他會回傳當下外掛安抓的目錄位置。
我們這邊使用的是原生提供的Hook,分別是啟動的register_activation_hook($file,$function)
以及結束的register_deactivation_hook
,此處我們分別為啟動與停用各加上了個別檔案/includes/Activation.php
與/includes/Deactivation.php
,並且將我們的類別加入進去。
/* Activation.php */
<?php
namespace GOGOPOWERRANGER;
class Activation {
public static function activate() {
// 在這執行你的開始程式碼
}
}
/* Deactivation.php */
<?php
namespace GOGOPOWERRANGER;
class Deactivation {
public static function deactivate() {
// 在此執行停用程式碼
}
}
在外掛啟用之前,專案中沒有一個函式是凌駕於active之前的,通常會將一次性的設定在這裏寫入,但不會去在這個hook就寫入DB,外掛的設定通常使用Sane Defaults
來做你任何設定,好的點會是在你的使用者確定要使用你的plugin,這時加入會是比較好的時機;而deactivation
老實說,我也沒有做過,因為我停用資料庫資料還是在那裡,其他都是動態執行而不會去影響,刪除表格的事情應該留到解除安裝是最恰當。
你現在或許會想,我直接停用就好,幹嘛刪除外掛,假設你已經有一年沒碰LOL了,而且你可能這幾年也不會想再去玩了,你這時應該是都會去Application去把英雄聯盟給刪除,套件也一樣,你在資料庫中留存著一堆你已經用不到的資料,刪除這些可以讓你的資料庫更整潔,但也是有些資料例外像是由使用者自己產生的內容,我們接下來就是增加/Uninstall.php
。
<?php
//這邊是非常重要,是不是因為點擊解除安裝而執行的,不然你等同於裝了一個自爆裝置
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
wp_die( sprintf(
__( '%s should only be called when uninstalling the plugin.', 'GOGOPOWERRANGER' ),
__FILE__
) );
exit;
}
// 在此執行解除安裝命令
不過這種容易被猜到的檔案名稱不建議使用,原生有提供Hook供大家使用,讓大家動得開心,離得安心,以下請參考register_uninstall_hook()
,而這個的使用方式也與其他人無異,而這個hook被呼叫的條件是,如果在套件的根目錄沒有搜尋到/Uninstall.php
則執行這個Hook,而且他是不需要檢查WP_UNINSTALL_PLUGIN
的,將各別都設定完後,最後我們加入/init_hook.php
將所有hook註冊。
<?php
register_activation_hook( __FILE__, function() {
require_once plugin_dir_path( __FILE__ ) . 'includes/Activation.php';
Activation::activate();
} );
register_deactivation_hook( __FILE__, function() {
require_once plugin_dir_path( __FILE__ ) . 'includes/Deactivation.php';
Deactivation::deactivate();
} );
register_uninstall_hook( __FILE__, function() {
require_once plugin_dir_path( __FILE__ ) . 'includes/Uninstall.php';
Uninstall::uninstall();
} );
好了,我們的第一天的檔案應該會長得跟下面差不多:
. _gogopowerranger
├── gogopowerranger.php
├── init_hook.php
├── Uninstall.php
├── _includes
│ ├── Deactivation.php
│ ├── Activation.php
│ └──Uninstall.php
└── _assets 空的
Wordpress Plugin Basic
Using Sane Defaults in Themes
Sane Defaults
How to Create Your First WordPress Plugin (With a Minimal Amount of Coding)