解鎖 WordPress 的任督二脈:搞懂 Action & Filter Hooks,你的客製化功力瞬間爆發!
嗨,我是浪花科技的資深工程師 Eric。在 WordPress 的世界裡打滾久了,常常會遇到一些新手或從其他領域轉來的開發者問我:「Eric,WordPress 到底強在哪裡?為什麼一個看似簡單的部落格系統,可以變成購物車、論壇,甚至是預約系統?」
我的答案總是很簡單:「Hooks」。
沒錯,就是 Hooks(鉤點)。如果你把 WordPress 想像成一棟精密的建築,那 Hooks 就是預先埋設在牆壁、地板和天花板裡的電源插座和管線出口。它讓你可以隨時隨地「掛上」自己的新功能,或是「過濾」修改既有的東西,而完全不需要去動到建築物本身的核心結構。搞懂了 Hooks,你才算是真正踏入了 WordPress 開發的殿堂,從一個只會安裝外掛的使用者,蛻變成能隨心所欲打造功能的開發者。
今天,我就要帶你打通 WordPress 開發的「任督二脈」,徹底搞懂 Hooks 家族裡最重要的兩大核心成員:Action Hooks 和 Filter Hooks。別怕,我會用最白話的方式,搭配實戰程式碼,讓你一次就上手。準備好了嗎?泡杯咖啡,我們開始吧!
什麼是 WordPress Hooks?一切魔法的起點
在我們深入探討 Action 和 Filter 的差異之前,得先建立一個共同的認知:到底什麼是 Hooks?
簡單來說,Hooks 是 WordPress 核心、主題和外掛中,刻意安插的一些「事件觸發點」。當 WordPress 執行到這些點時,它會大喊一聲:「嘿!我現在要執行『這個』動作了喔!有沒有人想跟著做點什麼事?」或者「嘿!我這裡有『這筆』資料要輸出了,有沒有人想在輸出前對它動點手腳?」
這就給了我們開發者一個絕佳的機會,可以撰寫自己的 PHP 函式,然後告訴 WordPress:「有!當你執行到那個點的時候,順便幫我跑一下我這個函式!」
而這個「掛上」我們自訂函式的機制,就分為兩大類:
- Action Hooks (動作鉤點): 用來在特定時間點「執行」某些動作。就像是鬧鐘響了,你就該起床刷牙。
- Filter Hooks (過濾器鉤點): 用來在資料處理過程中「修改」某些資料。就像是工廠生產線上的品管員,把不合格的產品挑出來,或是在產品出廠前多加一個漂亮的包裝。
聽起來還是有點抽象?沒關係,接下來我們一個一個拆解,保證讓你豁然開朗。
Action Hooks:WordPress 的「事件通知器」
Action Hook 的核心精神是「在某個時間點,做某件事 (Do Something)」。它不關心資料的內容,它只在乎「時機」。當 WordPress 執行到某個特定的流程,例如「文章發佈前」、「使用者登入後」、「網頁頁首載入時」,對應的 Action Hook 就會被觸發。
這時候,所有掛載在這個 Action Hook 上的函式,就會依照你設定的優先級,一個一個被執行。重點來了,Action 函式不需要回傳任何東西 (return value)。它就是單純地去執行一個任務,執行完就拍拍屁股走人。
實戰演練:用 `add_action` 在網站頁尾加上分析代碼
最常見的例子,莫過於在網站的 `<head>` 或頁尾加入 Google Analytics、Facebook Pixel 這類的追蹤碼了。你當然可以直接修改主題的 `header.php` 或 `footer.php` 檔案,但這是一個非常糟糕的作法。為什麼?因為只要主題一更新,你加的程式碼就會被蓋掉,一切心血付諸流水。這時候,就是 Action Hook 登場的最佳時機。
WordPress 提供了一個非常方便的 Action Hook 叫做 `wp_footer`,它會在網站 `</body>` 標籤關閉前觸發。我們只要把我們的追蹤碼函式掛上去就行了。
你可以把這段程式碼加到你的子佈景主題的 `functions.php` 檔案中:
/**
* 在網站頁尾加入自訂的追蹤腳本
*/
function roamer_add_footer_scripts() {
// 只有在非登入狀態下才載入
if ( ! is_user_logged_in() ) {
echo "<!-- Your Tracking Script Starts -->\n";
echo "<script>\n";
echo " console.log('哈囉,我是 Eric 埋設的頁尾腳本!');\n";
echo " // 在這裡貼上你的 Google Analytics 或其他追蹤碼\n";
echo "</script>\n";
echo "<!-- Your Tracking Script Ends -->\n";
}
}
// 將我們的函式掛載到 'wp_footer' 這個 Action Hook 上
add_action( 'wp_footer', 'roamer_add_footer_scripts' );
看到了嗎?我們定義了一個 `roamer_add_footer_scripts` 函式,然後用 `add_action()` 告訴 WordPress:「嘿,當你跑到 `wp_footer` 這個點的時候,麻煩幫我執行一下 `roamer_add_footer_scripts` 這個函式喔!」
`add_action()` 函式通常會接收四個參數,不過最常用的是前兩個:
$hook_name(字串,必填): 你要掛載的 Action Hook 名稱,例如 `’wp_footer’`、`’wp_head’`、`’save_post’`。$callback(函式名稱,必填): 你要執行的函式名稱,例如 `’roamer_add_footer_scripts’`。$priority(整數,選填): 執行優先級,數字越小越先執行。預設是 10。$accepted_args(整數,選填): 你的函式準備接收幾個參數。預設是 1。
就這麼簡單!從此以後,不管你的主題怎麼更新,這段追蹤碼都會穩穩地待在頁尾,這就是 Hooks 的威力。
Filter Hooks:WordPress 的「資料修改器」
如果說 Action Hook 是個盡忠職守的執行者,那 Filter Hook 就是個吹毛求疵的品管員。它的核心精神是「修改某個東西 (Change Something)」。
當 WordPress 準備要處理一筆資料(例如文章標題、內容摘要、圖片的 HTML 屬性等)時,它會先把這筆「原始資料」透過 Filter Hook 傳出來,問問大家:「嘿,這是原始資料,有沒有人想對它加工一下?」
這時候,所有掛載在這個 Filter Hook 上的函式,就會像接力賽一樣,一個接一個地拿到這筆資料,對它進行修改,然後再把「修改後」的資料傳給下一個人。所以,Filter 函式最重要的一點,就是最後一定要 `return` 回傳修改後的資料!
(工程師的小囉嗦:這點真的要畫大大的紅線!我剛入門時,最常犯的錯就是寫了 Filter 卻忘了 `return`,結果就是本來該顯示標題的地方變一片空白,Debug 搞了半天。一個不小心,整個網站的重要資料就可能消失不見,切記切記!)
實戰演練:用 `add_filter` 自訂文章摘要的「繼續閱讀」文字
WordPress 的文章摘要 (Excerpt) 預設會在最後面顯示 `[…]`。如果我們想把它改成更友善的「…繼續閱讀」,Filter Hook 就是你的好朋友。
WordPress 提供了一個叫做 `excerpt_more` 的 Filter Hook,它專門用來過濾那個 `[…]` 符號。我們來動手改掉它!
同樣地,把這段程式碼加到你的子佈景主題的 `functions.php` 檔案中:
/**
* 自訂文章摘要結尾的文字
*
* @param string $more 原始的摘要結尾文字,也就是 '[...]'
* @return string 修改後的結尾文字
*/
function roamer_custom_excerpt_more( $more ) {
// 取得目前文章的永久連結
$post_link = get_permalink();
// 回傳一個帶有連結的「繼續閱讀」文字
return '... <a class="read-more" href="' . esc_url( $post_link ) . '">繼續閱讀</a>';
}
// 將我們的函式掛載到 'excerpt_more' 這個 Filter Hook 上
add_filter( 'excerpt_more', 'roamer_custom_excerpt_more' );
看看我們的 `roamer_custom_excerpt_more` 函式,它接收了一個參數 `$more`(也就是原始的 `[…]`),然後完全不理它,直接回傳了我們自己組合的 HTML 字串。這就是 Filter 的精髓:接收、處理、回傳。
如果你忘了寫 `return` 那一行,那所有文章摘要的結尾都會變成空白,因為你把資料「吃掉」了,沒有把它還給 WordPress 繼續處理。
Action vs. Filter 終極對決:一張圖看懂差異
說了這麼多,我們來做個總結。到底什麼時候該用 Action,什麼時候該用 Filter?這可是 WordPress 開發者的面試必考題!
核心差異:一個做事,一個改資料
- 用途:
– Action: 在特定「時間點」觸發「動作」。例如:發佈文章後寄送 Email 通知、使用者登入後更新個人資料。
– Filter: 在處理「資料」的過程中進行「修改」。例如:改變文章標題、過濾留言內容、增加使用者個人資料欄位。 - 回傳值:
– Action: 不需要 `return`。它只是執行,不回傳東西。
– Filter: 必須要 `return`。你必須把修改後的資料回傳,否則資料會遺失。 - 對應函式:
– Action: 使用 `add_action()` 來掛載函式,`do_action()` 來觸發鉤點。
– Filter: 使用 `add_filter()` 來掛載函式,`apply_filters()` 來觸發鉤點。
你可以這樣問自己:「我是想『做』一件事,還是想『改』一個東西?」
如果答案是「做」,例如「發送通知信」、「紀錄日誌」、「載入 JS 檔」,那你就該用 Action。
如果答案是「改」,例如「把『你好』改成『哈囉』」、「在文章內容前加上作者介紹」,那你就該用 Filter。
結論:打通任督二脈,釋放 WordPress 的真正潛力
今天我們從 Hooks 的基本概念,一路深入到 Action 和 Filter 的核心差異與實戰應用。希望你現在能體會到,為什麼我會說 Hooks 是 WordPress 的「任督二脈」。
掌握了 Action 和 Filter,你就不再被主題和外掛的功能所限制。你可以自由地在 WordPress 的各個生命週期中,注入你的程式碼、修改輸出的資料,打造出真正符合客戶需求的客製化網站。這不僅是技術上的躍進,更是思維上的解放。
當然,WordPress 的 Hooks 宇宙遠不止於此,還有優先級的控制、參數的傳遞、如何移除其他外掛的 Hooks 等等進階玩法。但只要你牢牢記住「Action 是做事,Filter 是改資料」這個核心金律,你就已經走在正確的道路上了。
如果你在實作上遇到任何問題,或是對於更複雜的客製化需求(例如串接 API、打造客製化後台功能)感到頭痛,別忘了浪花科技的團隊隨時都在這裡。我們專注於解決 WordPress 的各種疑難雜症,讓你的網站不只是一個網站,而是一個強大的商業工具。
對 WordPress 深度客製化或效能調校有興趣嗎?歡迎點擊這裡,填寫表單與我們的資深工程師聊聊!讓我們一起打造更強大的 WordPress 網站。
延伸閱讀
- 解鎖 WordPress 的隱藏力量:functions.php 終極實戰指南,讓你的網站秒變客製化神器!
- 想寫自己的 WordPress 外掛?別再只會複製貼上!資深工程師帶你從零打造第一個外掛
- 別再把 WordPress 當部落格!資深工程師手把手 CPT 實戰,打造真正客製化的網站後台
常見問題 (FAQ)
Q1: WordPress Hooks 到底是什麼?
A1: Hooks 是 WordPress 核心、主題與外掛中預留的程式碼「錨點」或「事件點」。它允許開發者在不修改核心檔案的情況下,透過掛載自己的函式來新增功能(Action Hooks)或修改資料(Filter Hooks),是 WordPress 保持高度彈性與擴充性的關鍵機制。
Q2: Action Hook 和 Filter Hook 最主要的差別是什麼?
A2: 最主要的差別在於「用途」和「回傳值」。Action Hook 用於在特定時間點「執行」一個動作,它不需要回傳任何值。而 Filter Hook 則是用於「修改」傳遞中的資料,它必須接收一個值,處理後再把修改完的值回傳(return)回去。
Q3: 我什麼時候該用 Action,什麼時候該用 Filter?
A3: 一個簡單的判斷方法是問自己:我是想「做」一件事,還是想「改」一個東西?如果你想在文章發佈後寄送 Email 通知,這是「做」一件事,應該用 Action。如果你想把文章標題全部轉為大寫,這是「改」一個東西,就應該用 Filter。
Q4: 忘記在 Filter 函式中 `return` 資料會發生什麼事?
A4: 這是新手開發者最常犯的嚴重錯誤!如果你在 Filter 函式中沒有回傳(return)任何資料,等於是把傳進來的資料直接「丟掉」了。這會導致原本應該顯示資料的地方(例如文章標題、內容)變成空白或出錯,嚴重時甚至可能造成網站部分功能癱瘓。所以,寫 Filter 時務必記得最後要 `return` 資料!






