以下是一些最佳实践,可以帮助您组织代码,使其与WordPress核心和其他WordPress插件一起很好地工作。
避免命名冲突
当您的插件对变量、函数或类使用与另一个插件相同的名称时,就会发生命名冲突。
幸运的是,您可以使用以下方法避免命名冲突。
程序编码方法
默认情况下,所有的变量、函数和类都定义在全局命名空间,这意味着你的插件有可能覆盖其他插件设置的变量、函数和类,反之亦然。定义在函数或类中的变量不受此影响。
为所有内容添加前缀
所有变量、函数和类都应以唯一标识符作为前缀。前缀可以防止其他插件覆盖您的变量并意外调用您的函数和类。这也会阻止你这样做。
检查是否存在
PHP提供了许多函数来验证变量、函数、类和常量的存在性。如果实体存在,所有这些都将返回true。
- 变量:isset()(包括数组、对象等)
- 函数: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
插件架构
您为插件选择的架构或代码组织可能取决于插件的大小。
对于与WordPress核心、主题或其他插件交互有限的小型、单一用途插件,在工程复杂类中几乎没有好处,除非你知道这个插件以后会大大扩展。
对于包含大量代码的大型插件,首先要考虑类。分离样式和脚本文件,甚至生成相关文件。这将有助于代码组织和插件的长期维护。
条件加载
将您的管理代码与公共代码分开是很有帮助的。使用条件is_admin()。
例如:
if ( is_admin() ) { // we are in admin mode require_once __DIR__ . '/admin/plugin-name-admin.php'; }
架构模式
虽然有许多可能的架构模式,但它们可以大致分为三种变体:
架构模式的解释
以上更复杂代码组织的具体实现已经作为教程和幻灯片编写:
样板起点
您可能希望从样板文件开始,而不是从头开始编写每个新插件。使用模板的一个好处是在你自己的插件中保持一致性。如果您使用其他人已经熟悉的样板文件,那么也会使其他人更容易对你的代码做出贡献。
这些还可以作为不同但可比较的体系结构的进一步示例。
- WordPress插件样板文件:WordPress插件开发的基础,旨在为构建插件提供清晰一致的指南。
- WordPress插件引导程序:使用Grunt、Compass、GIT和SVN开发WordPress插件的基本引导程序。
- WP骨架插件:专注于单元测试和使用composer进行开发的骨架插件。
- WP-CLI Scaffold:WP-CLI的Scaffold命令创建了一个带有CI配置文件等选项的框架插件
当然,您可以从这些和其他的不同方面创建自己的定制样板。