Action vs. Filter 不再是選擇題!WordPress Hooks 實戰情境指南,秒懂何時『執行』何時『修改』
☰ 目錄 table-of-contents.md
該用 Action Hook 還是 Filter Hook,是無數 WordPress 開發者(包括當年的我)反覆卡關的十字路口,也是區分新手與老鳥的關鍵分水嶺。定義背得滾瓜爛熟,遇到實戰情境照樣滿頭問號——因為關鍵從來不是定義,而是分清楚這一刻你要的是「執行一件事」還是「修改一個值」。這篇用實戰情境一次釐清,讓 Hooks 從選擇題變成反射動作。
今天,我不想再跟你談那些教科書上的理論。我們直接開門見山,用實際的開發情境來解剖這對看似雙胞胎、實則性格迥異的兄弟。這篇文章就是你的實戰情境指南,讀完之後,你將能建立一個清晰的思維模型,在未來任何客製化需求中,都能像呼吸一樣自然地選對工具。別再猜了,我們工程師靠的是邏輯,不是運氣!
Hooks 的核心精神:WordPress 的『事件驅動』架構
在我們深入探討 Action 和 Filter 的差異之前,你得先理解 WordPress 的核心運作哲學——「事件驅動」(Event-Driven)。你可以把整個 WordPress 的運作流程想像成一條正在運行的生產線。
- 核心程式(Core): 就像生產線的機器,負責主要工作,例如從資料庫撈取文章、準備顯示頁面等。
- Hooks(掛鉤): 在這條生產線的特定節點上,WordPress Core 會大喊一聲:「嘿!我現在要準備顯示文章標題了!」、「我正要儲存這篇文章囉!」、「網站頁尾準備要輸出了!」。這些「廣播」的節點,就是所謂的 Hooks。
- 你的客製化程式碼(外掛或主題): 就像是站在生產線旁邊的技術員。你聽到了這些廣播(Hooks),然後決定要做點什麼。
而你要做的「什麼」,就決定了你該用 Action 還是 Filter。這就是整個 WordPress 能夠如此靈活、具備高度擴充性的秘密所在。不是去修改核心程式碼(這是天大的禁忌!),而是透過這些預留的「掛鉤」來注入你自己的邏輯。
Action Hooks:在對的時間點,做對的事
核心概念:『我聽到了,我執行!』
Action Hook 的核心精神非常單純:在某個特定的事件發生時,去執行一個指定的動作。它就像一個鬧鐘,時間到了就響,提醒你該做某件事了。這個「動作」本身是獨立的,它不關心也不會修改生產線上的原料。它只負責「做」事,做完就拍拍屁股走人,對主流程的數據不造成任何改變。
簡單來說,Action 是「執行者」,它的任務是產生「副作用」(Side Effect),例如:
- 發送一封 Email。
- 將資料寫入日誌檔。
- 呼叫一個外部 API。
- 在頁面上輸出一段 HTML(例如 `echo` 一段 script)。
記住,Action 的回呼函式(Callback Function)不需要 `return` 任何東西。它只是個默默耕耘的實踐家。
實戰情境一:新文章發佈時,自動發送到 LINE 通知
需求: 內容團隊希望每當有新文章被發佈時,能自動發送一個通知到他們的 LINE 群組,方便大家即時分享。
思維過程:
- 事件是什麼?「文章被發佈」。
- 要做什麼事?「發送 LINE 通知」,這是一個獨立的動作,一個副作用。
- 需要修改文章本身嗎? 不需要。我不是要改文章標題或內容,只是要利用「發佈」這個時機點去做另一件事。
結論: 這是典型的 Action 場景。我們需要掛載在 WordPress 發佈文章的 hook `publish_post` 上。
<?php
/**
* 當文章發佈時,發送 LINE Notify 通知
* 我們會將這段程式碼放在主題的 functions.php 或是一個自訂外掛中
*/
add_action('publish_post', 'send_line_notification_on_publish', 10, 2);
function send_line_notification_on_publish($post_ID, $post) {
// 確保這是一個新發佈的文章,而不是更新舊文章
$post_status = get_post_status($post_ID);
if ($post->post_date !== $post->post_modified || $post_status !== 'publish') {
return;
}
// 這裡只是個囉嗦的工程師提醒:在正式專案中,Token 這種敏感資訊千萬別寫死!
// 最好是儲存在後台設定頁面,或是用環境變數管理。
$token = '你的_LINE_NOTIFY_權杖';
$message = '新文章發佈啦!\n標題:' . $post->post_title . '\n網址:' . get_permalink($post_ID);
// 使用 WordPress 內建的 HTTP API 來發送請求
wp_remote_post('https://notify-api.line.me/api/notify', [
'headers' => [
'Authorization' => 'Bearer ' . $token,
],
'body' => [
'message' => $message,
],
]);
}
?>
你看,`send_line_notification_on_publish` 這個函式執行了它的任務(呼叫 LINE API),但它沒有 `return` 任何值來改變 WordPress 的核心流程。
Filter Hooks:改變流經的資料,打造獨一無二的內容
核心概念:『交給我,我改完再還你!』
Filter Hook 則完全不同,它是個「加工者」或「審查員」。當生產線上的原料(資料)流到它這裡時,它會把原料拿起來,進行一番修改、加工、或是審查,然後必須把處理完的原料放回生產線,讓流程繼續下去。
Filter 的核心精神是:接收一個值,對它進行修改,然後回傳這個值。如果它不回傳任何東西,那就等於把原料從生產線上拿走丟掉了,這會導致災難性的後果(通常是網站出現空白或錯誤)。
Filter 的任務是「修改」資料,例如:
- 修改文章的標題。
- 在文章內容的結尾追加版權聲明。
- 變更一個查詢的參數陣列。
- 客製化 WooCommerce 的價格顯示格式。
最關鍵的一點,我必須再囉嗦一次:Filter 的回呼函式 一定、務必、絕對要 `return` 一個值!
實戰情境二:自動為特定分類的文章標題加上前綴
需求: 網站上有個「產業新聞」分類,客戶希望所有屬於這個分類的文章,標題在顯示時都能自動加上 `[產業新聞]` 的前綴,以提高辨識度。
思維過程:
- 事件是什麼?「文章標題要被顯示出來時」。
- 要做什麼事?「修改文章標題這個字串」。
- 這是在做獨立的事嗎? 不是,我是在改變既有的資料(標題)。
結論: 這是標準的 Filter 應用。我們要使用的是 `the_title` 這個 filter hook。
<?php
/**
* 為特定分類的文章標題加上前綴
* 同樣地,放在 functions.php 或自訂外掛
*/
add_filter('the_title', 'add_prefix_to_news_title', 10, 2);
function add_prefix_to_news_title($title, $id = null) {
// 我們只在主循環中且文章屬於 'news' 這個分類時才加上前綴
// is_admin() 是為了避免在後台也加上前綴,那會很亂
if (is_singular() && in_the_loop() && !is_admin() && has_category('news', $id)) {
return '[產業新聞] ' . $title;
}
// 工程師的堅持:務必記得,在不符合條件時,要將原始的 $title 原封不動地回傳!
// 否則其他所有文章的標題都會變成空白!
return $title;
}
?>
看到關鍵了嗎?`return '[產業新聞] ' . $title;` 和 `return $title;`。無論如何,這個函式都確保了有一個標題字串被送回主流程,這就是 Filter 的天職。
Action vs. Filter 終極思維模型:一個簡單的判斷法則
好了,看了這麼多,我們來提煉一個萬用的思維模型。當你下次遇到一個需求時,問自己一個問題:
「我的目的是『觸發一個獨立的動作』,還是『修改一個既有的資料』?」
- 觸發動作(Do Something): 你的程式碼是「事件的結果」,它本身不影響事件的源頭。像是「文章發佈了,所以我去發通知」。這就是 Action。
- 修改資料(Change Something): 你的程式碼是「流程的一部分」,它攔截資料、加工、再放行。像是「標題要顯示了,我把它改成...」。這就是 Filter。
再囉嗦一個小細節:有時候你會看到有人用 Action 來 `echo` 一些內容,例如 `add_action('wp_footer', function() { echo '
結語:Hooks 不只是工具,更是 WordPress 的開發哲學
搞懂 Action 和 Filter 的差異,不僅僅是學會兩個函式 `add_action()` 和 `add_filter()`。更重要的是,你開始理解了 WordPress 那種「非侵入式」的開發哲學。它鼓勵我們像個外科醫生一樣,在精準的位置(Hooks)進行手術,而不是把整個系統開膛剖肚。這讓我們的程式碼更有組織、更容易維護,也更容易與其他上千個外掛和平共存。
希望這篇充滿工程師碎碎念的實戰指南,能讓你對 WordPress Hooks 有更深刻的體悟。下次當你打開 `functions.php` 或開始寫你的第一個外掛時,你面對的將不再是選擇題,而是一條清晰的康莊大道。
相關閱讀
- 別再只會裝外掛!資深工程師手把手,帶你從零打造第一個 WordPress 神器
- 不只會用,更要會『造』!WordPress Hooks 終極實戰:從自訂 Action/Filter 到打造可擴展外掛架構
- 解鎖 WordPress 的隱藏力量:functions.php 終極實戰指南,讓你的網站秒變客製化神器!
如果你在 WordPress 開發上遇到了更複雜的挑戰,或是需要為你的企業打造一個高度客製化、穩定又高效的網站系統,這正是我們浪花科技的專業所在。我們專注於深入 WordPress 核心,提供的不只是網站,而是一個能隨著你業務成長的不斷演化的數位引擎。歡迎點擊這裡,填寫表單與我們聯繫,讓我們的專業團隊為你規劃最適合的技術解決方案。
常見問題
WordPress 的 Action Hook 和 Filter Hook 有什麼差別?
為什麼 Filter 的回呼函式一定要 return 一個值?
文章發佈時自動發送通知,應該用 Action 還是 Filter?
WordPress 的 Hooks 機制背後的設計哲學是什麼?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。