問題描述

我需要為 Wordpress 插件添加相對較小的功能,我可以選擇直接編輯插件,或者完全廢棄插件,並從另一個網站重新使用 PHP 代碼來做同樣的事情。重複使用 non-Wordpress 這樣一個小小的變化的 PHP 代碼似乎很愚蠢,我在編輯插件時會使用幾行 PH​​P 。我的問題是編輯一個插件是個好主意?

我知道當編輯主題時,如果編輯直接對舊的代碼完成,當主題更新時,更改將會丟失。這是否與插件一起發生?有沒有解決的辦法?

對於那些想知道變化有多複雜的人,我將簡要解釋一下。客户我想要提交表單去交易商和用户。但在某些情況下,取決於用户的電子郵件地址 (如果結束在”.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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。