构建插件需要注意以下几个问题:
避免命名冲突
当您的插件中的变量、函数或类使用与另一个插件相同的名称时,就会发生命名冲突。
您可以使用以下方法避免命名冲突。
- 编码方法,默认情况下,所有变量、函数和类都定义在全局命名空间中,这意味着您的插件可以覆盖另一个插件设置的变量、函数和类,反之亦然。在函数或类中定义的变量不受此影响。
- 使用前缀,所有变量、函数和类都使用唯一标识符作为前缀。前缀可防止其他插件覆盖您的变量或者调用您的函数和类。
- 检查是否存在相同的名称,PHP 提供了许多函数来验证变量、函数、类和常量的存在。 如果存在,将返回 true。
使用以下验证方法:
变量: isset() (includes arrays, objects, etc.)
函数: function_exists()
类: class_exists()
常量: defined()
示例:
//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' );
}
}
- 面向对象的方法
解决命名冲突问题的一种更简单的方法是为插件的代码使用一个类。
但仍然需要检查的类的名称是否已经被占用,其余的将由 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.php与uninstall.php放在插件文件夹的根目录,其余的放在子文件夹下。 示例:
/plugin-name
plugin-name.php
uninstall.php
/languages
/includes
/admin
/js
/css
/images
/public
/js
/css
/images
插件的架构
小型插件,或单一用途插件,不用太细分,如果是大型插件或是方便以后扩展,单独的样式和相关的文件,有助于代码组织和插件的长期维护。
Admin管理代码和前台代码的分离
使用is_admin()
示例:
if ( is_admin() ) {
// we are in admin mode
require_once __DIR__ . '/admin/plugin-name-admin.php';
}
架构模式,分为三类:
- 单个插件文件,包含函数
- 单个插件文件,包含一个类、实例化的对象和可选的函数
- 主插件文件,然后是一个或多个类文件