最佳实践

这里有一些最佳实践来帮助组织代码,使其与WordPress核心和其他WordPres插件一起工作。

避免命名冲突

当插件对变量、函数或类使用与另一个插件相同的名称时,会发生命名冲突。

幸运的是,您可以通过使用以下方法来避免命名冲突。

程序编码方法

默认情况下,所有变量、函数和类都在全局名字空间,这意味着您的插件可以覆盖另一个插件和vice-versa设置的变量、函数和类。定义的变量里面的函数或类不受此影响。

为所有内容添加前缀

所有全局可访问的代码都应以独特的标识符。前缀可以防止与其他插件发生冲突,并防止它们覆盖变量和意外调用函数和类。

为了防止与其他插件发生冲突,您的前缀应该至少有3个字母长,但我们建议使用5个字母。你应该避免使用一个普通的英语单词,而应该选择你的插件独有的东西。仅WordPress.org上就有成千上万个插件。在我们的服务器之外还有数十万人。你是陷入冲突。

这样做的一个好方法是使用前缀。例如,如果您的插件名为“Easy Custom Post Types”,则可以使用以下名称:

  • 函数ecpt_save_post()
  • define('ECPT_LICENSE',true);
  • 类ECPT_Admin{}
  • 命名空间EasyCustomPostTypes;
  • update_option('ecpt_settings',$settings);

因为您正在将代码作为WordPress(文字出版社)项目中,必须避免使用与核心WordPress冲突的可能性很高的前缀。这包括但不限于:__(双下划线),水处理_,WordPress(文字出版社),或_(单下划线)

如果您正在为“子”插件(例如WooCommerce扩展)编写代码,您同样需要避免使用它们的任何普通/通用前缀(即Woo、WooCommer)。

你可以使用它们里面类或命名空间,但不是作为独立的函数/namespace/class。

如果您正在使用_n()__()对于翻译来说,这很好。我们是只有谈论你为插件创建的功能,而不是WordPress的核心功能。事实上,这些核心功能是为什么?您不需要在自己的插件中使用这些前缀!你不会想为你的用户破坏WordPress。

记住:好的前缀名称对你的插件来说是独一无二的。这将帮助您和下一个人进行调试,并防止冲突。

编码为必须前缀包括:

  • 函数(除非使用名称空间)
  • 类、接口和特性(除非使用名称空间)
  • 命名空间
  • 全局变量
  • 选项和瞬态

检查现有实现

PHP提供了许多函数来验证变量、函数、类和常量的存在。如果实体存在,所有这些都将返回true。

请记住,使用(!function_exists('NAME')){在你意识到这个致命的缺陷之前,你所有的函数和类听起来都是个好主意。如果其他东西有一个同名的函数,并且首先加载它们的代码,那么你的插件就会崩溃。使用if-exists替换/重写函数或类应保留给共享仅库。

例子

//创建一个名为“wporg_init”的函数(如果它还不存在)if(!function_exists('wporg_init')){函数wporg_init(){register_setting('wporg_settings','wpoorg_option_foo');}}//创建一个名为“wporg_get_foo”的函数(如果它还不存在)if(!function_exists('wporg_get_foo')){函数wporg_get_foo(){return get_option('wporg_option_foo');}}

面向对象编程方法

解决命名冲突问题的一个简单方法是使用获取插件的代码。

您仍然需要检查您想要的类的名称是否已经被使用,但剩下的将由PHP处理。

例子

if(!class_exists('WPOrg_Plugin')){类WPOrg_Plugin{公共静态函数init(){register_setting('wporg_settings','wpoorg_option_foo');}公共静态函数get_foo(){return get_option('wporg_option_foo');}}WPOrg_Plugin::init();WPOrg_Plugin::get_foo();}

文件组织

插件目录的根级别应该包含插件名称.php文件和(可选)您的卸载.php文件。所有其他文件应尽可能组织到子文件夹中。

文件夹结构

一个清晰的文件夹结构可以帮助你和其他人在你的插件上保存相似的文件。

以下是供参考的文件夹结构示例:

/插件名称插件名称.php卸载.php/语言/包括/管理员/js型/css公司/图像/公众/js型/css公司/图像

插件体系结构

您为插件选择的架构或代码组织可能取决于插件的大小。

对于与WordPress核心、主题或其他插件交互有限的小型、单一用途插件,工程复杂类几乎没有什么好处;除非你知道这个插件以后会大大扩展。

对于包含大量代码的大型插件,首先要考虑类。独立的样式和脚本文件,甚至与构建相关的文件。这将有助于代码组织和插件的长期维护。

条件加载

将管理代码与公共代码分开很有帮助。使用条件is_admin()。您仍必须执行功能检查,因为这并不表示用户已通过身份验证或具有管理员级访问权限。请参见检查用户功能.

例如:

if(is_admin()){//我们处于管理模式要求一次__DIR__'/admin/plugin-name-admin.php';}

避免直接文件访问

作为安全预防措施,如果绝对路径未定义全局。这仅适用于包含类或函数定义之外的代码的文件,例如主插件文件。

您可以通过在文件顶部包含以下代码来实现这一点:

if(!defined('ABSPATH')){退出;//直接访问时退出}

体系结构模式

虽然有许多可能的架构模式,但它们大致可以分为三种变体:

解释的架构模式

上述更复杂的代码组织的具体实现已经编写为教程和幻灯片:

锅炉板启动点

与其从头开始编写每个新插件,不如从样板。使用样板文件的一个优点是在您自己的插件之间保持一致。如果您使用其他人已经熟悉的样板文件,则样板文件还可以使其他人更容易为您的代码做出贡献。

这些还可以作为不同但具有可比性的架构的进一步示例。

  • WordPress插件模板:WordPress插件开发的基础,旨在为构建插件提供清晰一致的指南。
  • WordPress插件引导程序:使用Grunt、Compass、GIT和SVN开发WordPress插件的基本引导。
  • WP骨架插件:关注单元测试和使用编写器进行开发的框架插件。
  • WP CLI脚手架:WP CLI的Scaffold命令创建一个具有CI配置文件等选项的骨架插件

当然,您可以从这些方面以及其他方面创建自己的自定义样板。