iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 2
0
自我挑戰組

Wordpress 外掛開發系列 第 2

「Wordpress 外掛開發」從基礎header到解除安裝

現在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個:

  • /assets:這邊主要是儲存一些外部資源,或是圖片相關的,在production中,我們會使用webpack把這些東東打包進我們的正式機上
  • /includes:這邊主要儲存我們的PHP修改核心,包括我們的使用類別或是啟動或是停用的Hook

我們今天會加入一些啟動的檔案與刪除的檔案,按照著有邏輯的檔案架構,可以參考php fig是怎麼演繹的,裡面有關於AutoLoaderCODING STYLES的一些規範,接下來我們就開始編輯我們的第一個檔案吧

外掛 Header

<?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,我們放在套件的根目錄並且與資料夾的名稱相同即可,而裡頭的每個含義我下面娓娓道來:

  • Plugin Name: (必須項目) 外掛名稱
  • Plugin URI: 你的外掛官網
  • Description: 一個外掛的大綱,最好是少於140個字。
  • Version: 你的版本號,並且會隨者每次發布增加
  • Requires at least: wordpress 的最低版本
  • Requires PHP: PHP最低版本
  • Author: 你的名字
  • Author URI: 你的個人網站
  • License: 你的外掛的版權協議,像是GPLv2
  • License URI: 協議的全文網址
  • Text Domain: i18n才比較需要管,我們現在放與同樣名稱
  • Domain Path: 通常指你pot的位置
  • Network: multisite會常用到,我們這30天可能不會講到XD

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,他會回傳當下外掛安抓的目錄位置。

Active/Deactive 外掛

我們這邊使用的是原生提供的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老實說,我也沒有做過,因為我停用資料庫資料還是在那裡,其他都是動態執行而不會去影響,刪除表格的事情應該留到解除安裝是最恰當。

Uninstall 外掛

你現在或許會想,我直接停用就好,幹嘛刪除外掛,假設你已經有一年沒碰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 空的

Reference

Wordpress Plugin Basic
Using Sane Defaults in Themes
Sane Defaults
How to Create Your First WordPress Plugin (With a Minimal Amount of Coding)


上一篇
「Wordpress 外掛開發」開始,Plugins開發沒那麼難,會的不多也可以玩
下一篇
「Wordpress 外掛開發」主選單設定(Administration Menus)-上
系列文
Wordpress 外掛開發30

尚未有邦友留言

立即登入留言