WordPress 開發的任督二脈:搞懂 Action & Filter Hooks,客製化功力大爆發!

2025/02/28 | WP 開發技巧, 技術教學資源

WordPress 開發的任督二脈:搞懂 Action & Filter Hooks,客製化功力大爆發!

嗨,我是浪花科技的資深工程師 Eric。在 WordPress 的世界裡打滾了這麼多年,我看過太多令人匪夷所思的程式碼。其中最讓我頭痛的,莫過於直接修改佈景主題或核心檔案的「駭客」行為了。每次看到有人直接在 `twentytwentyfour` 主題的 `functions.php` 裡加功能,我的血壓就會不自覺地升高。拜託,各位朋友,我們有更優雅、更專業、更不會在更新後讓你哭著找備份的方法——那就是今天的主角:WordPress Hooks(鉤子)。

搞懂 Hooks,就像打通了 WordPress 開發的任督二脈。它不僅是外掛和佈景主題能夠和諧共存的基石,更是你從一個「套版工」晉升為「開發者」的必經之路。今天,就讓我這個有點囉嗦的工程師,帶你徹底搞懂 Action Hooks 和 Filter Hooks 這對兄弟,讓你的客製化功力瞬間 Level Up!

什麼是 WordPress Hooks?為什麼它這麼重要?

你可以把 WordPress 核心想像成一棟已經蓋好的大樓,它有完整的結構和運作流程(例如:初始化、處理請求、查詢資料庫、渲染頁面)。而 Hooks 就像是這棟大樓在建造時,預先在牆上留好的「電源插座」和「管線接口」。

當你(開發者)需要加裝一台電器(新功能)時,你不需要去鑿牆壁、破壞結構(修改核心檔案),你只需要找到對的插座(Hook),把你的電器插頭(你的函式)插上去就行了。這就是 WordPress 的核心哲學:「程式碼是核心,功能靠外掛」(Code is Poetry, functionality is in plugins)。這種機制讓 WordPress 的核心能夠保持乾淨並安全地更新,同時又賦予了它近乎無限的擴充性。

Hooks 主要分為兩大類,它們的目標截然不同:

  • 動作鉤子 (Action Hooks): 告訴 WordPress「在某個時間點,某件事」。例如:在頁面載入完成後,執行一段 JavaScript。
  • 過濾器鉤子 (Filter Hooks): 告訴 WordPress「在處理某個資料時,讓我一下內容」。例如:在顯示文章標題前,在標題後面加上「HOT!」字樣。

聽起來很簡單?別急,魔鬼藏在細節裡。讓我們一個一個來拆解。

動作鉤子 (Action Hooks): 在對的時間點,做對的事

Action Hooks 就像是系統中的「事件廣播」。當 WordPress 執行到某個特定的點,例如 `wp_head`(在 `<head>` 區塊輸出內容時)或 `save_post`(儲存一篇文章時),它就會大喊一聲:「嘿!我現在要執行 `wp_head` 了喔!有沒有人要順便做點什麼事?」這時,所有掛載(hook)到這個 Action 上的函式就會依序被觸發執行。

`add_action()`: 註冊你的動作

要將你的函式掛載到一個 Action Hook 上,我們使用 `add_action()` 函式。它的基本語法是:

add_action( 'hook_name', 'your_function_name', $priority, $accepted_args );

  • `hook_name` (必需): 你想要掛載的 Action Hook 的名稱,例如 `’wp_footer’`。
  • `your_function_name` (必需): 你自己定義的、要執行的函式名稱。
  • `$priority` (可選): 執行優先級,是一個整數,預設為 10。數字越小,越早執行。這就像排隊,數字 9 的人會排在數字 10 的人前面。
  • `$accepted_args` (可選): 你的函式準備接收多少個參數,預設為 1。有些 Hook 在觸發時會傳遞一些有用的資訊(如文章 ID),你必須在這裡聲明你的函式會接收它們。

實戰演練:在網站頁尾加入追蹤碼

這是一個超經典的例子。假設我們想在每個頁面的 `</body>` 標籤前加入一個第三方的追蹤腳本。最乾淨的做法就是使用 `wp_footer` 這個 Action Hook。

你可以將以下程式碼加入你的子佈景主題的 `functions.php` 檔案中:


function roamer_add_tracking_script() {
    echo '<!-- Your Tracking Script Here -->';
    echo '<script>console.log("Hello from Roamer Tech Footer!");</script>';
}

add_action( 'wp_footer', 'roamer_add_tracking_script' );

就這樣!簡單兩行,WordPress 就會在每個頁面的頁尾自動執行 `roamer_add_tracking_script` 這個函式,印出你的腳本。這比直接編輯 `footer.php` 模板檔要好上一萬倍,因為即使你的佈景主題更新了,這段程式碼依然有效。

`do_action()`: 建立你自己的動作鉤子

當你開始開發自己的外掛或佈景主題時,你也會希望讓其他開發者能夠擴充你的功能。這時,你就可以使用 `do_action()` 來建立自己的鉤子。例如,在你的外掛某個功能執行完成後,你可以這樣寫:

do_action( 'my_plugin_after_form_submit', $form_data );

這樣一來,其他開發者就可以用 `add_action( ‘my_plugin_after_form_submit’, ‘some_function’, 10, 1 );` 來掛載他們的功能,並接收你傳遞的 `$form_data`。這就是 WordPress 生態系如此強大的原因,萬物皆可 Hook!這種擴充性也是WordPress REST API設計的核心理念之一。

過濾器鉤子 (Filter Hooks): 改變資料的魔法師

如果說 Action 是「執行者」,那麼 Filter 就是「改造者」。Filter Hooks 的作用是在資料被使用(例如存入資料庫或顯示在畫面上)之前,攔截它、修改它,然後再把它回傳回去。整個過程就像一個品管流程,讓你有機會在最後一刻對產品進行加工。

身為工程師,我必須囉嗦一句:Filter 函式最重要的原則就是「有進有出,再加工」。你接收一個變數,處理完之後,務必、一定、絕對要 `return` 回去! 我處理過太多次客戶網站一片空白的緊急狀況,最後發現就是某個 Filter 忘了 `return`,導致後續的程式碼拿不到資料,直接崩潰。

`add_filter()`: 掛上你的過濾器

語法和 `add_action()` 非常相似:

add_filter( 'hook_name', 'your_function_name', $priority, $accepted_args );

參數的意義完全相同,唯一的差別在於,你傳入的 `’your_function_name’` 這個函式,必須要接收至少一個參數(被過濾的資料),並且在最後要回傳處理過的結果。

實戰演練:自訂文章摘要的「繼續閱讀」文字

WordPress 預設的文章摘要結尾會顯示 `[…]`。如果我們想把它改成更有吸引力的「…繼續閱讀」,就可以使用 `excerpt_more` 這個 Filter Hook。

同樣地,將程式碼加入 `functions.php`:


function roamer_custom_excerpt_more( $more ) {
    return '... <a class="read-more" href="' . get_permalink( get_the_ID() ) . '">' . '繼續閱讀' . '</a>';
}

add_filter( 'excerpt_more', 'roamer_custom_excerpt_more' );

在這個例子中,`roamer_custom_excerpt_more` 函式接收了原始的 `$more` 變數(也就是 `[…]`),但我們沒有使用它,而是直接回傳了我們想要的、包含連結的 HTML 字串。WordPress 接收到回傳值後,就會用它來取代原本的內容。

`apply_filters()`: 建立你自己的過濾器

和 `do_action()` 對應,`apply_filters()` 讓你在自己的程式碼中建立一個「可被過濾」的點。例如:

$title = 'My Awesome Product';
$filtered_title = apply_filters( 'my_plugin_product_title', $title );
echo $filtered_title;

這樣,其他開發者就能用 `add_filter(‘my_plugin_product_title’, …)` 來修改你的產品標題,例如根據使用者地區加上不同的貨幣符號。

進階技巧與最佳實踐

如何找到可用的 Hooks?

這是我最常被問到的問題。除了查閱官方的 Hook 參考文件 之外,最直接的方式就是「看原始碼」。當你想修改某個功能時,找到對應的 WordPress 核心函式,看看裡面有沒有 `do_action()` 或 `apply_filters()`。另外,我強烈推薦安裝 Query Monitor 這個外掛,它會在後台工具列顯示目前頁面執行的所有 Hooks,簡直是開發神器。

移除既有的 Actions 和 Filters

有時候,其他外掛或佈景主題加入的 Hook 功能並不是你想要的。這時你可以用 `remove_action()` 和 `remove_filter()` 來移除它們。但這裡有個小陷阱:你必須提供跟當初 `add_action()` 或 `add_filter()` 時完全一樣的參數,包括 `hook_name`, `function_name` 和 `priority`。少一個或錯一個都無法成功移除,這點在除錯時要特別注意。

總結:Action vs. Filter,別再搞混了!

到這裡,相信你對 WordPress Hooks 已經有了深入的了解。如果還是有點模糊,記住這個最終的判斷標準:

  • Action (動作): 純粹地「執行」一個動作,它不關心資料,也不需要回傳任何東西。就像一個只會埋頭苦幹的工人。
  • Filter (過濾器): 它的唯一目的就是「修改」傳進來的資料,然後再把它交還給系統。它像是一個品管員,必須把檢驗過的產品(`return $variable`)放回產線。

掌握了 Hooks,你就掌握了 WordPress 客製化的精髓。無論是簡單的功能擴充,還是與 WP-Cron 排程等複雜系統的整合,都離不開 Hooks 的應用。當然,撰寫高效能的 Hook 函式也是網站速度優化中重要的一環,不良的程式碼可能會拖慢整個網站的速度。


延伸閱讀

需要更專業的 WordPress 技術支援嗎?

看到這裡,你是否對 WordPress 強大的客製化能力感到興奮,卻又對實際操作感到有點不知所措?別擔心,這很正常。從理解概念到熟練應用,需要時間和實戰經驗。如果你有更複雜的客製化需求、外掛開發、或是網站效能調校等問題,浪花科技的團隊隨時準備好為你提供最專業的協助。我們專注於打造高效、穩定且易於擴充的 WordPress 解決方案。

別再猶豫了,立即聯繫我們,填寫表單讓我們了解你的需求,讓我們的專業技術成為你業務成長的最強後盾!

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