wordpress插件MVC页面结构

时间:2014-01-03 09:02:11

标签: wordpress model-view-controller wordpress-plugin

我正在制作一个wordpress插件,它占据了整个页面,并且是关于计划旅行的。

该插件展开并包含多个模块和超过10个“视图”(预订,结算,注册,我的个人资料,我的预订,我的评论等)。

我有一个强大的OOP和MVC背景,但这个插件最初是在一个模板上创建的,所有内容都加载了ajax而不是有条理的方式:)

  • 在wordpress中组织大插件(半小网站)的好习惯是什么?
  • 有没有办法为模块视图文件创建直接链接?就像是: domain.com/blog/wp/plugins/my_plugin/profile.php

恩惠: 我正在寻找有经验的人的指导。

1 个答案:

答案 0 :(得分:7)

首先,这并不容易,随着开发的进展,它更难坚持。

我会首先尝试回答你的要点,然后尝试谈谈我试图坚持的一些架构内容。

  • 我尽可能接近正常组织它们。所以我通常最终得到模型,控制器,视图的文件夹。尝试以与其他任何方式相同的方式编写应用程序。
  • 使用plugin_url()

如果您正在处理一个不会分发的项目(即不是公开发布的插件),那么您可以获得一些优势,因为您可以从Composer加载外部包而不必担心来自其他地方的冲突。所以,只要有可能,我建议将内容卸载到Composer。

我不是PHP如何实现命名空间的粉丝,但我非常喜欢将它们与自动加载结合使用。如果你使用某种形式的Autoloading,即使它没有与命名空间一起使用,你肯定会让自己更容易。

由于WordPress脱离了函数钩子,除非你(过度?)设计了很多东西,否则你总是会在这里找到一堆钩子。一般来说,我的建议是尝试将它们保存在一个文件中,并且永远不要将钩子放在类中,尤其是构造函数。将东西保存在逻辑组中。

诀窍的确是最大限度地减少你实际与WordPress交互的点数,以及其他任何地方,以便像往常一样编写代码,使用体面的设计模式等。你必须要有某些联系点(比如钩子等),你可能会发现自己对WordPress做出了一些让步,但即使在那里你也可以通过加载对象方法作为钩子回调来缓解它,并将它们用作跳跃-off指向“正常”应用程序。

我对这个问题感兴趣了一段时间。我在这方面有几个正在进行的项目。我扔在一起的一件事是与GravityForms接口,它在github上。这真的不复杂,但它可能有助于解释我如何解决问题。

我已经没有具体要添加了,但如果你愿意,请随时给我留言。正如我所说,我真的很有兴趣解决这个问题,我认为如果WordPress持续并且继续像今天这样流行,我们将会有更好的解决方案。

我希望这有用!

编辑:更具体的例子

我会在我最初分享的代码中指出一些内容。它有点专业,但你可以使用任何基于钩子的功能的原则。正如您所看到的here,我正在调用类GravityFormsHooks\Loader的方法来处理挂钩对象。在GravityFormsHooks\Loader中,我正在调用another static method on that class来实际执行挂钩。此示例将采用操作或过滤器,但它专门针对Gravityforms定制,因此YMMV。

基本上这个GravityFormsHooks\Loader::hook()方法的作用是实例化我们挂钩的类,并正常生成钩子。

我从主插件文件调用的类是GravityFormsHooks\Forms\Form。请注意,您挂钩的任何方法必须声明为public。如果我们要把自己变成一个MVC范例,这个方法就是你的控制器。从那里,你可以跳到注入模型,模板引擎,各种酷炫的东西。

正如我在原帖中所提到的,我尽量将与WordPress的联系点保持在最低限度。我并不是说你应该编写API来做WordPress已经有API的东西,只是你的钩子应该集中并最小化。它确实是一个有用的关注点分离,随着应用程序的增长,它将帮助您更轻松地管理复杂性。

我提供的示例应该作为Hook控制器工作得很好,只需要进行最少的修改就可以删除一些更专业的GravityForms内容。

如果您有任何其他问题,请告诉我。