WordPress插件開發有哪些技巧?

Thread Source: WordPress插件 – 子比防红插件

這兩年我陸陸續續做過幾個WordPress插件,踩過的坑比寫過的功能還多。老實說,最讓我頭痛的倒不是程式碼本身,而是怎麼讓插件在各種主題、其他插件亂槍打鳥的環境下穩定運作。尤其像防紅這類需要攔截請求、跳轉網址的插件,一個沒寫好,輕則頁面跑版,重則整個網站白屏——那種經驗,一次就夠你記一輩子了。

掌握Hooks是基本功,但別只會用add_action跟add_filter

很多人學WordPress插件開發,第一個接觸的就是add_action和add_filter,這當然沒錯。可是真的到實戰,你會發現hooks的世界比想像中複雜。比如說init這個鉤子觸發得早,適合拿來註冊自訂文章類型,但如果你想攔截外部請求做跳轉處理,用template_redirecttemplate_redirect會更精準。我自己的防紅插件早期就是用init做跳轉邏輯,結果碰到某些快取插件在init之前就輸出了標頭,根本沒機會攔截。後來改成template_redirect`,問題才解決。

另外,善用remove_action和remove_filter也很重要。有些佈景主題或外掛會在wp_head塞一堆不必要的東西,你可以在自己的插件裡用remove_action清掉,避免跟你的功能打架。當然,加這類操作之前最好先檢查來源是不是你認識的鉤子標籤,不然錯砍別人的功能,除錯起來又是另一場噩夢。

短代碼(Shortcode)設計要夠笨,夠單純

短代碼是WordPress提供給使用者最友善的介面,但也是最容易被濫用的。我遇過很多插件把短代碼寫得又長又複雜,參數十幾個,文件還寫不清楚。其實好的短代碼最好只做一件事:[防紅鏈接 url="https://..."],這樣前端解析時就不用猜你要幹嘛。而且記得在do_shortcode呼叫之前,先做一次輸出緩衝區的清理,不然短代碼回傳的內容插在文章中間,位置會亂掉。

安全性永遠是最後的遮羞布

很多開發者覺得WordPress本身已經有wp_nonce、esc_sql這些工具,夠安全了。但如果你寫的是類似防紅外掛這種需要處理外部請求使用者輸入的插件,千萬不要信任任何$_GET或$_POST的數值。我曾經被一個第三方參數夾雜惡意碼,跳轉時把使用者導去釣魚網站,還好發現得早。現在我的做法是,所有外部來源的URL一律用esc_url_raw過濾,然後再用wp_validate_redirect檢查是否在白名單內。這樣就算有人硬塞惡意參數,也只會乖乖跳回首頁。

效能:別讓你的插件拖垮整個站

WordPress出名就是能靠插件擴充功能,但爛插件也是讓網站變慢的元兇。尤其是自訂查詢,很多人直接在functions.php或插件主檔案裡寫new WP_Query,每載入一頁就多一次資料庫查詢。如果你的插件需要在頁面顯示連結清單,可以考慮用wp_cache_get配上wp_cache_set,把結果快取起來。或是用Transients API設定短時間的暫時快取,例如五分鐘內重複呼叫就不必再查DB。我自己的防紅插件在處理跳轉統計時,就是用Transients去記錄點擊數,每秒更新一次就好,不需要每次跳轉都寫入資料庫。

用戶體驗,從後台設定頁開始

最後想聊一個很多人忽略的事:後台設定頁的UI。就算你的插件功能再強,如果設定頁亂七八糟,使用者根本不知道哪個開關是幹嘛的,遲早會被移掉。最簡單的建議:每個欄位旁邊加一句說明文字,用<p class="description">包起來。如果可以,加上即時預覽,例如防紅插件的跳轉類型選擇「直接跳轉」還是「中間頁提示」,讓使用者在設定頁就能看到模擬效果,比寫落落長說明文件有用太多。你甚至可以放一支短短的GIF示範——雖然是我後來才想到的事,但做了之後差評立刻變少。

寫插件從來不是寫程式碼就好,更像是在跟使用者、佈景主題、其他外掛玩一場複雜的拔河遊戲。把這些小技巧記在心裡,下次開新專案時,你會感謝自己當初多花那五分鐘。

評論(14)

提示:請文明發言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

  • 醉筆生

    早就該有人講這些了,template_redirect那個坑我也踩過😅

    5 個月前 Reply
  • MuffinMeadow 普通用户

    短代碼真的越簡單越好,參數一多連自己都搞混

    5 個月前 Reply
  • RainbowGiggles 普通用户

    問一下,用wp_validate_redirect白名單的話,要自己維護清單嗎?

    5 個月前 Reply
  • 困惑的迷霧 普通用户

    我倒是覺得後台UI弄個即時預覽超實用,之前搞半天才懂設定效果

    5 個月前 Reply
  • 機械回聲 普通用户

    效能那段說得對,但我懶得弄快取,反正站小跑不動就算了

    5 個月前 Reply
  • 酷酷哥 普通用户

    防紅插件?又是那種跳轉廣告的?🤔

    5 個月前 Reply
  • 壓抑的雷聲 普通用户

    這篇感覺是給新手看的,但老手也常常忽略那些細節

    5 個月前 Reply
  • EchoOfDusk 普通用户

    之前用過一個短代碼插件,結果文章排版全亂,後來才知道要清輸出緩衝

    5 個月前 Reply
  • 風扇

    那個GIF示範的點子不錯,學起來

    5 個月前 Reply
  • 駱駝客 普通用户

    說真的,寫插件最煩的是除錯相容性,主題一換就要重測

    5 個月前 Reply
  • 不羁风 普通用户

    Transients API我拿來暫存API回傳的數據,效率確實好很多

    5 個月前 Reply
  • 遙控器 普通用户

    短代碼裡do_shortcode之前清緩衝?具體要加哪個函數啊?

    5 個月前 Reply
  • RawEnergy 普通用户

    看完又想起被白螢幕支配的恐懼…一次就夠了

    5 個月前 Reply
  • 筆記本 普通用户

    其實安全那段我反而覺得esc_url_raw就夠了,白名單太麻煩

    5 個月前 Reply