外掛開發不求人!資深工程師帶你從零到一,打造你的第一個 WordPress 神器

2025/07/15 | WP 開發技巧

外掛開發不求人!資深工程師帶你從零到一,打造你的第一個 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_headwp_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 開發的世界比你想像的更寬廣、更有趣。

延伸閱讀

當你對基礎感到熟悉後,推薦你繼續深入以下主題:

當然,如果你遇到了更複雜的商業邏輯、需要串接第三方 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; }` 的安全檢查。

 
立即諮詢,索取免費1年網站保固