我遇到的所有文档都讨论了通过插件重写可插入函数。
如果你在做主题开发呢?
我的职能。php需要另一个覆盖get_user_by()
函数,在中定义pluggable.php
.
如果我省略if( function_exists() )
打电话给我,我得到“不能重新申报…”错误
如果我包括if( function exists() )
调用,则不会得到任何错误,但当然会忽略我的函数,因为存在可插入版本。
基于Dominic在the WordPress startup order, 很明显pluggable.php
在主题之前加载functions.php
以此类推,这就解释了错误。
因此,问题是——你如何从一个主题中利用好的可插拔架构,而不必编写插件,然后必须与主题捆绑或安装插件?
Further notes: 因此,争论似乎是主题不应该试图做插件所做的事情。但这一论点已经有四年多的历史了(根据4位数的trac编号)。我很想听听一些重量级人物的意见,考虑到当今主题开发环境的复杂拓扑结构,这种理念是否仍然适用。我愿意相信,从那时起,我们已经进化了。
Context: 我正在为客户开发一个一次性CMS解决方案,其中包含大量自定义元数据、管理后端的自定义、登录/身份验证过程以及工作。当然,还有设计部分,这就是主题部分的所在。事实是,这些not 可重用组件—它们永远不会应用于其他客户端,永远不会置于GPL和开源之下,而且它们肯定不会在其他WordPress部署上分发/安装。在最好的情况下,我将在未来的项目中利用一些最佳实践,但这将严格地作为参考/复制粘贴工作。
这听起来不像是插件的用例。主题已安装,可能是一个211的子主题,也可能是一个独立的主题,其功能。php调用了大量的Include,每个都处理所讨论的CMS的不同方面。然后,主题模板文件使用在includes中定义的自定义“模板标记”。我不想让主题文件依赖于某个插件或其他被激活的插件,等等。在系统中增加复杂性是没有意义的。当然,我可以把它放在必用插件文件夹中,但这仍然像是一种黑客行为-现在,与此项目定制相关的所有内容都包含在wp-content/themes/my-theme/
. 我也不想考虑在一些插件文件夹中搜索东西。
别误会我的意思。我喜欢插件,我使用它们并编写它们。当插件是第三方的时候,我会将插件与这种高度定制的主题开发结合使用,它代表的最佳实践远远超出了我在合理时间内可能推出的内容。但是,当我需要修改一次性场景的核心功能时,我会转向操作挂钩、过滤器挂钩,并且我希望能够在用户和身份验证方面依赖可插拔功能。
最合适的回答,由SO网友:Andrew Nacin 整理而成
如果您是为单个客户机构建此功能,那么您应该充分利用mu-plugins
.
在WordPress中有很多事情是你不能做的functions.php
. 可插拔函数就是其中之一,但更明显的是,许多钩子(包括操作和过滤器)以前都会触发functions.php
. 在某些情况下,这些挂钩甚至在常规插件之前启动,这就要求您使用mu-plugins
或网络激活插件。在其他情况下,即使是一个mu插件也为时已晚。也许你需要点什么sunrise.php
. 甚至是wp-config.php
.
我宁愿为可插拔函数添加一些挂钩,也不愿使其更容易重写。我们不太可能再拥有另一个可插拔的功能——它们早于挂钩,我几乎从未见过它们比好的老式(新式?)有优势的情况钩
六年后,我仍然同意安迪·斯凯尔顿的观点——“主题的函数文件和插件之间有很多不同。让我们保持这样吧。”
除此之外,像这样的变化永远不会发生。这会破坏很多东西。无数主题调用functions.php
这将导致致命错误,如果pluggable.php
还没有加载-就像current_user_can()
, 或wp_create_nonce()
. 他们都会失败。它也会破坏插件,插件通常可以开始调用这些函数plugins_loaded
. (只需移动pluggable.php
下部(英寸)wp-settings.php
我敢打赌一半的核心会断裂——或者至少,定制者会断裂。)
最后,有一个不可避免的想法,主题可以包含一个单独的文件,如pluggable.php
我们可以在加载插件时尽早加载,因此可以覆盖可插入函数。除了这是一个坏主意(参见本评论的前四段),它仍然不兼容,因为直到setup_theme
钩子,可以通过过滤样式表和模板值来覆盖要加载的主题。
不幸的是,考虑到WordPress的架构,这是站不住脚的。好的是,有无数(更好的)方法可以做到这一点。
(原贴于此处:http://core.trac.wordpress.org/ticket/2479#comment:5)