Skip to content

[WordPress] 外掛開發筆記(2) 開發中的幾個觀念

Last Updated on 2021-11-19 by Clay

在官方手冊中有個名為 Best Practices 的小章節,裡面記錄著一些開發時的要點。在剛知道如何建立一個最基本的外掛後,為了朝更深入的功能鑽研,或許現在是理解這些重要開發觀念的最佳時間點也說不定。

官方的說法是,這些要點可以讓你的外掛與 WordPress 核心很好地一起運作。

  • 避免命名衝突(Avoid Naming Collisions)
  • 文件組織(File Organization)
  • 條件載入(Conditional Loading)
  • 架構模板(Architecture Patterns)

雖然沒有太多程式實作可能稍嫌無趣些就是了。


避免命名衝突

命名衝突是一件糟糕的事情,比方說你與其他外掛使用了相同的變數名稱。這是因為在預設的情況下,你使用的變數、函式與類別通通都定義在 global namespace全域命名空間)。

而我們可以通過以下的方式來避免這件事情。


前綴任何名稱(Prefix Everything)

所以的變數、函式與類別都應加上屬於自己的獨特前綴。比方說你的外掛叫做 ABC,那麼你可以替所有的變數開頭都加上 ABC_ 這樣的字串。


確認已存在的實現(Check for Existing Implementations)

PHP 提供了數種函式來驗證變數、函式、類別與常數是否存在。

下面給段官方手冊上的範例,可以看到定義的函式是在確定不存在任何現有名稱的情況下才開始定義的。

//Create a function called "wporg_init" if it doesn't already exist
if ( !function_exists( 'wporg_init' ) ) {
    function wporg_init() {
        register_setting( 'wporg_settings', 'wporg_option_foo' );
    }
}
 
//Create a function called "wporg_get_foo" if it doesn't already exist
if ( !function_exists( 'wporg_get_foo' ) ) {
    function wporg_get_foo() {
        return get_option( 'wporg_option_foo' );
    }
}



物件導向的開發方法

另一個簡單的避免命名衝突的方法為替自己的外掛建立一個類別(Class)。

當然,你仍然需要注意自己使用的類別名稱是否已經被使用了,但其餘的部分就可以由 PHP 來處理了。

也就是說只要最上層的類別名稱沒有重複,底下不管怎麼定義函數變數等等都沒所謂。

下方同樣是官方手冊內的範例程式碼,可以確認到這次是檢查了類別名稱是否存在。

if ( !class_exists( 'WPOrg_Plugin' ) ) {
    class WPOrg_Plugin
    {
        public static function init() {
            register_setting( 'wporg_settings', 'wporg_option_foo' );
        }
 
        public static function get_foo() {
            return get_option( 'wporg_option_foo' );
        }
    }
 
    WPOrg_Plugin::init();
    WPOrg_Plugin::get_foo();
}



文件組織(File Organization)

在外掛的根目錄你應該擁有你的 plugin-name.phpuninstall.php,其餘的檔案最好依功能的不同放置於子資料夾中。


資料夾結構

一個清晰的資料夾結構可以幫助你和他人在工作時將類似性質的檔案放在一起。

以下是官方手冊提供的資料夾結構樣板:

/plugin-name
     plugin-name.php
     uninstall.php
     /languages
     /includes
     /admin
          /js
          /css
          /images
     /public
          /js
          /css
          /images



條件載入(Conditional Loading)

可以使用 is_admin() 來區分管理程式碼與一般的公開程式碼。


if ( is_admin() ) {
    // we are in admin mode
    require_once __DIR__ . '/admin/plugin-name-admin.php';
}



架構模板(Architecture Patterns)

可能的架構模板被分成三種變體,以下是官方提供的樣例:


References


Read More

Leave a Reply