如何重写主题中的可插拔函数?

时间:2012-06-20 作者:Tom Auger

我遇到的所有文档都讨论了通过插件重写可插入函数。

如果你在做主题开发呢?

我的职能。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/. 我也不想考虑在一些插件文件夹中搜索东西。

别误会我的意思。我喜欢插件,我使用它们并编写它们。当插件是第三方的时候,我会将插件与这种高度定制的主题开发结合使用,它代表的最佳实践远远超出了我在合理时间内可能推出的内容。但是,当我需要修改一次性场景的核心功能时,我会转向操作挂钩、过滤器挂钩,并且我希望能够在用户和身份验证方面依赖可插拔功能。

3 个回复
最合适的回答,由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)

SO网友:Mark Jaquith

在一次性项目的上下文中,将必须使用的代码放入mu-plugins. 如果“将所有内容放在同一个位置”是一个问题,只需在主题目录中创建一个符号链接即可mu-plugins 下拉列表,以便在搜索主题目录时显示。

SO网友:Rarst

我想不出一个方法来实现这一点,在加载序列中太早了。

最接近理智的解决方案是将自定义包含添加到wp-config.php (通过编写代码或要求用户这样做),但与捆绑插件相比可能更有意义。

结束

相关推荐

如何在Pluggable.php中添加自定义函数

我正在开发一个WP插件,我想向pluggable添加一个自定义函数。php(位于/wp includes)。我正在从admin调用该函数。php(位于/wp admin)考虑一下功能auth_redirect 这是从admin调用的。php。auth_redirect 是在pluggable中定义的函数。php检查登录的用户,否则它会将他们重定向到登录页面。同样,我有自己的自定义函数。那么,是否有任何特定的钩子或过滤器,我必须使用它们来将我的函数附加到可插拔的。php。目前,我正在使用fwrite() 将