開發插件的最佳實踐
避免命名衝突
當您的插件對變量,函數或類使用相同的名稱作爲另一個插件時,會發生命名衝突。
幸運的是,您可以使用以下方法避免命名衝突。
程序性
默認情況下,所有變量,函數和類都在全局命名空間中定義,這意味着您的插件可以覆蓋由另一個插件設置的變量,函數和類,反之亦然。在函數或類中定義的變量不受此影響。
前綴一切
所有變量,函數和類都應以唯一標識符爲前綴。前綴可防止其他插件覆蓋您的變量並意外調用您的函數和類。它也會阻止你做同樣的事情。
檢查現有實現
PHP提供了許多函數來驗證變量,函數,類和常量的存在。如果實體存在,所有這些都將返回true。
- 變量: isset() (包括數組,對象等)
- 函數: function_exists()
- 類: class_exists()
- 常量:defined()
OOP面向對象
解決命名衝突問題的一種更簡單的方法是使用類來獲取插件的代碼。
您仍然需要檢查是否已經使用了您想要的類的名稱,但其餘的將由PHP處理。
示例:
<?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();
}
目錄結構:
/plugin-name
plugin-name.php //插件主文件,必須和文件夾名保持一致
uninstall.php //卸載插件時自動運行的腳本
/languages //國際化語言包
/includes //其他功能腳本
/admin
/js
/css
/images
/public
/js
/css
/images
條件加載
將管理代碼與公共代碼分開是有幫助的。使用條件is_admin()。
示例:
<?php
if ( is_admin() ) {
// we are in admin mode
require_once( dirname( __FILE__ ) . '/admin/plugin-name-admin.php' );
}
文件結構參考
參考模板
對於您編寫的每個新插件,您可能希望從樣板開始,而不是從頭開始。使用樣板的一個優點是在您自己的插件之間保持一致。如果使用他們熟悉的樣板,使用模板也可以讓其他人更容易爲您的代碼做出貢獻。
這些也可作爲不同但可比較的架構的進一步示例。