Action vs. Filter 不再是選擇題!WordPress Hooks 實戰情境指南,秒懂何時『執行』何時『修改』

2025/12/9 | WP 開發技巧, 技術教學資源

WordPress Hooks 實戰:Action 與 Filter 的決策法則

資深工程師 Eric 為您解析 WordPress 開發的關鍵分水嶺:Action Hook 與 Filter Hook。別再死背定義!本文以實戰情境出發,教您建立一套清晰的思維模型:Action 負責『觸發獨立動作』(無需回傳),而 Filter 則專注於『修改既有資料』(務必回傳)。掌握這套非侵入式開發哲學,讓您在任何客製化需求中都能精準選對工具,告別新手迷思。立即深入了解,將您的 WordPress 網站升級為高度擴充、穩定高效的數位引擎!

需要專業協助?

聯絡浪花專案團隊 →

Action vs. Filter 不再是選擇題!WordPress Hooks 實戰情境指南,秒懂何時『執行』何時『修改』

嗨,我是浪花科技的資深工程師 Eric。在 WordPress 的世界裡打滾這麼多年,我看過無數開發者(包括當年的我)在一個十字路口前不斷徘徊:我現在這個功能,到底該用 Action Hook 還是 Filter Hook?這問題看似簡單,卻是區分 WordPress 新手與老鳥的關鍵分水嶺。很多人背了一堆定義,結果遇到實戰情境照樣滿頭問號。

今天,我不想再跟你談那些教科書上的理論。我們直接開門見山,用實際的開發情境來解剖這對看似雙胞胎、實則性格迥異的兄弟。這篇文章就是你的實戰情境指南,讀完之後,你將能建立一個清晰的思維模型,在未來任何客製化需求中,都能像呼吸一樣自然地選對工具。別再猜了,我們工程師靠的是邏輯,不是運氣!

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 群組,方便大家即時分享。

思維過程:

  1. 事件是什麼?「文章被發佈」。
  2. 要做什麼事?「發送 LINE 通知」,這是一個獨立的動作,一個副作用。
  3. 需要修改文章本身嗎? 不需要。我不是要改文章標題或內容,只是要利用「發佈」這個時機點去做另一件事。

結論: 這是典型的 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` 一個值!

實戰情境二:自動為特定分類的文章標題加上前綴

需求: 網站上有個「產業新聞」分類,客戶希望所有屬於這個分類的文章,標題在顯示時都能自動加上 `[產業新聞]` 的前綴,以提高辨識度。

思維過程:

  1. 事件是什麼?「文章標題要被顯示出來時」。
  2. 要做什麼事?「修改文章標題這個字串」。
  3. 這是在做獨立的事嗎? 不是,我是在改變既有的資料(標題)。

結論: 這是標準的 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 ‘

版權所有

‘; });`。這本質上也是一個「副作用」(在頁尾輸出 HTML),所以用 Action 是對的。但如果你想在「文章內容」的『最前面』或『最後面』加上東西,用 `the_content` 這個 Filter 會比用 Action 更優雅、更有彈性,因為你是直接在「修改」內容字串,而不是在旁邊硬 `echo` 東西。

結語:Hooks 不只是工具,更是 WordPress 的開發哲學

搞懂 Action 和 Filter 的差異,不僅僅是學會兩個函式 `add_action()` 和 `add_filter()`。更重要的是,你開始理解了 WordPress 那種「非侵入式」的開發哲學。它鼓勵我們像個外科醫生一樣,在精準的位置(Hooks)進行手術,而不是把整個系統開膛剖肚。這讓我們的程式碼更有組織、更容易維護,也更容易與其他上千個外掛和平共存。

希望這篇充滿工程師碎碎念的實戰指南,能讓你對 WordPress Hooks 有更深刻的體悟。下次當你打開 `functions.php` 或開始寫你的第一個外掛時,你面對的將不再是選擇題,而是一條清晰的康莊大道。

相關閱讀

如果你在 WordPress 開發上遇到了更複雜的挑戰,或是需要為你的企業打造一個高度客製化、穩定又高效的網站系統,這正是我們浪花科技的專業所在。我們專注於深入 WordPress 核心,提供的不只是網站,而是一個能隨著你業務成長的不斷演化的數位引擎。歡迎點擊這裡,填寫表單與我們聯繫,讓我們的專業團隊為你規劃最適合的技術解決方案。

常見問題 (FAQ)

Q1: Action 和 Filter 最根本的差別是什麼?

最根本的差別在於「目的」和「回傳值」。Action 的目的是在特定時間點「執行一個動作」(例如發送 Email),它不修改任何資料,也「不需要回傳值」。而 Filter 的目的是「修改一個傳入的資料」(例如修改文章標題),它處理完資料後「必須回傳」修改後(或未修改)的結果,否則會導致資料遺失,造成網站錯誤。

Q2: 如果我在 Filter 的函式裡忘記 `return` 值會發生什麼事?

這是一個非常常見且嚴重的錯誤!如果你的 Filter 函式沒有 `return` 任何值,PHP 函式的預設回傳值是 `NULL`。這意味著原本要被過濾的資料(例如一篇文章的標題字串、內容 HTML)會被 `NULL` 取代。最終的結果通常是,你網站上對應的部分會變成一片空白,例如文章標題消失、內容不見,或是功能直接崩潰。所以,請務必記得,Filter 的函式一定要有 `return` 路徑!

Q3: 我可以自己建立一個新的 Hook 嗎?

當然可以,而且這正是進階 WordPress 開發的精髓!你可以使用 `do_action(‘my_custom_action_name’);` 來建立自己的 Action Hook,或用 `$modified_data = apply_filters(‘my_custom_filter_name’, $original_data);` 來建立自己的 Filter Hook。這麼做可以讓你的外掛或主題也具備擴充性,允許其他開發者(或是未來的你)在不修改你原始碼的情況下,掛載功能上去,這是一種非常優雅且強大的架構設計方式。

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