我自己的插件之间的通用功能

时间:2014-03-12 作者:ptf

我读到,当创建新的帖子类型、创建设置页面和创建新的分类法时,应该创建一个插件。所以我做到了。但我有一些功能,这些功能可以是通用的,也可以是相同的,在我的插件中。保存到数据库的函数就是一个例子。既然所有东西似乎都放在全局范围内,那么如果PHP中有这样的东西,我应该创建另一个具有共享功能的插件,还是将共享功能放在functions.php 文件

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

1

首先functions.php 用于主题,与插件不同。

在WordPress中应使用主题for presentation only, plugin for functionality.

如果你想,你可以使用主题来实现功能,但你不应该。事实上,主题和插件只是在WordPress请求的特定时刻加载的php文件。(WordPress只加载一个文件,即主题的functions.php和插件的主插件文件,加载您需要的所有其他文件取决于您)。

问题是,在WordPress中,您可以拥有数量不限的插件,但只有一个主题。因此,如果您想更改主题,并且在functions.php 你会失去它:简单地说,这就是为什么更好地将功能放在插件上,而只将主题用于演示的原因。

2

是的,WordPress core中的所有内容都在全局名称空间中,并且大量使用全局变量,但这就是core,没有人强迫您遵循相同的规则,您可以使用名称空间(如果您的PHP版本为5.3以上),也可以不使用任何全局变量:当WordPress加载插件时,它会加载一个PHP文件,所以,你可以做任何你的PHP版本可以做的事情:如果你想,你可以自己编写所有的功能,但这毫无意义:你使用WordPress是因为它有所有的功能,所以当你需要的东西被core覆盖时,试着使用core函数/类,但是可以随意编写WordPress没有的PHP代码。要做到这一点,请随意使用您所知道的所有PHP技术。

3

保存到数据库的函数就是一个例子

我不知道您正在将什么保存到数据库中以及为什么要保存,但如果您必须保存WordPress实体:post、taxonomy terms、meta、options、users、transient。。。WordPress已经有了从数据库中保存和检索所有这些内容的函数,所以不需要为此编写自定义函数。如果你是说一些custom tables, 是的,如果需要,可以编写一些抽象代码,简化自定义表的创建和操作,但在这种情况下:

在WordPress中使用自定义表有时很有用,但是如果您的应用程序需要太多的自定义表,WordPress可能不是合适的基础,这里有非常好的框架(Symphony, Laravel, Sylex 在编写自定义功能之前,请查看现有的大量WordPress插件,可能有一个插件已经可以满足您在编写自定义WordPress功能时的需要,请记住它不是一个独立的应用程序,它将与其他主题和插件一起在WordPress中使用,因此,为了保持应用程序的健全性,您需要遵循一些共存规则,例如,对特定任务使用正确的挂钩。或者,如果您需要创建一个自定义表,请使用db_delta

4

现在讨论从一个插件提取公共特性到另一个插件。是的,这是可行的,而且,我认为,这是完全公平的。有不同的方法:

4.1:只需创建不同的插件并安装它们,就像前面所说的,插件只是php文件,在WordPress引导过程中的特定时间使用require_once, 所以,实际上,当安装了两个插件时,两个文件在同一个插件中并由您自己加载,或者两个文件由WordPress加载,没有什么区别。当然,你不能说哪个文件先加载,哪个文件后加载,但多亏了WordPress挂钩,你可以知道何时加载了所有插件,并从那一刻起开始做这件事。当然,在使用放置在另一个插件中的功能之前,请确保插件/功能可用。概念验证代码:

// plugin-one.php

namespace PluginOne

class Foo {
  function do_something () {
    return \'Foo!\';
  }
}

// plugin-two.php

namespace PluginTwo

class Bar {
  function do_something ( PluginOne\\Foo $foo ) {
     echo $foo->do_something();
  }
}

add_action(\'plugins_loaded\', function() { 
  // when WordPress fires \'plugins_loaded\' all plugin files are required
  // so we can check if the class PluginOne\\Foo exists and use it
  if ( class_exists( \'PluginOne\\Foo\' ) ) {
    $bar = new Bar;
    $bar->do_something( new PluginOne\\Foo );
  }
});
我不知道你是否曾经听说过Composer. 它是一个依赖关系管理工具。

当您需要编写需要另一个插件的插件时,如果两者都支持Composer,那么只需在composer.json 文件

如何为插件使用Composer并不复杂,但对于这里的答案来说太复杂了。

在最近的几个月里,WordPress社区(在PHP社区,它是很久以前发展起来的)对Composer产生了兴趣,现在您可以找到一些有用的资源。开始看看吧composer.rarst.net, 这是一个共享的资源Rarst, 此站点的一个mods。

结束

相关推荐

使用主题文件夹代替plugins_url

我想这很简单,但我无法解决。我正在尝试通过我的主题向WordPress仪表板添加菜单页。我有以下。。。add_menu_page( \'Test\', \'Test\', \'manage_options\', \'myplugin/myplugin-admin.php\', \'\', plugins_url( \'myplugin/image/icon.png\' ), 6 &