我正在制作一个wordpress插件,它占用了整个页面,并且是关于计划旅行的.
该插件展开并包含几个模块和超过10个"视图"(预订,计费,注册,我的个人资料,我的预订,我的评论等).
我有一个强大的OOP和MVC背景,但这个插件最初是在一个模板上创建的,所有东西都加载了ajax而不是有条理的方式:)
在wordpress中组织大插件(半小网站)的好习惯是什么?
有没有办法为模块视图文件创建直接链接?类似于:domain.com/blog/wp/plugins/my_plugin/profile.php
赏金:我在这里寻找有经验的人的指导方针.
首先,这并不容易,随着开发的进展,它更难坚持下去.
我会首先尝试回答你的要点,然后尝试谈谈我试图坚持的一些架构.
我尽可能接近正常组织它们.所以我通常最终得到模型,控制器,视图的文件夹.尝试以与其他任何方式相同的方式尽可能多地编写应用程序.
使用plugin_url()
.
如果您正在处理一个不会分发的项目(即不是公开发布的插件),那么您可以获得一些优势,因为您可以从Composer加载外部包而不必担心来自其他地方的冲突.所以,只要有可能,我建议将内容卸载到Composer.
我不是PHP如何实现命名空间的粉丝,但我非常喜欢将它们与自动加载结合使用.如果您使用某种形式的自动加载,即使它没有与命名空间一起使用,您肯定会让自己更轻松.
因为WordPress是在函数钩子之外工作的,除非你(过度?)设计很多东西,否则你总是会在这个地方找到一堆钩子.一般来说,我的建议是尝试将它们保存在一个文件中,并且永远不要将钩子放在类中,尤其是构造函数.将东西保存在逻辑组中.
诀窍在于最大限度地减少你实际与WordPress进行交互的点数,以及在其他任何地方实际编写你的代码,就像通常那样,使用体面的设计模式等.你必须要有某些联系点(比如钩子等),你可能会发现自己对WordPress做出了一些让步,但即使在那里你也可以通过加载对象方法作为钩子回调来缓解它,并将它们用作跳跃-off指向"正常"应用程序.
我一直对这个问题感兴趣.我在这方面有几个正在进行的项目.我扔在一起的一件事是与GravityForms接口,它在github上.这真的不复杂,但它可能有助于解释我如何解决问题.
我已经没有具体的内容了,但如果你愿意,请随时给我留言.正如我所说,我真的很有兴趣解决这个问题,我认为如果WordPress持续并且继续像今天这样流行,我们将有更好的解决方案.
我希望这是有帮助的!
编辑:一个更具体的例子
我会在我最初分享的代码中指出一些内容.它有点专业,但你可以使用任何基于钩子的功能的原则.正如你在这里看到的,我正在调用一个类GravityFormsHooks\Loader
来处理挂钩对象的方法.在GravityFormsHooks\Loader
,我正在调用该类的另一个静态方法来实际执行钩子.此示例将采用动作或过滤器,但它专门针对Gravityforms定制,因此YMMV.
基本上这个GravityFormsHooks\Loader::hook()
方法的作用是实例化我们挂钩的类,并正常生成钩子.
我从主插件文件中调用的类是GravityFormsHooks\Forms\Form
.请注意,您挂钩的任何方法必须声明为public
.如果我们要把自己变成一个MVC范例,这个方法就是你的控制器.从那里,你可以跳到注入模型,模板引擎,各种酷炫的东西.
正如我在原帖中所提到的,我尽量将与WordPress的联系点保持在最低限度.我并不是说你应该编写API来做WordPress已经有API的东西,只是你的钩子应该集中并最小化.它确实是一个有用的关注点分离,随着应用程序的增长,它将帮助您更轻松地管理复杂性.
我提供的示例应该作为Hook控制器工作得很好,只需要进行最少的修改就可以删除一些更专业的GravityForms内容.
如果您有任何其他问题,请告诉我.