外掛開發不求人!資深工程師帶你從零到一,打造你的第一個 WordPress 神器
嗨,我是浪花科技的 Eric。身為一個整天跟 WordPress 程式碼打交道的工程師,我最常被問到的問題之一就是:「Eric,有沒有推薦哪個外掛可以做到 XXX 功能?」而我的回答往往是:「有是有,但…」這個「但」後面,通常跟著一長串的效能隱憂、安全性風險,或是功能太過臃腫的抱怨。
你是不是也常有這種經驗?為了一個小小的功能,安裝了一個龐大的外掛,結果網站變慢、後台選項多到眼花撩亂,甚至跟其他外掛打架,搞到網站白畫面給你看。身為工程師,這種感覺就像是想鎖個螺絲,卻搬出一整套瑞士刀,結果還找不到對的起子頭。夠了,真的夠了!今天,就讓我帶你走進 WordPress 外掛開發入門與實作 的世界,從一個空白的 php 檔案開始,打造一個真正屬於你、乾淨、高效的神器!
為何要自己開發外掛?告別外掛全家桶的臃腫與風險
在我們動手寫第一行程式碼之前,我想先囉嗦一下,為什麼「自己動手寫」這麼重要。市面上有數萬個免費及付費外掛,為什麼我們不直接拿來用就好?
- 精準滿足需求: 你只需要一個功能,就只寫那個功能的程式碼。不用載入一堆你永遠用不到的設定、腳本和樣式。這就像訂製西裝跟買成衣的差別,絕對合身!
- 效能就是王道: 每多一個外掛,就多一份潛在的效能負擔。自己寫的外掛,程式碼乾淨俐落,沒有多餘的資料庫查詢、沒有不必要的 HTTP 請求,網站速度自然快人一等。
- 安全性掌握在自己手上: 你知道你寫的每一行程式碼是做什麼用的。不用擔心外掛作者疏忽留下後門,或是久未更新成為駭客的攻擊目標。參考一下我們之前寫的 WordPress 終極安全指南,你就知道這有多重要了。
- 無可取代的學習曲線: 當你開始寫自己的外掛,你會真正深入了解 WordPress 的運作核心,這對你未來解決各種疑難雜症有著莫大的幫助。
說到底,自己開發外掛,就是拿回網站的「完全控制權」。好了,工程師的說教時間結束,我們來捲起袖子,看看一個外掛到底是怎麼組成的。
解剖 WordPress 外掛:一個外掛的「基本骨架」長怎樣?
很多人以為寫外掛很複雜,需要很多檔案、很酷的框架。錯!一個最最基本、能在 WordPress 後台被辨識出來的外掛,只需要一個 PHP 檔案就夠了。關鍵就在於檔案開頭的「外掛標頭 (Plugin Header)」。
必備的「外掛標頭」(The Essential Plugin Header)
這個標頭其實就是一段特殊格式的註解,用來告訴 WordPress:「嘿!我是一個外掛,這是我的基本資料。」WordPress 會掃描 wp-content/plugins 資料夾內所有 PHP 檔案的開頭,只要找到這個格式,就會把它列在你的外掛清單裡。
這是一個標準的範例:
<?php
/**
* Plugin Name: 浪花科技-文章字數統計
* Plugin URI: https://roamer-tech.com/
* Description: 這是一個教學用的外掛,可以在文章結尾自動加上字數統計。
* Version: 1.0.0
* Requires at least: 5.2
* Requires PHP: 7.2
* Author: Eric @ Roamer Tech
* Author URI: https://roamer-tech.com/author/eric/
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: rt-word-count
* Domain Path: /languages
*/
// 如果這個檔案不是被 WordPress 載入,而是直接被存取,就直接終止,防止漏洞
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// 你的外掛程式碼會寫在這裡...
這裡面,最重要的就是 Plugin Name,只要有這一行,你的外掛就能被辨識。其他的欄位則是幫助使用者(和你自己)了解這個外掛的用途、版本、作者等資訊。特別注意那個 if ( ! defined( 'ABSPATH' ) ) 檢查,這是一個基本的安全措施,務必加在每個外掛檔案裡!
檔案與資料夾結構的最佳實踐
雖然一個檔案就能運作,但當你的外掛功能越來越複雜時,把所有東西都塞在同一個檔案裡會是場災難。一個比較專業的結構會長這樣:
/my-awesome-plugin(外掛主資料夾)my-awesome-plugin.php(主檔案,包含外掛標頭)/includes(存放 PHP 核心功能、類別)/assets(存放靜態資源)/css(存放 CSS 樣式表)/js(存放 JavaScript 腳本)/images(存放圖片)
/languages(存放語系檔 .po, .mo)
養成好習慣,從一開始就把檔案分門別類放好,未來的你會感謝現在的自己。
WordPress 的靈魂:Hooks (勾點) 到底是什麼?
如果說外掛標頭是外掛的身份證,那 Hooks 就是外掛跟 WordPress 核心溝通的唯一語言。沒有 Hooks,你的外掛就只是一段無法執行、與世隔絕的 PHP 程式碼。想深入了解 Hooks,可以參考我寫的另一篇 Action & Filter Hooks 指南。
簡單來說,WordPress 在執行的過程中,會在數千個時間點或事件點大喊:「嘿!我現在要載入頁首囉!」、「嘿!我要把文章內容顯示出來囉!」。而你的外掛就可以透過 Hooks「勾」住這些時間點,去執行你想要做的事。
Hooks 主要分為兩種:
1. Action Hooks (動作勾點):在特定時間點「執行」某些事
你可以把 Action 想像成鬧鐘。當 WordPress 執行到某個點(例如:wp_head、wp_footer),你的鬧鐘就響了,然後你就去執行你設定好的函式(例如:載入一段 JS、輸出一行 HTML)。使用的函式是 add_action()。
2. Filter Hooks (過濾勾點):在資料處理過程中「修改」某些內容
你可以把 Filter 想像成生產線上的品管員。當一筆資料(例如:文章標題、文章內容)要從資料庫拿出來顯示在畫面上之前,會先經過你這位品管員。你可以檢查它、修改它、甚至替換它,然後再放行。使用的函式是 add_filter()。
理論講完了,我知道你已經迫不及待想寫點東西了。我們馬上來實戰!
實戰演練:打造一個「文章字數統計」外掛
這個範例非常適合新手,它只用到一個 Filter Hook,但能讓你完整體驗從無到有的開發流程。
Step 1: 建立外掛檔案與標頭
首先,在你的 WordPress 網站的 wp-content/plugins/ 資料夾中,建立一個新的 PHP 檔案,命名為 rt-word-count.php。然後把上面提到的外掛標頭複製進去。
Step 2: 構思邏輯
我們的目標是在每一篇文章的內容「後面」,加上一行「本文總字數:XXX 字」。
- 時機點: 當 WordPress 要顯示文章內容時。
- 要處理的資料: 文章的內容 (content)。
- 要做的事: 取得文章內容,計算字數,然後把「字數統計」這段文字附加到原始內容的後面,再回傳出去。
聽起來,這完全就是 Filter Hook 的工作!而 WordPress 剛好就提供了一個完美的勾點,叫做 the_content。
Step 3: 編寫核心程式碼
在你的 rt-word-count.php 檔案中,加入以下程式碼:
function rt_add_word_count_to_content( $content ) {
// 我們只希望這個功能作用在「文章」頁面,而不是首頁或彙整頁
if ( is_single() && ! is_admin() ) {
// 移除 HTML 標籤,避免計算到標籤本身
$stripped_content = strip_tags( $content );
// 使用 mb_strlen 來正確計算中文字數,而不是用 strlen
$word_count = mb_strlen( $stripped_content );
// 準備要附加的 HTML
$word_count_html = '<p><strong>本文總字數:' . $word_count . ' 字</strong></p>';
// 將字數統計附加到原始內容的後面
$content .= $word_count_html;
}
// 務必!務必!務必!把處理完的 $content 回傳出去,不然你的文章內容會變空白!
return $content;
}
// 將我們的函式掛到 'the_content' 這個 filter hook 上
add_filter( 'the_content', 'rt_add_word_count_to_content' );
這裡有幾個工程師的囉嗦提醒:
is_single() && ! is_admin(): 這是一個條件判斷,確保我們的功能只在前端的文章內頁執行。你不會想在後台編輯器或網站首頁列表看到字數統計吧?mb_strlen(): 對於處理多位元組字元(例如繁體中文)的網站來說,這是必須的。如果用strlen(),一個中文字會被算成 3 個字元,那就糗了。return $content;: 這是 Filter 的鐵則!你從勾點拿到了資料,處理完之後,一定要把它回傳回去。忘記這行的下場,通常就是網頁上一片空白,然後開始懷疑人生。
Step 4: 啟用與測試
儲存檔案後,到你的 WordPress 後台 > 外掛 > 已安裝的外掛。你應該會看到一個名為「浪花科技-文章字數統計」的新外掛。點擊「啟用」。
現在,去你的網站前台,隨便打開一篇文章,滑到最底下看看。如果一切順利,你就會看到那行神奇的字數統計出現了!恭喜你,你完成了你的第一個 WordPress 外掛!
從「能動」到「專業」:外掛開發的進階心法
完成第一個外掛只是開始。要成為一個專業的開發者,還有幾件事你必須放在心上。
- 安全性第一: 處理任何來自使用者的輸入(例如表單),都必須經過嚴格的驗證 (Validation) 與清理 (Sanitization)。如果你需要處理表單提交,一定要使用 Nonce 來防止 CSRF 攻擊。這又是另一個大主題,你可以先參考這篇文章。
- 國際化 (i18n): 如果你希望你的外掛能被全世界的人使用,就要把所有顯示在介面上的字串,用 WordPress 提供的函式(如
__(),_e())包起來,方便其他人製作語系檔。 - 遵循編碼標準: 你的程式碼不只是給電腦跑的,也是給未來的你和其他開發者看的。遵循 WordPress Coding Standards,寫出乾淨、易讀、好維護的程式碼,這是一個專業工程師的基本素養。
你的外掛開發之旅,才正要開始
從一個簡單的標頭,到學會使用 Hooks 與 WordPress 核心互動,你已經跨出了最重要的一步。WordPress 的強大之處,就在於它透過 Hooks 開放了無限的客製化可能性。今天你學會了加字數統計,明天你就可以嘗試建立自己的 Shortcode,後天甚至可以打造一個客製化的後台管理介面。
記住,每個複雜的大型外掛,都是從這些基本功層層堆疊起來的。不斷練習、不斷嘗試,你會發現 WordPress 開發的世界比你想像的更寬廣、更有趣。
延伸閱讀
當你對基礎感到熟悉後,推薦你繼續深入以下主題:
- 想寫自己的 WordPress 外掛?別再只會複製貼上!資深工程師帶你從零打造第一個外掛
- 解鎖 WordPress 的任督二脈:搞懂 Action & Filter Hooks,你的客製化功力瞬間爆發!
- 解鎖 WordPress 的隱藏力量:functions.php 終極實戰指南,讓你的網站秒變客製化神器!
當然,如果你遇到了更複雜的商業邏輯、需要串接第三方 API,或是企業級的客製化需求,那可能就不是一個下午能解決的問題了。這時候,歡迎聯絡我們浪花科技,讓我們的專業團隊為你打造最穩定、高效的解決方案!
常見問題 (FAQ)
Q1: 開發 WordPress 外掛需要具備哪些基礎?
A: 至少需要具備基礎的 PHP 語法知識。了解 HTML 和 CSS 也是必須的,如果你的外掛需要互動功能,那麼 JavaScript (或 jQuery) 也會派上用場。最重要的是,要有一顆樂於學習和解決問題的心!
Q2: 最簡單的 WordPress 外掛需要包含哪些檔案?
A: 嚴格來說,只需要一個 PHP 檔案。這個檔案的開頭必須包含符合 WordPress 規範的「外掛標頭」註解,其中至少要有 `Plugin Name` 這一行,這樣 WordPress 才能在後台識別出它是一個外掛。
Q3: `add_action` 和 `add_filter` 到底有什麼不同?
A: 簡單來說,`add_action` 是用來在特定的「時間點」去「執行」一個動作,它通常不會回傳任何東西。例如,在網頁頁尾加上一段追蹤碼。而 `add_filter` 則是在一筆「資料」要被使用前,去「過濾修改」它,它必須接收傳入的資料,處理完後再把資料回傳出去。例如,修改文章標題的文字。
Q4: 我寫的外掛要如何確保安全性?
A: 這是個大哉問,但有幾個基本原則:1. 永遠不要信任使用者的輸入,對所有傳入的資料進行驗證(Validation)與清理(Sanitization)。 2. 在處理表單提交時,使用 WordPress Nonces 來防止 CSRF 攻擊。 3. 避免直接執行 SQL 查詢,盡量使用 WordPress 內建的函式(如 `$wpdb->prepare()`)來操作資料庫。 4. 確保檔案有 `if ( ! defined( ‘ABSPATH’ ) ) { exit; }` 的安全檢查。






