問題描述

最近我一直在看外掛 API,我想知道動作和過濾器鉤子之間有什麼真正的區別。他們都是接收資料作為引數的事件,它們似乎都能夠做同樣的事情。

顯然,我看到,當操作發生時呼叫動作,資料被操作時呼叫過濾器,但它似乎只是一個語義命名的區別。

除了語義和它們所用的是什麼,他們之間有什麼真正的區別?

最佳解決方案

嗨 @Sruly:

你幾乎回答了你自己的問題,但我會詳細說明一下。

行動鉤

操作鉤子適用於 WordPress 核心或某些外掛或主題使您有機會在某一點插入程式碼並執行以下一項或多項操作:

  1. 使用 echo 將一些 HTML 或其他內容注入響應緩衝區,
  2. 修改一個或多個變數的全域性變數狀態,和/或
  3. 修改傳遞給你的鉤子函式的引數 (假設鉤子被 do_action_ref_array()而不是 do_action()呼叫,因為後者不支援傳遞變數 by-reference))

過濾鉤

過濾器鉤子的行為與 Action Hook 非常相似,但它們的預期用途是接收值並可能返回值的修改版本。也可以像 Action Hook 一樣使用過濾器鉤子,即修改全域性變數或生成一些 HTML,假設這是呼叫鉤子時需要執行的操作。有一件事情,對於 Hooks 而言,Filter Hooks 並不需要擔心,使用 Filter Hook 的人必須返回 (修改版本) 第一個引數。一個常見的新手錯誤是忘記回報這個價值!

使用附加引數來提供過濾鉤中的上下文

除此之外,我覺得 Filter Hooks 在早期版本的 WordPress 中被淘汰,因為它們只能接收一個引數; 即它們將獲得修改的值,但沒有提供任何上下文的第二或第三引數。最近,積極的是,似乎 WordPress 的核心團隊 (對我來說) 樂意為 Filter Hook 新增額外的引數,以便您可以發現更多的上下文。一個很好的例子是 posts_where 鉤子; 我相信幾個版本,它只接受一個引數是當前查詢的”where” 類 SQL,但是現在它接受 where 子句和對呼叫鉤子的 WP_Query 類的當前例項的引用。

那麼真正的區別是什麼呢?

實際上,過濾鉤幾乎是動作鉤的超集。前者可以做任何事情,後者可以做,有點更多,儘管開發商沒有責任返回一個價值與他或她做的過濾鉤的動作鉤。

指導和電報意圖

但這可能不是什麼重要的。我認為重要的是,由開發人員選擇使用 「動作鉤」 和 「過濾鉤」,反之亦然,他們會傳送他們的意圖,從而指導可能正在使用鉤子的開發人員或外掛開發人員。實質上,他們說 「我要呼叫你,做任何你需要做的事情」,或者 「我會把你的價值傳給你來修改,但確保你把它傳回去。」

所以最終我認為選擇鉤型提供的指導是區分背後的真正價值。 IMO,無論如何。

希望這可以幫助!

次佳解決方案

如果您檢視 add_action()核心函式的原始碼,它只是 add_filter()函式的包裝器…

而且如果你看 do_action()的核心功能,它與 apply_filters()核心功能非常相似,有一個很大的區別:它不返回一個值。

那麼這是什麼意思?操作就像過濾器,除了操作不返回值,因此您不能修改資料。它表明透過簡單地複製過濾器機制而不返回值來建立 WordPress 的動作機制很簡單。基本上,您只需執行一個功能即可修改某些值。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。