如何覆盖主题中的可插拔功能?


10

我遇到的所有文档都讨论了通过插件重写可插拔功能。

如果您要进行主题开发该怎么办?

我的functions.php需要另一个文件来覆盖get_user_by()功能,该文件在中定义pluggable.php

如果我忽略该if( function_exists() )呼叫,则会收到“无法重新声明...”错误。

如果包含该if( function exists() )调用,则不会出错,但是由于存在可插入版本,因此当然会忽略我的函数。

根据Dominic 在WordPress启动命令上的精彩文章,很明显,该pluggable.php加载是主题的加载之前进行functions.php,依此类推,因此可以解释该错误。

因此,问题是-您如何在主题内利用好用的可插拔体系结构,而无需编写必须与主题捆绑或安装的插件?

进一步说明:因此看来,论点是主题不应该尝试执行插件所做的事情。但是该论点已经有四年多了(根据4位数的追踪数)。考虑到当今主题开发领域的复杂拓扑结构,我很乐意从一些沉重的打击者那里听到这种哲学是否仍然适用。我想相信我们从那以后就已经发展了。

上下文:我正在为客户开发一次性CMS解决方案,其中包含许多自定义元数据,Admin后端的自定义,登录/身份验证过程以及各项工作。当然,这里有设计组件-就是主题部分所在的地方。事实是,这些组件根本不是可重用的组件-它们永远不会应用于其他客户,也永远不会置于GPL之下并开源,它们是大多数当然不会在其他WordPress部署中分发/安装。充其量,我会在将来的项目中利用一些最佳实践,但这绝对是参考/复制粘贴工作。

这听起来不像是我的插件用例。该主题已安装,可能是“二十一”的子主题,也可能是一个独立的主题,它的functions.php调用包含一系列内容,每个都处理所涉及的CMS的不同方面。然后,主题模板文件将使用包含中定义的自定义“模板标签”。我不想让主题文件依赖于某些插件或其他被激活的对象,等等。在系统中增加复杂性只是没有意义。当然,我可以将其放在必须使用的plugins文件夹中,但是仍然感觉像黑客一样-现在,与为此项目进行的自定义相关的所有内容都包含在中wp-content/themes/my-theme/。我也不想考虑在某些插件文件夹中搜索内容。

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



顺便说一句,车票再次被关闭,并且很好地解释了原因。
Tom Auger 2012年

Answers:


10

如果您是为单个客户构建的,则绝对应该利用mu-plugins

WordPress中有很多您不能做的事情functions.php。可插拔功能是其中之一,但更明显的是,许多钩子(动作和过滤器)先于触发functions.php。在某些情况下,这些钩子甚至会在常规插件之前触发,这需要您使用mu-plugins或网络激活的插件。在其他情况下,即使是mu插件也为时已晚。也许您需要一些东西sunrise.php。甚至是中的某些内容(常量或其他形式)wp-config.php

我宁愿为可插入函数添加一些钩子,而不是使其更容易覆盖它们。我们不太可能再有另一个可插拔功能-它们比钩子早了,而且我几乎从未见过这样的情况,即它们比好的老式(新式?)钩子更具优势。

六年后,我仍然同意Andy Skelton的观点:“主题的功能文件和插件之间有很多区别。让我们保持这种状态。”

顺便说一句,这种改变永远不会发生。这会破坏很多事情。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 )


感谢您抽出宝贵的时间在此处交叉发布答案。现在,您已经解释了它,我将按您的方式查看。说得通。谢谢!
Tom Auger 2012年

5

在一个一次性项目的上下文中,将必须使用的代码放入绝对合适mu-plugins。如果需要“一次完成所有操作”,只需在主题目录中建立指向该插件的符号链接mu-plugins,以便在搜索主题目录时将其显示出来。


马克,感谢您对符号链接的建议。尽管它对迁移没有帮助,但是在开发时可能非常方便。
Tom Auger 2012年

0

我想不出什么方法来完成此任务,因为加载顺序太早了。

最接近理智的解决方案是wp-config.php(通过代码或要求用户)向其中添加自定义包含,但与捆绑插件进行比较可能更有意义。


是的,告诉我。
Tom Auger 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.