WordPress - 覆盖插件中的函数

Posted

技术标签:

【中文标题】WordPress - 覆盖插件中的函数【英文标题】:WordPress - Overriding a function in a plugin 【发布时间】:2011-11-22 03:14:26 【问题描述】:

我一直想知道修改 WordPress 用户创建的插件的最佳做法是什么?

例如,我想在 Contact Form 7 插件中更改几行代码。该函数名为function wpcf7_ajax_json_echo(),位于:

wp-content > plugins > contact-form-7 > includes > controller.php

当然,我可以直接更改该文件中的代码并完成,但是当我想更新该插件时我很不走运,因为我的修改可能会被覆盖。

我知道我应该通过我的 functions.php 文件实现这一点,但我不确定如何实现这一点。此外,该特定功能是 100 多行代码,我猜我不想覆盖整个功能,因为插件的作者很有可能选择在将来更新该功能中的某些内容。

有谁知道我通过我的functions.php文件修改该函数中的几行的最干净的方法?

谢谢!

【问题讨论】:

你也可以试试wordpress.stackexchange.com。顺便说一句,好问题。 哦,我想我不知道那个网站。谢谢! 【参考方案1】:

如果您想保持前向兼容性(并且您的主机有可用的 SVN),您可以使用 SVN,同时能够保留您自己的更改。

插件目录中的每个插件都必须有一个 SVN 存储库(这就是目录知道是否有更新的方式)。 Here's the CF7 repo.

/custom-contact-form-7/ 等文件夹中的 /plugins/ 目录中检出主干。更改 wp-contact-form-7.php 文件以赋予它一个唯一的名称,并进行您想要进行的更改以对其进行自定义。

要获取新的更新,您只需 svn up 即可获取它们,它们将与您的更改合并。不过,有时您可能需要清理合并冲突。

Version Control with Subversion 是大家开始学习 SVN 的地方,如果你需要的话。现在还有一个Github repo,如果你想分叉的话。

【讨论】:

谢谢,这是个好主意。当然,它每次仍然需要一些手动工作。不过,事情就是这样。 +1 提倡版本控制。但是,这是很多开销:签出 repo,在工作副本中进行更改,导出到当前项目,管理工作副本。您实际上已经为项目分叉了几行代码更改。 好主意! 分叉项目似乎是要走的路。 Git 也可以做到这一点,对于任何想知道的 *** 流浪者!【参考方案2】:

我绝对认为您应该将更新添加到functions.php 或自定义插件中。现在很麻烦,但每次升级插件时都会少很多麻烦。

无论如何,您都必须参考更新中所做的更改。即使您能够在不复制此文件的情况下扩展功能,您也必须至少检查并确保您的更改仍然有效。并且 WinDiff/BBEdit 的比较可以快速解决这个问题。

所以我的第一个建议是覆盖该函数。

第二个建议: 我注意到这个插件有一些扩展(a、b、c);也许您可以了解他们是如何制作扩展的,并使用这些细节来制作您自己的。好吧,这就像建议你建造一座新房子来修理滴水的水龙头,但这是一个想法。

【讨论】:

【参考方案3】:

我不建议更换核心。不过,你有点吃不消了。

你可以:

直接在插件中更新功能代码 从插件中复制当前函数代码并在functions.php中覆盖它

最后,你还是遇到了同样的问题——未来的兼容性

要么:

更新将覆盖您的插件更改。 您的函数会覆盖插件更改。

所以,虽然我不想说,但我会直接更新插件。至少当您升级时,您会很快知道您的更改丢失了。此外,插件更新可能会包含您的更改。

【讨论】:

如何覆盖functions.php中的函数? 如果一个插件的功能是这样定义的:if ( ! function_exists( 'plugin_function' ) ) function plugin_function() ... .. 你可以先在你的子主题的functions.php中定义它,然后让它做你想做的任何事情,或者留空完全删除它的功能。当插件试图定义它时,它已经存在,所以它会跳过它,留下你的。如果它不检查现有定义,您可能必须编辑插件文件或面临致命错误。

以上是关于WordPress - 覆盖插件中的函数的主要内容,如果未能解决你的问题,请参考以下文章

WordPress小部件中的重复表单字段?

Wordpress 翻译页面选项

如何在 WordPress 中创建联系表格?

wp_user_create - 设置角色 - Wordpress

wordpress博客留言板自定义字段应该怎么做或者用啥插件

PHP - 覆盖现有函数[重复]