新聞中心
wordpress鉤子(Hook)是WordPress開(kāi)發(fā)人員的武器庫(kù)中最重要的工具之一。它們是WordPress插件和主題開(kāi)發(fā)的基礎(chǔ)。您可以使用WordPress的許多內(nèi)置鉤子將自定義代碼“連接到”WordPress核心,并執(zhí)行或修改某些內(nèi)容。

創(chuàng)新互聯(lián)長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為涇川企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站制作,涇川網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
有兩種類型的WordPress鉤子:Actions和Filters。Hook非常普遍,甚至WordPress Core本身也廣泛使用它們。WordPress還提供了一種讓您定義自己的自定義鉤子的方法,以便其他開(kāi)發(fā)人員可以掛鉤到您的代碼中。
了解動(dòng)作、過(guò)濾器和自定義鉤子的工作原理對(duì)于掌握WordPress開(kāi)發(fā)至關(guān)重要。
本文的前半部分介紹了WordPress鉤子的基礎(chǔ)知識(shí),并解釋了它們?nèi)绾闻c多個(gè)示例一起工作。在后半部分,您將學(xué)習(xí)如何使用鉤子來(lái)自定義WordPress,創(chuàng)建自己的自定義鉤子,并使用它們來(lái)構(gòu)建自己的可擴(kuò)展插件。
什么是WordPress鉤子?
一個(gè)WordPress的頁(yè)面是由很多的功能和數(shù)據(jù)庫(kù)查詢組裝。WordPress核心、插件和主題協(xié)同工作以輸出頁(yè)面元素,如文本、圖像、腳本和樣式。完全組裝后,瀏覽器會(huì)將它們放在一起并呈現(xiàn)頁(yè)面。
WordPress鉤子允許您在某些點(diǎn)“鉤入”這個(gè)構(gòu)建過(guò)程并運(yùn)行您的自定義代碼。鉤子的主要功能是讓你在不接觸核心文件的情況下修改或添加功能到WordPress 。
鉤子將幫助您使用自己的代碼擴(kuò)展WordPress
在WordPress的插件API賦予WordPress鉤子的功能。您可以通過(guò)在WordPress運(yùn)行時(shí)在特定實(shí)例中調(diào)用某些稱為Hook Functions的WordPress函數(shù)來(lái)使用鉤子。
使用鉤子函數(shù),您可以將自定義代碼捆綁在回調(diào)函數(shù)中,并將其注冊(cè)到任何鉤子中。注冊(cè)后,此回調(diào)將在鉤子所在的任何地方運(yùn)行,允許您增加或替換默認(rèn)的WordPress功能。
鉤子在代碼執(zhí)行過(guò)程中的位置是一個(gè)重要的因素。您將在接下來(lái)的部分中詳細(xì)了解其重要性。
兩種類型的WordPress鉤子:動(dòng)作和過(guò)濾器
WordPress包括兩種類型的鉤子,稱為Actions和Filters。動(dòng)作允許您在WordPress運(yùn)行時(shí)的某些預(yù)定義點(diǎn)執(zhí)行某些操作,而過(guò)濾器允許您修改WordPress處理的任何數(shù)據(jù)并返回這些數(shù)據(jù)。
動(dòng)作(Actions)在WordPress代碼中定義為:
do_action( 'action_name', [optional_arguments] );
action_name字符串是動(dòng)作的名稱。您可以指定[optional_arguments]變量以將附加參數(shù)傳遞給回調(diào)函數(shù)。如果未指定此字段,則其默認(rèn)值將為空。
示例:do_action( 'wp_head' )每次WordPress處理站點(diǎn)標(biāo)題時(shí),都可以掛接該動(dòng)作以運(yùn)行自定義代碼。此動(dòng)作沒(méi)有任何其他參數(shù)。
過(guò)濾器(Filters)在WordPress代碼中定義為:
apply_filters( 'filter_name', 'value_to_be_filtered', [optional_arguments] );
filter_name字符串是過(guò)濾器的名稱,value_to_be_filtered變量是被過(guò)濾和返回需求,和值[optional_arguments]變量可以通過(guò)附加參數(shù),就像動(dòng)作。
例如:apply_filters( 'admin_footer_text' , string $text )過(guò)濾器可以是鉤狀來(lái)修改在管理頁(yè)腳顯示的文本。從WordPress 5.4開(kāi)始,其默認(rèn)值將 在管理區(qū)域頁(yè)腳中顯示該句子。WordPress.Thank you for creating with
稍后您將通過(guò)WordPress核心中的許多示例學(xué)習(xí)如何動(dòng)作和過(guò)濾器鉤子。
上鉤后,您可以指導(dǎo)您的代碼在您的網(wǎng)站上執(zhí)行或自定義某些內(nèi)容。例如,您可以使用鉤子在發(fā)布文章后自動(dòng)發(fā)送電子郵件,或加載自定義樣式表來(lái)更改站點(diǎn)的外觀。
WordPress鉤子可幫助您與網(wǎng)站互動(dòng)或修改您的網(wǎng)站
理解鉤子的最簡(jiǎn)單方法是將您的WordPress網(wǎng)站想象成蓋房子。
鉤子類似于使用起重機(jī)來(lái)回移動(dòng)建筑物品。正在傳輸?shù)捻?xiàng)目是回調(diào)函數(shù),其中包括您的自定義代碼。這些項(xiàng)目(或功能)可以幫助您建造或改造房屋。
在WordPress中“wp_head”動(dòng)作鉤子的示例
回調(diào)函數(shù)可以是常規(guī)PHP函數(shù)、默認(rèn)WordPress函數(shù)或您定義的自定義函數(shù)。
我們只能在連接到特定掛鉤的特定載體上運(yùn)輸某些物品。因此,動(dòng)作只能與動(dòng)作函數(shù)掛鉤。同樣,過(guò)濾器只能與過(guò)濾器函數(shù)掛鉤。
雖然更換起重機(jī)上的吊鉤和托架很乏味,但WordPress通過(guò)包含超過(guò)2,200種默認(rèn)鉤子使其變得非常容易。
WordPress 5.1有2200多個(gè)原生鉤子(來(lái)源:Adam Brown)
您可以找到遍布WordPress核心的鉤子,讓您可以進(jìn)入要鉤子的確切位置并運(yùn)行您的自定義代碼。
鉤子 vs 動(dòng)作 vs 過(guò)濾器
根據(jù)WordPress插件手冊(cè):
鉤子是一段代碼交互/修改另一段代碼的一種方式……鉤子有兩種類型:動(dòng)作和過(guò)濾器。
術(shù)語(yǔ)Hook、Action和Filter的使用方式存在廣泛的不一致。一些教程和指南將它們與與之相關(guān)的函數(shù)混合在一起。這種混淆存在的一個(gè)主要原因是鉤子工作方式的復(fù)雜性。
即使您仔細(xì)查看WordPress核心內(nèi)部,您也會(huì)發(fā)現(xiàn)添加動(dòng)作和過(guò)濾器之間沒(méi)有太大區(qū)別。下面是為ADD_ACTION()函數(shù)的源代碼從wp-includes/plugin.php文件:
function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
return add_filter( $tag, $function_to_add, $priority, $accepted_args );
}
add_action()函數(shù)只是調(diào)用該add_filter()函數(shù)并返回其值。為什么?因?yàn)樗鼈儚母旧弦韵嗤姆绞焦ぷ鳎艘粋€(gè)區(qū)別。
apply_filters()函數(shù)返回一個(gè)可以更改現(xiàn)有數(shù)據(jù)類型的值,而該do_action() 函數(shù)不返回任何內(nèi)容(PHP中的NULL值)。
如果您仍然感到困惑,請(qǐng)不要擔(dān)心!讀完本文的前半部分后,一切就都清楚了。我們將堅(jiān)持使用官方的WordPress Codex術(shù)語(yǔ),因?yàn)樗逦?、?zhǔn)確且通用。
現(xiàn)在,讓自己熟悉下面顯示的鉤子例程。
鉤子程序:鉤子、鉤子函數(shù)和回調(diào)函數(shù)
讓我們分解一下Actions和Hooks之間的區(qū)別。
| WordPress鉤子 | |
| 動(dòng)作 | 過(guò)濾器 |
| 動(dòng)作用于在WordPress Core執(zhí)行期間的特定點(diǎn)運(yùn)行自定義函數(shù)。 | 過(guò)濾器用于修改或自定義其他功能使用的數(shù)據(jù)。 |
動(dòng)作由do_action( ‘a(chǎn)ction_name’ )WordPress代碼中的函數(shù)定義/創(chuàng)建。 |
過(guò)濾器由apply_filters( ‘filter_name’, ‘value_to_be_filtered’ )WordPress代碼中的函數(shù)定義/創(chuàng)建。 |
| 動(dòng)作也稱為動(dòng)作鉤子。 | 過(guò)濾器也稱為過(guò)濾器鉤子。 |
動(dòng)作只能與動(dòng)作函數(shù)掛鉤。例如add_action(),remove_action()。 |
過(guò)濾器只能與過(guò)濾器函數(shù)掛鉤。例如add_filter(),remove_filter()。 |
| 動(dòng)作函數(shù)不需要向它們的回調(diào)函數(shù)傳遞任何參數(shù)。 | 過(guò)濾器函數(shù)需要至少傳遞一個(gè)參數(shù)給它們的回調(diào)函數(shù)。 |
| 動(dòng)作函數(shù)可以執(zhí)行任何類型的任務(wù),包括改變WordPress工作方式的行為。 | 過(guò)濾器函數(shù)僅用于修改過(guò)濾器傳遞給它們的數(shù)據(jù)。 |
動(dòng)作函數(shù)應(yīng)該return沒(méi)什么。但是,它們可以echo輸出或與數(shù)據(jù)庫(kù)交互。 |
過(guò)濾器函數(shù)必須將return其更改作為輸出。即使過(guò)濾器函數(shù)什么都不改變,它仍然必須return是未修改的輸入。 |
| 只要代碼有效,動(dòng)作幾乎可以執(zhí)行任何操作。 | 過(guò)濾器應(yīng)該以孤立的方式工作,因此它們不會(huì)產(chǎn)生任何意外的副作用。 |
| 總結(jié):一個(gè)動(dòng)作會(huì)中斷常規(guī)的代碼執(zhí)行過(guò)程,用它接收到的信息做一些事情,但什么都不返回,然后退出。 | 總結(jié):過(guò)濾器修改它接收到的信息,將其返回給調(diào)用鉤子函數(shù),其他函數(shù)可以使用它返回的值。 |
有時(shí),您可以使用動(dòng)作或過(guò)濾器來(lái)實(shí)現(xiàn)相同的目標(biāo)。例如,如果您想修改文章中的文本,您可以使用publish_post動(dòng)作注冊(cè)一個(gè)回調(diào)函數(shù),并在將文章內(nèi)容保存到數(shù)據(jù)庫(kù)時(shí)更改文章內(nèi)容。
// define the callback function to change the text
function change_text_callback() {
// add the code to change text here
}
// hook in to the 'publish_post' action with the add_action() function
add_action( 'publish_post', 'change_text_callback' );
或者您可以使用the_content過(guò)濾器注冊(cè)另一個(gè)回調(diào)函數(shù),以在瀏覽器中顯示之前修改文章內(nèi)容。
// define the callback function to modify the text
function change_text_another_callback( $content ) {
// add the code to change text here and then return it
return $filtered_content;
}
// hook in to 'the_content' filter with the add_filter() function
add_filter( 'the_content', 'change_text_another_callback');
兩種不同的方法,結(jié)果相同。知道何時(shí)使用一個(gè)而不是另一個(gè)是成為優(yōu)秀WordPress開(kāi)發(fā)人員的關(guān)鍵。
WordPress鉤子如何工作?
房子的例子很簡(jiǎn)單,可以理解鉤子的基本功能,但它沒(méi)有捕捉到它們?nèi)绾喂ぷ鞯膹?fù)雜性。最重要的是鉤位置和特異性的概念。
一個(gè)更好的例子是將處理WordPress網(wǎng)頁(yè)想象成組裝汽車。與制造汽車需要時(shí)間不同,組裝網(wǎng)頁(yè)幾乎是瞬間完成的。
組裝網(wǎng)頁(yè)就像組裝汽車
就像汽車如何在現(xiàn)代裝配線中逐個(gè)組裝在一起一樣,WordPress網(wǎng)頁(yè)由服務(wù)器和客戶端逐個(gè)組裝。
WordPress核心就像汽車引擎、底盤和其他必需品,為網(wǎng)站的“核心”功能提供動(dòng)力。
您可以僅使用WordPress核心就擁有一個(gè)功能強(qiáng)大的網(wǎng)站,但這有什么樂(lè)趣呢?您需要向站點(diǎn)添加令人興奮的功能。這就是WordPress插件和主題介入的地方,它們都廣泛使用鉤子。
在上面的示例中,每個(gè)編號(hào)的站點(diǎn)就像WordPress核心中的一個(gè)鉤子。有兩種類型的站點(diǎn),例如動(dòng)作和過(guò)濾器。每個(gè)站都包含一個(gè)特定類型的插槽,它只接受某些工具,類似于動(dòng)作函數(shù)和過(guò)濾器函數(shù)。
為了模塊化和效率,所有站點(diǎn)都以頻繁的間隔放置。
根據(jù)特定位置的要求,我們可以為該特定站點(diǎn)的工作安裝(或鉤子)最合適的工具。這些工具就像用于與WordPress交互或修改WordPress的回調(diào)函數(shù)。
一些工具可以顯著改變汽車的工作,就像注冊(cè)到動(dòng)作的回調(diào)一樣。其他工具僅用于自定義汽車的外觀,例如注冊(cè)到過(guò)濾器的回調(diào)。
在正確的站點(diǎn)使用正確的工具對(duì)于制造一流的汽車至關(guān)重要。同樣,鉤子幫助我們根據(jù)我們的獨(dú)特需求定制WordPress。
如果你擴(kuò)展這個(gè)類比,插件就像添加有用的汽車功能,如安全氣囊、娛樂(lè)控制臺(tái)、遠(yuǎn)程無(wú)鑰匙系統(tǒng)等(像這些是為了增強(qiáng)WooCommerce的功能)。主題類似于自定義汽車的視覺(jué)部分,例如整體設(shè)計(jì)、噴漆、輪輞等(這是自定義WordPress主題的方法)。
在哪里注冊(cè)鉤子及其函數(shù)?
在WordPress中添加鉤子有兩種推薦的方法:
- 插件:制作您自己的插件并在其中添加所有自定義代碼。
- 子主題:在子主題的
functions.php文件中注冊(cè)鉤子和回調(diào)函數(shù)。
對(duì)于本教程,讓我們從創(chuàng)建插件開(kāi)始。為此,請(qǐng)?jiān)谀?code>/wp-content/plugins/目錄中創(chuàng)建一個(gè)新文件夾。
我給我的插件命名salhooks,但你可以隨意命名它。根據(jù) WordPress 指南,您需要在插件目錄中創(chuàng)建一個(gè)具有相同名稱 (salhooks.php )的PHP文件。
將以下標(biāo)題字段添加到您的插件文件以將其注冊(cè)到WordPress。您可以在WordPress Codex中了解有關(guān)插件標(biāo)頭要求的更多信息。
保存此文件,然后在您的WordPress儀表盤中激活該插件。我將在本地WordPress安裝中使用這個(gè)插件來(lái)演示鉤子是如何工作的。
作為旁注,您還可以直接編輯WordPress核心文件以注冊(cè)鉤子。但是,不建議這樣做,因?yàn)槊看胃耊ordPress時(shí),您的所有自定義代碼都會(huì)被覆蓋。出于同樣的原因,您不應(yīng)該在父主題中添加鉤子。
使用WordPress鉤子
一個(gè)WordPress鉤子本身什么都不做。它只是坐在代碼中,等待一些鉤子函數(shù)來(lái)激活它。要使用鉤子,您至少需要調(diào)用2個(gè)其他函數(shù)。
首先,您需要使用鉤子函數(shù)注冊(cè)鉤子并在其中引用回調(diào)函數(shù)。然后你需要定義你之前在鉤子函數(shù)中提到的回調(diào)函數(shù)。每次觸發(fā)鉤子時(shí),WordPress都會(huì)運(yùn)行此回調(diào)函數(shù)。
定義這些函數(shù)的順序無(wú)關(guān)緊要,但最好將它們放在一起。
動(dòng)作和過(guò)濾器具有不同的鉤子函數(shù)。從現(xiàn)在開(kāi)始,讓我們將它們稱為Action Functions和Filter Functions。正如您將看到的,它們有自己的語(yǔ)法和參數(shù)要求。
鉤住一個(gè)動(dòng)作
動(dòng)作提供了一種在WordPress 核心、插件或主題執(zhí)行中的特定點(diǎn)運(yùn)行自定義代碼的方法。
add_action() 動(dòng)作函數(shù)
您可以按照以下步驟使用動(dòng)作注冊(cè)回調(diào)函數(shù):
最好將回調(diào)函數(shù)參數(shù)命名為盡可能接近鉤子函數(shù)傳遞的參數(shù)。
讓我們看一個(gè)使用該
add_action()函數(shù)的例子。// define the callback function, the arguments are optional function example_callback( $arg1, $arg2 ) { // make your code do something with the arguments } // hook the callback function to the 'example_action' add_action( 'example_action', 'example_callback', [priority], [no_of_args] ); // 'priority' and 'number of arguments' are optional parameters掛鉤動(dòng)作的示例
WordPress包含一個(gè)名為init的內(nèi)置動(dòng)作,它會(huì)在WordPress完成加載并驗(yàn)證用戶之后,但在發(fā)送任何標(biāo)頭之前觸發(fā)。許多插件使用此鉤子作為實(shí)例化其代碼的起點(diǎn),因?yàn)樵赪ordPress運(yùn)行此動(dòng)作時(shí),幾乎所有主要的WordPress功能都已完成加載。
WordPress有一個(gè)類似的動(dòng)作叫做admin_init。它在初始化管理屏幕時(shí)
init觸發(fā),而動(dòng)作僅在WordPress完成加載后觸發(fā)。讓我們
echo在init動(dòng)作執(zhí)行期間為一條簡(jiǎn)單的消息運(yùn)行一個(gè)自定義代碼。這是如何做到的:function custom_callback_function(){ // add your custom code here to do something echo 'I will be fired on WordPress initialization'; } add_action( 'init', 'custom_callback_function' );您可以在我本地WordPress安裝的左上角看到這條消息。
不是很漂亮,但這是一個(gè)很好的開(kāi)始!
查找WordPress支持的動(dòng)作
WordPress每次執(zhí)行某些動(dòng)作時(shí)都會(huì)包含操作,例如用戶登錄或發(fā)布新文章。您可以在插件API/動(dòng)作參考頁(yè)面中找到WordPress運(yùn)行的所有動(dòng)作的完整列表。
幾乎每次使用都有一個(gè)動(dòng)作
Codex將其中列出的所有動(dòng)作分為不同的類別,并按照WordPress執(zhí)行順序從頭到尾排列。
在大多數(shù)情況下,許多這些動(dòng)作不會(huì)做任何事情,因?yàn)闆](méi)有任何東西與它們掛鉤。但是,如果您需要它們,它們就在那里供您使用。
對(duì)所有的動(dòng)作感到有點(diǎn)不知所措?這是自然的。隨著您獲得更多經(jīng)驗(yàn)并瀏覽WordPress核心源代碼,找到滿足您需求的完美鉤子將變得更加容易。只需搜索術(shù)語(yǔ)“ do_action ”,您就會(huì)發(fā)現(xiàn)許多可以鉤子的動(dòng)作。
add_action() 的附加參數(shù)
add_action()函數(shù)可以接受另外兩個(gè)參數(shù):一個(gè)用于設(shè)置priority,另一個(gè)用于設(shè)置number of arguments。雖然它們是可選的,但如果使用得當(dāng),它們會(huì)非常有用。優(yōu)先事項(xiàng)
函數(shù)支持的第一個(gè)附加參數(shù)
add_action()設(shè)置priority. 該參數(shù)只能是正整數(shù)。優(yōu)先級(jí)數(shù)字越低,函數(shù)運(yùn)行得越早。如果不指定,其默認(rèn)值為10。為了看看它是如何工作的,讓我們?yōu)?code>init動(dòng)作注冊(cè)三個(gè)回調(diào)函數(shù),但每個(gè)都有不同的優(yōu)先級(jí)。
// priority is set to 9, which is lower than 10, hence it ranks higher add_action( 'init', 'i_am_high_priority', 9 ); // if no priority is set, the default value of 10 will be used add_action( 'init', 'i_am_default_priority'); // priority is set to 11, which is higher than 11, hence it ranks lower add_action( 'init', 'i_am_low_priority', 11 );在上面的示例中,優(yōu)先級(jí)編號(hào)最低的回調(diào)函數(shù)將首先運(yùn)行,編號(hào)最高的回調(diào)函數(shù)將最后運(yùn)行。如果它們的優(yōu)先級(jí)相同,那么它們將按照您注冊(cè)它們的順序運(yùn)行。
當(dāng)單個(gè)鉤子可以注冊(cè)多個(gè)回調(diào)函數(shù)時(shí),優(yōu)先級(jí)起著重要作用。為避免意外結(jié)果,您可以為每個(gè)回調(diào)函數(shù)設(shè)置優(yōu)先級(jí),以便它們按您希望的順序觸發(fā)。
參數(shù)數(shù)量
默認(rèn)情況下,通過(guò)該函數(shù)注冊(cè)的任何回調(diào)函數(shù)
add_action()將只接收一個(gè)參數(shù)。但是,有時(shí)您可能需要向回調(diào)函數(shù)傳遞額外的數(shù)據(jù)。出于這個(gè)原因,
add_action()函數(shù)接受一個(gè)可選參數(shù)來(lái)設(shè)置參數(shù)的數(shù)量。展示這一點(diǎn)的一個(gè)很好的例子是comment_post動(dòng)作。此動(dòng)作會(huì)在WordPress向數(shù)據(jù)庫(kù)添加評(píng)論后立即運(yùn)行。如果您不設(shè)置
number of arguments參數(shù),它只會(huì)將一個(gè)值傳遞給回調(diào)函數(shù),在這種情況下將是comment_ID.// register the hook with 'priority' and 'number of arguments' parameters add_action( 'comment_post', 'show_message_function', 10, 3 ); // define the callback function function show_message_function( $comment_ID, $comment_approved, $commentdata ) { // check whether a comment is approved with the second parameter if( 1 === $comment_approved ){ // runs the code only if the comment is approved } }如果如上例所示將參數(shù)number of arguments設(shè)置為3,則動(dòng)作函數(shù)將傳遞三個(gè)值:
comment_ID、comment_approved和commentdata。WordPress將
comment_approved的值設(shè)置為1,如果未批準(zhǔn),則設(shè)置為0,如果評(píng)論標(biāo)記為垃圾評(píng)論,則設(shè)置為“spam”。
commentdata變量是一個(gè)包含所有評(píng)論數(shù)據(jù)的數(shù)組,例如評(píng)論作者的姓名、電子郵件地址、網(wǎng)站和評(píng)論本身的內(nèi)容。您可以查看WordPress Codex以查找包含在 ‘commentdata’ 數(shù)組中的所有鍵值對(duì)。您可以擁有任意數(shù)量的參數(shù),但回調(diào)函數(shù)和
add_action()函數(shù)需要指定相同數(shù)量的參數(shù)。通過(guò)將附加參數(shù)傳遞給回調(diào)函數(shù),您可以對(duì)代碼執(zhí)行更多動(dòng)作。例如,您可以檢查評(píng)論是否獲得批準(zhǔn),并在獲得批準(zhǔn)后自動(dòng)將評(píng)論文本通過(guò)電子郵件發(fā)送給管理員。不指定附加參數(shù)就不可能做到這一點(diǎn),因?yàn)槟幕卣{(diào)函數(shù)將無(wú)法訪問(wèn)
comment_content數(shù)據(jù)。如果不想設(shè)置優(yōu)先級(jí),只想改變參數(shù)個(gè)數(shù),還是需要設(shè)置一個(gè)優(yōu)先級(jí)。只需使用其默認(rèn)值(即 10)。
WordPress核心如何使用動(dòng)作鉤子
WordPress Core本身使用許多內(nèi)置動(dòng)作來(lái)執(zhí)行各種功能。
以wp_head動(dòng)作為例。當(dāng)WordPress輸出網(wǎng)頁(yè)的標(biāo)題部分(在
和之間的代碼)時(shí),它會(huì)被觸發(fā)。你可以在
wp includes/default-filters.php文件中找到大多數(shù)與wp_head鉤子相關(guān)的WordPress核心動(dòng)作函數(shù)。我仔細(xì)查看了代碼并編譯了所有調(diào)用wp_head動(dòng)作的add_action()函數(shù)的列表。add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 ); add_action( 'wp_head', '_wp_render_title_tag', 1 ); add_action( 'wp_head', 'wp_enqueue_scripts', 1 ); add_action( 'wp_head', 'wp_resource_hints', 2 ); add_action( 'wp_head', 'feed_links', 2 ); add_action( 'wp_head', 'feed_links_extra', 3 ); add_action( 'wp_head', 'rsd_link' ); add_action( 'wp_head', 'wlwmanifest_link' ); add_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 ); add_action( 'wp_head', 'locale_stylesheet' ); add_action( 'wp_head', 'noindex', 1 ); add_action( 'wp_head', 'print_emoji_detection_script', 7 ); add_action( 'wp_head', 'wp_print_styles', 8 ); add_action( 'wp_head', 'wp_print_head_scripts', 9 ); add_action( 'wp_head', 'wp_generator' ); add_action( 'wp_head', 'rel_canonical' ); add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 ); add_action( 'wp_head', 'wp_custom_css_cb', 101 ); add_action( 'wp_head', 'wp_site_icon', 99 ); add_action( 'wp_head', 'wp_no_robots' );很多回調(diào)函數(shù)只與一個(gè)動(dòng)作鉤子。設(shè)置
priority此處對(duì)于確保最重要的鉤子函數(shù)首先運(yùn)行至關(guān)重要。在上面的例子中,加載帶有
wp_enqueue_scripts()回調(diào)函數(shù)的腳本(priority = 1)比加載帶有wp_site_icon()回調(diào)函數(shù)的站點(diǎn)圖標(biāo)元標(biāo)記(priority = 99)更重要。上面例子中使用的所有回調(diào)函數(shù)都是WordPress函數(shù)。您也可以在任何代碼中使用它們。有關(guān)更多信息,請(qǐng)?jiān)L問(wèn)WordPress Codex上的函數(shù)參考頁(yè)面。
其他動(dòng)作函數(shù)
雖然
add_action()是最常用的動(dòng)作函數(shù),但還有許多其他函數(shù)同樣有用。讓我們看看它們是如何工作的。(1)has_action()
這個(gè)動(dòng)作函數(shù)檢查一個(gè)動(dòng)作是否已經(jīng)被掛鉤。它接受兩個(gè)參數(shù)。第一個(gè)是動(dòng)作的名稱。第二個(gè)參數(shù)是可選的,是回調(diào)函數(shù)的名稱。
has_action( 'action_name', 'function_to_check' );如果只指定第一個(gè)參數(shù),則如果任何函數(shù)連接到
action_name參數(shù),則返回true。但是,如果您還指定了第二個(gè)參數(shù),那么如果指定的回調(diào)函數(shù)未注冊(cè)到上述動(dòng)作,那么它將返回
false。但是,如果它找到附加到動(dòng)作動(dòng)作的回調(diào)函數(shù),它將返回該動(dòng)作鉤子上為該函數(shù)設(shè)置的
priority(整數(shù))。(2)do_action()
我們以前遇到過(guò)此動(dòng)作函數(shù)。WordPress使用它來(lái)定義它的所有默認(rèn)動(dòng)作,使其他函數(shù)能夠鉤住它們。與WordPress一樣,您也可以使用
do_action()函數(shù)通過(guò)指定新動(dòng)作名稱作為參數(shù)來(lái)創(chuàng)建新的自定義動(dòng)作。do_action( 'action_name', [argument1], [argument2] );僅僅聲明這個(gè)函數(shù)本身不會(huì)做任何事情。但它將保存在代碼中,等待其他動(dòng)作函數(shù)激活它。傳遞任何額外的參數(shù)都是可選的,但如果希望回調(diào)函數(shù)使用它們,這一點(diǎn)很重要。
(3)do_action_ref_array()
此動(dòng)作函數(shù)與
do_action()相同,只是有一個(gè)區(qū)別。通過(guò)它傳遞的任何參數(shù)都必須是數(shù)組。當(dāng)您有很多參數(shù)要傳遞,或者您的參數(shù)已經(jīng)在數(shù)組中時(shí),此函數(shù)非常有用。// here's an example array $arguments_array = array( 'arg_1', 'foo', true, 'arg_4' ); do_action_ref_array( 'example_action', $arguments_array );由于PHP數(shù)組是有序映射,因此請(qǐng)確保傳遞的參數(shù)順序正確。
此動(dòng)作函數(shù)的使用示例是admin_bar_menu動(dòng)作。它可以被掛鉤以添加、操作或刪除各種管理欄項(xiàng)目。所有管理欄項(xiàng)目都定義為數(shù)組元素。
(4)did_action()
如果你想計(jì)算任何動(dòng)作被觸發(fā)的次數(shù),你可以調(diào)用這個(gè)動(dòng)作函數(shù)。
did_action( 'action_name' );此函數(shù)返回一個(gè)整數(shù)值。
當(dāng)您只想在第一次運(yùn)行動(dòng)作時(shí)運(yùn)行回調(diào)函數(shù)時(shí),
did_action()函數(shù)非常方便,以后不再運(yùn)行。function example_callback_function() { if( did_action( 'example_action' ) === 1 ) { // checks if the 'example_action' hook is fired once, and only runs then, and never again! } } add_action('example_action', 'example_callback_function');(5)remove_action()
這個(gè)動(dòng)作函數(shù)移除一個(gè)與指定動(dòng)作鉤子的回調(diào)函數(shù)。例如,您可以使用此函數(shù)刪除連接到內(nèi)置動(dòng)作的默認(rèn)WordPress函數(shù),并將其替換為您自己的函數(shù)。
remove_action( 'action_name', 'function_to_be_removed', [priority] );調(diào)用
remove_action()函數(shù)有幾個(gè)先決條件:這是WooCommerce如何使用此動(dòng)作函數(shù)刪除主商店頁(yè)面上的默認(rèn)產(chǎn)品縮略圖的示例。
remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );(6)remove_all_actions()
這個(gè)動(dòng)作函數(shù)刪除所有與動(dòng)作鉤子的東西。優(yōu)先級(jí)參數(shù)是可選的。
remove_all_actions( 'action_name', [priority] );請(qǐng)記住,不能從您要取消注冊(cè)回調(diào)函數(shù)的動(dòng)作中調(diào)用此函數(shù)。那會(huì)導(dǎo)致無(wú)限循環(huán)。您可以掛鉤之前觸發(fā)的動(dòng)作以運(yùn)行此函數(shù)而不會(huì)出現(xiàn)任何錯(cuò)誤。
(7)doing_action()
這個(gè)動(dòng)作函數(shù)檢查指定的動(dòng)作是否正在運(yùn)行。它返回一個(gè)布爾值(
true或false)。// check whether the 'action_name' action is being executed if ( doing_action( 'action_name' ) ) { // execute your code here }您可以將
action_name參數(shù)留空以檢查是否正在執(zhí)行任何動(dòng)作。每次觸發(fā)任何動(dòng)作時(shí)它都會(huì)返回true。// check if any action is running and do something if ( doing_action() ) { // the code here is run when any action is fired }動(dòng)作示例 1:向站點(diǎn)訪問(wèn)者顯示維護(hù)消息
有時(shí),最好讓您的網(wǎng)站脫機(jī)并設(shè)置維護(hù)中頁(yè)面。幸運(yùn)的是,WordPress提供了一種簡(jiǎn)單的方法來(lái)做到這一點(diǎn)。
// show a maintenance message for all your site visitors add_action( 'get_header', 'maintenance_message' ); function maintenance_message() { if (current_user_can( 'edit_posts' )) return; wp_die( 'Stay Pawsitive!
Sorry, we\'re temporarily down for maintenance right meow.' ); }讓我們分解代碼并完成每個(gè)步驟:
- get_header是在站點(diǎn)的頭模板文件加載之前觸發(fā)的動(dòng)作。如果您想中斷主站點(diǎn)的加載,這是一個(gè)完美的動(dòng)作。
get_header使用add_action()帶有maintenance_message()回調(diào)函數(shù)的函數(shù)連接到動(dòng)作中。- 定義
maintenance_message()回調(diào)函數(shù)。 current_user_can( 'edit_posts' )是一個(gè)用戶能力測(cè)試函數(shù),用于檢查當(dāng)前用戶是否已登錄并可以編輯文章。除了具有訂閱者角色的用戶之外,在WordPress站點(diǎn)上注冊(cè)的每個(gè)用戶都可以編輯文章。還有其他可靠的方法來(lái)執(zhí)行此檢查,但我們將在這里堅(jiān)持使用這種簡(jiǎn)單的方法。- 使用默認(rèn)的wp_die()函數(shù)優(yōu)雅地終止WordPress執(zhí)行并顯示帶有錯(cuò)誤消息的HTML頁(yè)面。您可以在錯(cuò)誤消息參數(shù)中使用HTML語(yǔ)法對(duì)其進(jìn)行格式化。
在我的自定義插件中保存代碼后,我以隱私瀏覽模式加載了本地WordPress安裝。將在維護(hù)頁(yè)是成功的!
向站點(diǎn)訪問(wèn)者顯示錯(cuò)誤消息
如果我在通過(guò)用戶能力測(cè)試時(shí)登錄,該站點(diǎn)將成功加載。您現(xiàn)在可以繼續(xù)修復(fù)您的網(wǎng)站,同時(shí)它會(huì)向常客顯示此頁(yè)面。
動(dòng)作示例 2:對(duì)非管理員用戶隱藏儀表板菜單項(xiàng)
如果您正在運(yùn)行一個(gè)多作者博客或?yàn)槟目蛻艄芾硪粋€(gè)站點(diǎn),那么您可能需要為非管理員用戶在WordPress儀表盤中隱藏某些管理菜單。你可以通過(guò)掛鉤到admin_menu動(dòng)作來(lái)做到這一點(diǎn)。
// remove specific dashboard menus for non-admin users
add_action( 'admin_menu', 'hide_admin_menus' );
function hide_admin_menus() {
if (current_user_can( 'create_users' )) return;
if (wp_get_current_user()->display_name == "Salman") return;
remove_menu_page( 'plugins.php' );
remove_menu_page( 'themes.php' );
remove_menu_page( 'tools.php' );
remove_menu_page( 'users.php' );
remove_menu_page( 'edit.php?post_type=page' );
remove_menu_page( 'options-general.php' );
}
以下是上述代碼片段的分步演練:
- admin_menu是在WordPress儀表盤區(qū)域中加載管理菜單之前觸發(fā)的動(dòng)作。
- 使用
add_action()函數(shù)和hide_admin_menus()回調(diào)函數(shù),以實(shí)現(xiàn)鉤住admin_menu動(dòng)作。 hide_admin_menus()回調(diào)函數(shù)定義的代碼的邏輯。每次admin_menu動(dòng)作觸發(fā)時(shí)它都會(huì)運(yùn)行。- 在回調(diào)函數(shù)中,
current_user_can( 'create_users' )函數(shù)檢查登錄用戶是否為管理員。由于只有站點(diǎn)管理員具有create_user功能,如果用戶是管理員,則該函數(shù)以return聲明結(jié)束。 - WordPress的函數(shù)wp_get_current_user() 檢索當(dāng)前用戶對(duì)象。通過(guò)這個(gè)函數(shù),我們可以檢查登錄用戶是否有設(shè)置特定的
display_name。這是一個(gè)可選行,以防您想省略某些非管理員用戶由于此回調(diào)函數(shù)而被鎖定。 - WordPress的函數(shù)remove_menu_page() 刪除頂級(jí)管理菜單。在上面的代碼示例中,我刪除了以下管理菜單:插件、主題、工具、用戶、頁(yè)面和選項(xiàng)。
保存插件文件后,這是管理員登錄的WordPress儀表盤的快照。
默認(rèn)的WordPress管理儀表盤
這是非管理員用戶登錄的WordPress儀表盤的屏幕截圖。
對(duì)非管理員用戶隱藏敏感的管理菜單項(xiàng)
此解決方案僅隱藏指定的管理菜單項(xiàng),以免出現(xiàn)在WordPress儀表盤中。所有用戶仍然可以通過(guò)在瀏覽器中輸入菜單URL來(lái)訪問(wèn)它們。
要禁止某些用戶角色訪問(wèn)特定菜單,您需要編輯他們的能力。
掛鉤過(guò)濾器
過(guò)濾器為您的自定義代碼提供了一種方法來(lái)修改其他WordPress功能使用的數(shù)據(jù)。與動(dòng)作不同,掛鉤到過(guò)濾器的函數(shù)需要返回一個(gè)值。
add_filter() 過(guò)濾函數(shù)
您可以按照以下步驟將回調(diào)函數(shù)掛接到過(guò)濾器:
下面是一個(gè)示例,說(shuō)明如何使用add_filter()函數(shù)將回調(diào)函數(shù)掛接到過(guò)濾器。
// define the filter callback function with at least one argument passed
// the number of arguments that you can pass depends on how the filter is defined
function filter_callback_function( $arg1, $arg2 ) {
// make your code do something with the arguments and return something
return $something;
}
// now hook the callback function to the 'example_filter'
add_filter( 'example_filter', 'filter_callback_function', [priority], [no_of_args] );
// '10' is the default priority set for the callback function
// and '1' is the default number of arguments passed
掛鉤過(guò)濾器的示例
WordPress提供了一個(gè)名為login_message的過(guò)濾器來(lái)過(guò)濾登錄表單上方登錄頁(yè)面上顯示的消息。此過(guò)濾器返回的值可以帶有HTML標(biāo)記。
讓我們掛入login_message過(guò)濾器并修改登錄屏幕上顯示的消息。
// show a custom login message above the login form
function custom_login_message( $message ) {
if ( empty( $message ) ) {
return "Welcome to Let's Develop by Salman Ravoof! Please log in to start learning.
";
}
else {
return $message;
}
}
add_filter( 'login_message', 'custom_login_message' );
if-else回調(diào)函數(shù)中的語(yǔ)句檢查登錄消息是否已經(jīng)設(shè)置,主要是由另一個(gè)插件或主題設(shè)置的。在這種情況下,回調(diào)函數(shù)返回原始值,不做任何更改。這是避免與其他插件或主題沖突的一種方法。
您可以在WordPress登錄頁(yè)面的登錄表單上方看到顯示的消息。
在登錄表單上方顯示自定義登錄消息
您可以通過(guò)將自定義樣式表排入隊(duì)列來(lái)設(shè)置登錄頁(yè)面上所有元素的樣式。這樣做將允許您完全自定義默認(rèn)的WordPress登錄頁(yè)面。
您將在“使用鉤子自定義WordPress登錄頁(yè)面”部分中了解如何使用動(dòng)作鉤子加載自定義樣式表。
查找WordPress支持的過(guò)濾器
在WordPress處理或修改數(shù)據(jù)的任何地方,您幾乎肯定可以找到一個(gè)過(guò)濾器來(lái)連接和更改它。將過(guò)濾器視為WordPress數(shù)據(jù)庫(kù)和瀏覽器之間的接口。
您可以在插件API/過(guò)濾器參考頁(yè)面中找到WordPress支持的所有過(guò)濾器的詳盡列表。
WordPress提供了多種過(guò)濾器來(lái)掛鉤
那里列出的所有過(guò)濾器都分為多個(gè)類別,并按照WordPress執(zhí)行順序從上到下排列。
如果您想在WordPress源代碼中找到要掛鉤的過(guò)濾器,請(qǐng)搜索術(shù)語(yǔ)“apply_filters”,您將獲得大量結(jié)果。在WordPress的代碼參考也來(lái)搜索隨機(jī)配備在WordPress,包括動(dòng)作和過(guò)濾器一切的好地方。
WordPress核心如何使用過(guò)濾器
WordPress Core本身使用許多內(nèi)置過(guò)濾器來(lái)修改其各種功能使用的數(shù)據(jù)。
例如考慮the_content過(guò)濾器。它在從數(shù)據(jù)庫(kù)中檢索到文章內(nèi)容之后和在瀏覽器上顯示之前過(guò)濾文章內(nèi)容。
就像動(dòng)作一樣,您可以the_content在wp-includes/default-filters.php文件中找到與鉤子相關(guān)的大多數(shù)WordPress Core過(guò)濾器函數(shù)。
add_filter()是掛接到the_content過(guò)濾器的所有核心函數(shù)的列表:
add_filter( 'the_content', 'do_blocks', 9 ); add_filter( 'the_content', 'wptexturize' ); add_filter( 'the_content', 'convert_smilies', 20 ); add_filter( 'the_content', 'wpautop' ); add_filter( 'the_content', 'shortcode_unautop' ); add_filter( 'the_content', 'prepend_attachment' ); add_filter( 'the_content', 'wp_make_content_images_responsive' ); add_filter( 'the_content', 'do_shortcode', 11 ); // AFTER wpautop().
請(qǐng)注意為某些回調(diào)函數(shù)指定的優(yōu)先級(jí)。
例如,do_blocks()函數(shù)解析文章內(nèi)容中的任何動(dòng)態(tài)塊并重新渲染它們以與WordPress的新區(qū)塊編輯器兼容。它指定了比默認(rèn)值 (10) 更高的優(yōu)先級(jí),以確保在運(yùn)行其他功能之前內(nèi)容已準(zhǔn)備好塊。
convert_smilies()函數(shù)設(shè)置為較低的優(yōu)先級(jí)運(yùn)行它的任務(wù)是將文本轉(zhuǎn)換表情圖像精靈。在過(guò)濾所有文章內(nèi)容后讓它在最后運(yùn)行是有道理的。
有趣的事實(shí):短代碼是過(guò)濾器的一個(gè)子集。他們從短代碼中獲取輸入,對(duì)其進(jìn)行處理,然后將輸出返回給它。
其他過(guò)濾器函數(shù)
雖然add_filter()是最常用的過(guò)濾函數(shù),但還有許多其他有用的過(guò)濾函數(shù)。讓我們深入討論它們。
(1)has_filter()
此函數(shù)檢查指定的過(guò)濾器是否被任何函數(shù)掛鉤。它接受兩個(gè)參數(shù)。第一個(gè)參數(shù)用于輸入過(guò)濾器名稱。第二個(gè)參數(shù)是可選的,用于輸入回調(diào)函數(shù)的名稱。
has_filter( 'filter_name', 'function_to_check' );
如果您僅指定第一個(gè)參數(shù),則它會(huì)在任何函數(shù)filter_name掛鉤時(shí)返回true。
但是,如果您同時(shí)指定了這兩個(gè)參數(shù),那么如果提到的回調(diào)函數(shù)未在給定的過(guò)濾器中注冊(cè),它將返回false。如果它找到了向過(guò)濾器注冊(cè)的回調(diào)函數(shù),那么它會(huì)在此過(guò)濾器上返回該函數(shù)的priority(整數(shù))集。
has_filter()函數(shù)的一種可能應(yīng)用是檢查是否已經(jīng)掛接了任何過(guò)濾器,并在此基礎(chǔ)上繼續(xù)執(zhí)行代碼。
// check to see if 'the_content' filter has been hooked
if ( ! has_filter( 'the_content' ) {
// hook the filter if and only if it hasn't been hooked before
add_filter( 'the_content', 'modify_the_content' );
}
(2)apply_filters()
這個(gè)過(guò)濾器函數(shù)就像do_action()動(dòng)作函數(shù)。任何掛鉤到此過(guò)濾器的回調(diào)函數(shù)都將在WordPress代碼中此函數(shù)的任何位置運(yùn)行。
您還可以使用此函數(shù)通過(guò)將過(guò)濾器名稱和過(guò)濾器值指定為參數(shù)來(lái)創(chuàng)建新的自定義過(guò)濾器。
apply_filters( 'filter_name', 'value_to_filter', [argument1], [argument2] );
如果要將它們傳遞給回調(diào)函數(shù),請(qǐng)不要忘記指定任何其他參數(shù)。大多數(shù)過(guò)濾器只使用一個(gè)參數(shù),因此很容易錯(cuò)過(guò)定義其他參數(shù)。
- apply_filters_ref_array()
這個(gè)函數(shù)就像apply_filters()函數(shù)一樣,除了它接受的所有參數(shù)都捆綁成一個(gè)數(shù)組。
// an example array $arguments_array = array( 'some_value', 'foo', false, 'another_value' ); apply_filters_ref_array( 'example_filter', $arguments_array );
當(dāng)您有許多參數(shù)要傳遞或所有參數(shù)都已在數(shù)組中時(shí),此過(guò)濾器函數(shù)會(huì)很方便。確保數(shù)組內(nèi)的參數(shù)順序正確。
(3)current_filter()
此過(guò)濾器函數(shù)檢索當(dāng)前正在運(yùn)行的過(guò)濾器或動(dòng)作的名稱。您不需要指定任何參數(shù),因?yàn)樗诨卣{(diào)函數(shù)中運(yùn)行。
下面是它的用法示例:
function example_callback() {
echo current_filter(); // 'the_title' will be echoed
return
}
add_filter( 'the_title', 'example_callback' );
盡管它的名字,這個(gè)函數(shù)可以檢索動(dòng)作和過(guò)濾器的名稱。
(4)remove_filter()
此過(guò)濾器函數(shù)刪除附加到指定過(guò)濾器的回調(diào)函數(shù)。它的工作原理與remove_action()函數(shù)完全一樣。您可以使用它來(lái)刪除使用特定過(guò)濾器注冊(cè)的默認(rèn)WordPress函數(shù),并在必要時(shí)將其替換為您自己的函數(shù)。
remove_filter( 'filter_name', 'function_to_be_removed', [priority] );
要取消掛鉤到過(guò)濾器的回調(diào)函數(shù),function_to_be_removed,并且priority參數(shù)必須與掛鉤回調(diào)函數(shù)時(shí)使用的參數(shù)相同。
如果過(guò)濾器是從類中添加的,通常是通過(guò)插件添加的情況,那么您需要訪問(wèn)類變量以刪除過(guò)濾器。
// access the class variable first, and then remove the filter through it global $some_class; remove_filter( 'the_content', array($some_class, 'class_filter_callback') );
讓我們看看一個(gè)很好的例子remove_filter()。
WooCommerce插件使用wc_lostpassword_url()掛接到它的通話函數(shù)lostpassword_url過(guò)濾器重定向用戶的嘗試“忘記密碼?”。
它需要任何用戶單擊該鏈接到帶有URL的自定義前端頁(yè)面/my-account/lost-password。如果沒(méi)有這個(gè)過(guò)濾器,它會(huì)將它們帶到標(biāo)準(zhǔn)的WordPress登錄URL/wp-login.php。
假設(shè)您要重置此函數(shù)并將您的用戶發(fā)送到默認(rèn)密碼檢索頁(yè)面 或完全單獨(dú)的頁(yè)面。您可以像這樣刪除此回調(diào)函數(shù):
remove_filter( 'lostpassword_url', 'wc_lostpassword_url', 10 );
(5)remove_all_filters()
此過(guò)濾器函數(shù)刪除注冊(cè)到過(guò)濾器的所有回調(diào)函數(shù)。
remove_all_filters( 'filter_name', [priority] );
它的remove_all_actions()函數(shù)類似。
流行的Advanced Excerpts插件使用此函數(shù)刪除所有與the_excerpt和get_the_excerpt過(guò)濾器鉤子的默認(rèn)函數(shù)。這樣做之后,它然后將自己的回調(diào)函數(shù)掛接到過(guò)濾器。
// Ensure our filter is hooked, regardless of the page type
if ( ! has_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) ) ) {
remove_all_filters( 'get_the_excerpt' );
remove_all_filters( 'the_excerpt' );
add_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) );
}
(6)doing_filter()
此過(guò)濾器函數(shù)檢查指定的過(guò)濾器是否正在執(zhí)行。
if ( doing_filter( 'save_post' ) ) {
// run your code here
}
它返回一個(gè)布爾值(true或false)。
您應(yīng)該注意此函數(shù)與current_filter()返回正在運(yùn)行的過(guò)濾器或動(dòng)作的名稱(字符串)的函數(shù)之間的區(qū)別。
過(guò)濾器示例 1:為評(píng)論添加敏感詞過(guò)濾器
管理WordPress網(wǎng)站上的所有評(píng)論可能是一個(gè)繁瑣的過(guò)程。 comment_text過(guò)濾器允許您設(shè)置規(guī)則,以便在將評(píng)論輸出到顯示器上之前對(duì)其進(jìn)行修改。
帶有敏感詞標(biāo)記的未經(jīng)過(guò)濾的評(píng)論
您可以指示W(wǎng)ordPress在任何敏感詞顯示給您的網(wǎng)站訪問(wèn)者之前自動(dòng)刪除它們。
// hook into the 'comment_text' filter with the callback function
add_filter( 'comment_text', 'the_profanity_filter' );
// define a callback function to filter profanities in comments
function the_profanity_filter( $comment_text ) {
// define an array of profane words and count how many are there
$profaneWords = array('fudge', 'darn', 'pickles', 'blows', 'dangit');
$profaneWordsCount = sizeof($profaneWords);
// loop through the profanities in $comment_text and replace them with '*'
for($i=0; $i < $profaneWordsCount; $i++) {
$comment_text = str_ireplace( $profaneWords[$i], str_repeat('*', strlen( $profaneWords[$i]) ), $comment_text );
}
return $comment_text;
}
這是代碼的逐行細(xì)分:
- comment_text是一個(gè)過(guò)濾器鉤子,允許您在瀏覽器顯示之前修改評(píng)論的文本。您可以向它注冊(cè)回調(diào)函數(shù)以過(guò)濾其輸出。
- 通過(guò)
add_filter()函數(shù),您可以連接到comment_text過(guò)濾器并為其附加回調(diào)函數(shù)。 the_profanity_filter()是回調(diào)函數(shù)的名稱。它只接受一個(gè)參數(shù),即一個(gè)包含評(píng)論文本的字符串。使用適當(dāng)?shù)拇a邏輯定義此自定義函數(shù)。- 將所有敏感詞存儲(chǔ)在名為
profaneWords的PHP數(shù)組中。您可以向該數(shù)組添加任意數(shù)量的單詞。在PHP函數(shù)sizeof()的幫助下,我將這個(gè)數(shù)組的大小存儲(chǔ)在profaneWordsCount變量中。 - 循環(huán)遍歷所有敏感詞,并使用PHP的默認(rèn)str_ireplace() 函數(shù)將任何匹配的敏感詞替換為
*符號(hào)。由于這是一個(gè)不區(qū)分大小寫的字符串替換函數(shù),因此您不必?fù)?dān)心大小寫。查看執(zhí)行搜索和替換的不同方法。 - 使用
return輸出過(guò)濾后的評(píng)論文本。
將更改保存到您的自定義插件文件并重新加載任何帶有評(píng)論的文章。您包含在profaneWords數(shù)組中的所有單詞現(xiàn)在都應(yīng)替換為“ *”符號(hào)。
審查帶有“*”符號(hào)的評(píng)論中的敏感詞
原始評(píng)論仍將在數(shù)據(jù)庫(kù)中保持原樣。此過(guò)濾器僅在將評(píng)論文本輸出到前端之前對(duì)其進(jìn)行修改。
網(wǎng)站后臺(tái)原評(píng)論
一旦你使用了正確的過(guò)濾器,你就可以用它做很多很酷的事情。
例如,您還可以使用comment_text過(guò)濾器從所有評(píng)論中刪除任何 URL(請(qǐng)務(wù)必閱讀有關(guān)如何阻止WordPress中的垃圾評(píng)論的深入指南)。
或者,您可以連接到pre_comment_approved過(guò)濾器,并根據(jù)預(yù)定義的標(biāo)準(zhǔn)將評(píng)論標(biāo)記為已批準(zhǔn)、垃圾郵件或駁回。
過(guò)濾器示例 2:在文章后插入內(nèi)容
您已經(jīng)看到WordPress如何使用the_content過(guò)濾器來(lái)修改文章或頁(yè)面內(nèi)容。讓我們使用相同的過(guò)濾器在每篇文章的末尾添加一些內(nèi)容。
// hook into 'the_content' filter with a callback function
add_filter( 'the_content', 'insert_content_below' );
// define the callback function to insert something below the post
function insert_content_below( $content ) {
// check to see if we're inside the main loop in a single post
if ( is_single() && in_the_loop() && is_main_query() ) {
return $content . "Let me insert myself here
I'll appear after the post. You can insert anything here. Even HTML. Headers, links, images, scripts, I'll take them all and append it to the end of the post content. You can also give me a class, so you can style me easily with CSS style sheets.
" ;
}
return $content;
}
理解上面例子中的代碼邏輯:
the_content過(guò)濾器鉤子可幫助您獲取當(dāng)前文章的內(nèi)容并對(duì)其進(jìn)行自定義。- 使用
add_filter()函數(shù)通過(guò)insert_content_below()回調(diào)函數(shù)鉤住the_content過(guò)濾器。 - 通過(guò)將當(dāng)前文章的內(nèi)容作為參數(shù) (
$content)傳遞來(lái)定義回調(diào)函數(shù)。 - 在回調(diào)函數(shù)中,檢查您是否只過(guò)濾了主查詢中的內(nèi)容,在本例中是文章內(nèi)容。如果您不驗(yàn)證這一點(diǎn),有時(shí)代碼會(huì)無(wú)意中過(guò)濾來(lái)自其他地方的內(nèi)容,例如側(cè)邊欄和頁(yè)腳。
- is_main_query()和in_the_loop()條件確定查詢是否為主查詢以及是否發(fā)生在主WordPress循環(huán)中。
- is_single()條件檢查查詢是否針對(duì)單個(gè)文章。
- 使用PHP的字符串連接運(yùn)算符(
$content . "your additions") 向頁(yè)面內(nèi)容添加額外內(nèi)容。 - 如果上述所有條件都檢查出來(lái),則
return過(guò)濾后的評(píng)論。如果沒(méi)有,則只返回內(nèi)容而不做任何更改。
保存您的插件文件,加載您網(wǎng)站上的任何文章,然后滾動(dòng)到最后。
在文章內(nèi)容的末尾插入一些東西
通過(guò)反轉(zhuǎn)字符串連接參數(shù) ( "your additions" . $content)的位置,您可以使用相同的邏輯在所有文章的開(kāi)頭添加任何內(nèi)容。
使用鉤子自定義WordPress登錄頁(yè)面
讓我們同時(shí)使用動(dòng)作和過(guò)濾器鉤子來(lái)自定義默認(rèn)的WordPress登錄頁(yè)面。我將創(chuàng)建一個(gè)名為Sal Custom Login Page的新插件來(lái)執(zhí)行此動(dòng)作。您可以在本節(jié)末尾找到此插件的完整源代碼。
最終定制的WordPress登錄頁(yè)面
讓我們開(kāi)始添加標(biāo)準(zhǔn)插件標(biāo)題字段并將其注冊(cè)到WordPress。
首先,login_enque_scripts動(dòng)作鉤子將您的自定義樣式表排入隊(duì)列。您在此處排隊(duì)的任何腳本或樣式都包含在登錄頁(yè)面的標(biāo)題部分中。
如果您想在站點(diǎn)的前端(而不是在管理后端或登錄區(qū)域)加載自定義腳本和樣式表,那么您需要掛接到
wp_enqueue_scripts動(dòng)作。您可以在WordPress Codex和關(guān)于如何使用wp_enqueue_scripts的文章中閱讀更多相關(guān)信息。在
salhooks_login_stylesheet()回調(diào)函數(shù)中,使用wp_enqueue_style()函數(shù)加載放置在同一插件目錄中的自定義樣式表 (sal-custom-login-page-styles.css)。WordPress的內(nèi)置plugin_dir_url( __FILE__ )函數(shù)可以輕松獲取當(dāng)前插件目錄的URL路徑(帶有斜杠)。我不會(huì)解釋這里應(yīng)用的CSS樣式,但您可以在本節(jié)末尾鏈接的源代碼中找到它們。
// Custom login ERROR message to keep the site more secure add_filter( 'login_errors', 'salhooks_remove_login_errors', 10 ); function salhooks_remove_login_errors() { return 'Incorrect credentials. Please try again!'; }接下來(lái),login_errors過(guò)濾器鉤子更改當(dāng)有人輸入錯(cuò)誤憑據(jù)時(shí)顯示的錯(cuò)誤消息。過(guò)濾錯(cuò)誤消息將阻止攻擊者輕松猜測(cè)您的用戶名。
// Remove the login form box shake animation for incorrect credentials add_action( 'login_head', 'remove_login_error_shake' ); function remove_login_error_shake() { remove_action( 'login_head', 'wp_shake_js', 12 ); }每次有人輸入錯(cuò)誤的登錄憑據(jù)時(shí),登錄表單框都會(huì)劇烈晃動(dòng)。這是一個(gè)可選步驟,但我將其包含在內(nèi)是為了表明您還可以從登錄頁(yè)面中刪除某些功能。
您將在本文的最后一節(jié)中了解有關(guān)
remove_action()和remove_filter()函數(shù)的更多信息。// Change the logo and header link above the login form add_filter( 'login_headerurl', 'salhooks_login_headerurl'); function salhooks_login_headerurl( $url ) { $url = 'https://salmanravoof.com'; return $url; } add_filter( 'login_headertext', 'salhooks_login_headertext'); function salhooks_login_headertext( $text ) { $text = 'Salman Ravoof'; return $text; }最后一步是更改登錄標(biāo)題的URL和文本。您可以連接到login_headerurl和login_headertext過(guò)濾器來(lái)修改它們。
如果您想在此插件的基礎(chǔ)上構(gòu)建并進(jìn)一步試驗(yàn),您可以下載該插件的源代碼并開(kāi)始使用。
WordPress鉤子列表和資源
很難記住WordPress的所有各種鉤子。有數(shù)以千計(jì)的內(nèi)置動(dòng)作和過(guò)濾器可供使用。因此,找到一個(gè)合適的鉤子有時(shí)感覺(jué)就像是在尋寶。
值得慶幸的是,您可以使用各種資源來(lái)確定滿足您需求的完美鉤子。
- WordPress插件手冊(cè) — Hooks
第一個(gè)熟悉鉤子的地方是WordPress Codex,尤其是插件手冊(cè)中的鉤子部分。在這里您可以找到有關(guān)鉤子和鏈接的基本信息,以完成有關(guān)所有動(dòng)作和過(guò)濾器鉤子的文檔。
使用WordPress插件手冊(cè)開(kāi)始學(xué)習(xí)鉤子
為插件手冊(cè)中的這些有用鏈接添加書簽以加快搜索速度:
- 插件API — 鉤子函數(shù)參考
- 插件API — 動(dòng)作參考
- 插件API — 過(guò)濾器參考
動(dòng)作參考和過(guò)濾器參考頁(yè)面都會(huì)為您提供通常在特定WordPress請(qǐng)求期間運(yùn)行的所有鉤子的列表。
例如,您可以找到訪問(wèn)管理頁(yè)面、處理文章頁(yè)面附件或類別時(shí)觸發(fā)的所有鉤子。
- WordPress代碼參考
WordPress Codex還包括一個(gè)方便的搜索工具,用于查找其所有函數(shù)、鉤子、方法和類。此頁(yè)面還列出了最新版本的WordPress中的新組件和更新組件。如果您想了解WordPress內(nèi)部發(fā)生的事情,請(qǐng)先前往這里。
在此處搜索WordPress內(nèi)的任何內(nèi)容
- Adam R Brown的WordPress鉤子索引
這個(gè)WordPress鉤子索引按類型、它們首次亮相的WordPress版本以及它們是否被棄用對(duì)所有鉤子進(jìn)行排序。
Adam R Brown的WordPress鉤子索引
按照它們的出現(xiàn)順序?qū)︺^子進(jìn)行排序會(huì)告訴你,最古老的WordPress鉤子仍然是最常用的。如果您不熟悉WordPress開(kāi)發(fā),熟悉這些流行的動(dòng)作和過(guò)濾器是最快的方法。
雖然此索引自WordPress 5.1以來(lái)尚未更新,但瀏覽所有主要鉤子仍然很有幫助。
仍然很難找到你想要的鉤子嗎?使用正確的關(guān)鍵字進(jìn)行在線搜索始終是一個(gè)很好的開(kāi)始方式。如果其他一切都失敗了,您可以隨時(shí)深入研究WordPress代碼。
查找在WordPress頁(yè)面上注冊(cè)的鉤子
正如我們所見(jiàn),WordPress有大量可用的鉤子,但并非每個(gè)鉤子都會(huì)在每個(gè)頁(yè)面上觸發(fā)。如果您能找到可以在特定頁(yè)面上掛鉤的動(dòng)作和過(guò)濾器,那么您就贏了一半。
雖然您可以使用xdebug和PHPCS等高級(jí)PHP調(diào)試工具來(lái)幫助解決此問(wèn)題,但您可以在WordPress中運(yùn)行更簡(jiǎn)單的開(kāi)發(fā)工具,例如調(diào)試欄和查詢監(jiān)視器。
帶有動(dòng)作和過(guò)濾器插件的調(diào)試欄
Debug Bar是一個(gè)官方的WordPress插件,它為您的管理欄添加了一個(gè)Debug菜單。它顯示PHP警告和通知、緩存請(qǐng)求、MySQL查詢和其他有用的調(diào)試信息。
注:此插件最近未更新,也未使用WordPress的最新主要版本進(jìn)行測(cè)試。我們提到它是一個(gè)方便的插件,用于了解有關(guān)WordPress鉤子的更多信息。
WordPress插件-Debug Bar
安裝插件后,您需要將下面的代碼片段添加到您網(wǎng)站的wp-config.php文件中以啟用其調(diào)試功能。
define( 'WP_DEBUG', true ); // tracks PHP Warnings and Notices define( 'SAVEQUERIES', true ); // tracks and displays MySQL queries
您現(xiàn)在應(yīng)該會(huì)在管理欄中看到Debug菜單選項(xiàng)。單擊它會(huì)將您帶到其儀表板,在那里您可以看到附加到您訪問(wèn)它的頁(yè)面的各種查詢和緩存。
WordPress管理欄中的“Debug”菜單
接下來(lái),您需要安裝Debug Bar Actions and Filters Addon插件。這是一個(gè)
當(dāng)前文章:WordPress鉤子詳解:如何使用動(dòng)作、過(guò)濾器和自定義鉤子
分享網(wǎng)址:http://m.5511xx.com/article/dhoedsj.html


咨詢
建站咨詢
