问题描述
我需要为 Wordpress 插件添加相对较小的功能,我可以选择直接编辑插件,或者完全废弃插件,并从另一个网站重新使用 PHP 代码来做同样的事情。重复使用 non-Wordpress 这样一个小小的变化的 PHP 代码似乎很愚蠢,我在编辑插件时会使用几行 PHP 。我的问题是编辑一个插件是个好主意?
我知道当编辑主题时,如果编辑直接对旧的代码完成,当主题更新时,更改将会丢失。这是否与插件一起发生?有没有解决的办法?
对于那些想知道变化有多复杂的人,我将简要解释一下。客户我想要提交表单去交易商和用户。但在某些情况下,取决于用户的电子邮件地址 (如果结束在”.gov” 或其他一些结尾… 是的,我知道这不是最好的想法,我试图说服客户端,但他们是坚定的) 客户想要电邮去别人。当然这可以通过插件中的几条小的 PHP 行来解决,但插件根据用户发送的内容没有”conditional recipients” 的功能。所以我想要为这个网站添加功能 (如果可以快速完成),或者我想用直接的 PHP 替换插件,这似乎会导致比最初修复的问题更多的问题。时间就是生命。非常感谢你的帮助!
最佳解决方案
你必须问自己最重要的问题是我是主题或插件的作者?如果您的答案是肯定的,并且您负责插件或主题的保留,请继续更改并根据需要进行修改。
如果你的答案是否定的话,那么你不应该做任何修改,甚至不是一个简单的点.
。 WordPress 核心文件也是一样。简单的原因是,如你所说,如果主题/插件/核心被更新,你将失去对主题/插件/核心所做的任何事情。
我建议您使用此额外功能创建您自己的小型 functionality plugin 。它是快速和容易的,并将会节省你许多眼泪,因为它不会被覆盖,除非你自己做。
次佳解决方案
一般来说,您不想修改插件,因为下次更新插件时将会松开您的修改。主题有点不同,您可以在其中设置小孩主题。
如果插件使用 wp_mail()
功能发送电子邮件,可以尝试使用 wp_mail
过滤器来更改收件人。
尝试编写自己的插件来克服这个问题。
这是一个这样一个插件 (未经测试) 的示例:
/* Plugin Name: Change recipients for .gov emails */
add_filter( 'wp_mail',
function ( $args ) {
// Check if the recipent's email ends with .gov
if( 'vog.' === strtolower( substr( strrev( $args['to'] ), 0, 4 ) ) )
{
// Replace it with a new email address:
$args['to'] = 'new@email.com';
}
return $args;
}
);
您可能需要插件提供的一些额外的钩子。
第三种解决方案
我认为我们几年来一直在 Wordpress 工作的人都犯有这样的一个阶段。我不得不对原始作者不再支持的插件进行修改,并且与更高版本的 Wordpress 有一些兼容性问题。
在某些情况下,编辑您不是原作者的现有插件已被接受:
-
该插件不再被维护或支持
-
该插件有一些明显的安全问题,可能会损害您的服务器/网站,您不想等待更新,需要插件
这些是真正的两种情况,我可以想到编辑插件是可以接受的。在一个理想的世界中,所有的 Wordpress 插件作者都将使用 Wordpress 中的钩子/过滤器功能,所以我们可以轻松地扩展它们,并且不需要编辑插件文件就可以改变它们,但是我们都知道,没有支持用于挂钩或过滤器。
如果您需要为插件添加更多功能,那么我的第一条建议就是构建自己的插件,并自己编写这些功能。但是,有些情况下,您可能想要删除一个 Javascript 库并将其包含在插件中,但作者决定使用 include 并不使用 Wordpress 函数。这是这样的情况可能会变得棘手,因为你必须编辑一两个文件。
在需要编辑插件文件的情况下 (这是浏览所有其他选项后的最后一种情况),您应该在 plugin 目录中保留修改文件,我有一个名为”CHANGES.txt” 的文件,只需列出已更改的文件,行号,如果我有时间,我会列出我做的。然后,如果需要更新并查看更改的内容,则可以对文件进行区分。
最后的手段是不理想的,它有缺陷,违反了编程规律。但是,正如我所提到的,如果插件写得不好或不容易允许在主题或自定义插件中覆盖/扩展,则需要编辑插件文件。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。