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

創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為涇川企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站制作,涇川網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
有兩種類型的WordPress鉤子:Actions和Filters。Hook非常普遍,甚至WordPress Core本身也廣泛使用它們。WordPress還提供了一種讓您定義自己的自定義鉤子的方法,以便其他開發(fā)人員可以掛鉤到您的代碼中。
了解動作、過濾器和自定義鉤子的工作原理對于掌握WordPress開發(fā)至關(guān)重要。
本文的前半部分介紹了WordPress鉤子的基礎(chǔ)知識,并解釋了它們?nèi)绾闻c多個示例一起工作。在后半部分,您將學(xué)習(xí)如何使用鉤子來自定義WordPress,創(chuàng)建自己的自定義鉤子,并使用它們來構(gòu)建自己的可擴(kuò)展插件。
什么是WordPress鉤子?
一個WordPress的頁面是由很多的功能和數(shù)據(jù)庫查詢組裝。WordPress核心、插件和主題協(xié)同工作以輸出頁面元素,如文本、圖像、腳本和樣式。完全組裝后,瀏覽器會將它們放在一起并呈現(xiàn)頁面。
WordPress鉤子允許您在某些點(diǎn)“鉤入”這個構(gòu)建過程并運(yùn)行您的自定義代碼。鉤子的主要功能是讓你在不接觸核心文件的情況下修改或添加功能到WordPress 。
鉤子將幫助您使用自己的代碼擴(kuò)展WordPress
在WordPress的插件API賦予WordPress鉤子的功能。您可以通過在WordPress運(yùn)行時在特定實(shí)例中調(diào)用某些稱為Hook Functions的WordPress函數(shù)來使用鉤子。
使用鉤子函數(shù),您可以將自定義代碼捆綁在回調(diào)函數(shù)中,并將其注冊到任何鉤子中。注冊后,此回調(diào)將在鉤子所在的任何地方運(yùn)行,允許您增加或替換默認(rèn)的WordPress功能。
鉤子在代碼執(zhí)行過程中的位置是一個重要的因素。您將在接下來的部分中詳細(xì)了解其重要性。
兩種類型的WordPress鉤子:動作和過濾器
WordPress包括兩種類型的鉤子,稱為Actions和Filters。動作允許您在WordPress運(yùn)行時的某些預(yù)定義點(diǎn)執(zhí)行某些操作,而過濾器允許您修改WordPress處理的任何數(shù)據(jù)并返回這些數(shù)據(jù)。
動作(Actions)在WordPress代碼中定義為:
do_action( 'action_name', [optional_arguments] );
action_name字符串是動作的名稱。您可以指定[optional_arguments]變量以將附加參數(shù)傳遞給回調(diào)函數(shù)。如果未指定此字段,則其默認(rèn)值將為空。
示例:do_action( 'wp_head' )每次WordPress處理站點(diǎn)標(biāo)題時,都可以掛接該動作以運(yùn)行自定義代碼。此動作沒有任何其他參數(shù)。
過濾器(Filters)在WordPress代碼中定義為:
apply_filters( 'filter_name', 'value_to_be_filtered', [optional_arguments] );
filter_name字符串是過濾器的名稱,value_to_be_filtered變量是被過濾和返回需求,和值[optional_arguments]變量可以通過附加參數(shù),就像動作。
例如:apply_filters( 'admin_footer_text' , string $text )過濾器可以是鉤狀來修改在管理頁腳顯示的文本。從WordPress 5.4開始,其默認(rèn)值將 在管理區(qū)域頁腳中顯示該句子。WordPress.Thank you for creating with
稍后您將通過WordPress核心中的許多示例學(xué)習(xí)如何動作和過濾器鉤子。
上鉤后,您可以指導(dǎo)您的代碼在您的網(wǎng)站上執(zhí)行或自定義某些內(nèi)容。例如,您可以使用鉤子在發(fā)布文章后自動發(fā)送電子郵件,或加載自定義樣式表來更改站點(diǎn)的外觀。
WordPress鉤子可幫助您與網(wǎng)站互動或修改您的網(wǎng)站
理解鉤子的最簡單方法是將您的WordPress網(wǎng)站想象成蓋房子。
鉤子類似于使用起重機(jī)來回移動建筑物品。正在傳輸?shù)捻椖渴?strong>回調(diào)函數(shù),其中包括您的自定義代碼。這些項目(或功能)可以幫助您建造或改造房屋。
在WordPress中“wp_head”動作鉤子的示例
回調(diào)函數(shù)可以是常規(guī)PHP函數(shù)、默認(rèn)WordPress函數(shù)或您定義的自定義函數(shù)。
我們只能在連接到特定掛鉤的特定載體上運(yùn)輸某些物品。因此,動作只能與動作函數(shù)掛鉤。同樣,過濾器只能與過濾器函數(shù)掛鉤。
雖然更換起重機(jī)上的吊鉤和托架很乏味,但WordPress通過包含超過2,200種默認(rèn)鉤子使其變得非常容易。
WordPress 5.1有2200多個原生鉤子(來源:Adam Brown)
您可以找到遍布WordPress核心的鉤子,讓您可以進(jìn)入要鉤子的確切位置并運(yùn)行您的自定義代碼。
鉤子 vs 動作 vs 過濾器
根據(jù)WordPress插件手冊:
鉤子是一段代碼交互/修改另一段代碼的一種方式……鉤子有兩種類型:動作和過濾器。
術(shù)語Hook、Action和Filter的使用方式存在廣泛的不一致。一些教程和指南將它們與與之相關(guān)的函數(shù)混合在一起。這種混淆存在的一個主要原因是鉤子工作方式的復(fù)雜性。
即使您仔細(xì)查看WordPress核心內(nèi)部,您也會發(fā)現(xiàn)添加動作和過濾器之間沒有太大區(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ù)并返回其值。為什么?因為它們從根本上以相同的方式工作,除了一個區(qū)別。
apply_filters()函數(shù)返回一個可以更改現(xiàn)有數(shù)據(jù)類型的值,而該do_action() 函數(shù)不返回任何內(nèi)容(PHP中的NULL值)。
如果您仍然感到困惑,請不要擔(dān)心!讀完本文的前半部分后,一切就都清楚了。我們將堅持使用官方的WordPress Codex術(shù)語,因為它清晰、準(zhǔn)確且通用。
現(xiàn)在,讓自己熟悉下面顯示的鉤子例程。
鉤子程序:鉤子、鉤子函數(shù)和回調(diào)函數(shù)
讓我們分解一下Actions和Hooks之間的區(qū)別。
| WordPress鉤子 | |
| 動作 | 過濾器 |
| 動作用于在WordPress Core執(zhí)行期間的特定點(diǎn)運(yùn)行自定義函數(shù)。 | 過濾器用于修改或自定義其他功能使用的數(shù)據(jù)。 |
動作由do_action( ‘a(chǎn)ction_name’ )WordPress代碼中的函數(shù)定義/創(chuàng)建。 |
過濾器由apply_filters( ‘filter_name’, ‘value_to_be_filtered’ )WordPress代碼中的函數(shù)定義/創(chuàng)建。 |
| 動作也稱為動作鉤子。 | 過濾器也稱為過濾器鉤子。 |
動作只能與動作函數(shù)掛鉤。例如add_action(),remove_action()。 |
過濾器只能與過濾器函數(shù)掛鉤。例如add_filter(),remove_filter()。 |
| 動作函數(shù)不需要向它們的回調(diào)函數(shù)傳遞任何參數(shù)。 | 過濾器函數(shù)需要至少傳遞一個參數(shù)給它們的回調(diào)函數(shù)。 |
| 動作函數(shù)可以執(zhí)行任何類型的任務(wù),包括改變WordPress工作方式的行為。 | 過濾器函數(shù)僅用于修改過濾器傳遞給它們的數(shù)據(jù)。 |
動作函數(shù)應(yīng)該return沒什么。但是,它們可以echo輸出或與數(shù)據(jù)庫交互。 |
過濾器函數(shù)必須將return其更改作為輸出。即使過濾器函數(shù)什么都不改變,它仍然必須return是未修改的輸入。 |
| 只要代碼有效,動作幾乎可以執(zhí)行任何操作。 | 過濾器應(yīng)該以孤立的方式工作,因此它們不會產(chǎn)生任何意外的副作用。 |
| 總結(jié):一個動作會中斷常規(guī)的代碼執(zhí)行過程,用它接收到的信息做一些事情,但什么都不返回,然后退出。 | 總結(jié):過濾器修改它接收到的信息,將其返回給調(diào)用鉤子函數(shù),其他函數(shù)可以使用它返回的值。 |
有時,您可以使用動作或過濾器來實(shí)現(xiàn)相同的目標(biāo)。例如,如果您想修改文章中的文本,您可以使用publish_post動作注冊一個回調(diào)函數(shù),并在將文章內(nèi)容保存到數(shù)據(jù)庫時更改文章內(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過濾器注冊另一個回調(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é)果相同。知道何時使用一個而不是另一個是成為優(yōu)秀WordPress開發(fā)人員的關(guān)鍵。
WordPress鉤子如何工作?
房子的例子很簡單,可以理解鉤子的基本功能,但它沒有捕捉到它們?nèi)绾喂ぷ鞯膹?fù)雜性。最重要的是鉤位置和特異性的概念。
一個更好的例子是將處理WordPress網(wǎng)頁想象成組裝汽車。與制造汽車需要時間不同,組裝網(wǎng)頁幾乎是瞬間完成的。
組裝網(wǎng)頁就像組裝汽車
就像汽車如何在現(xiàn)代裝配線中逐個組裝在一起一樣,WordPress網(wǎng)頁由服務(wù)器和客戶端逐個組裝。
WordPress核心就像汽車引擎、底盤和其他必需品,為網(wǎng)站的“核心”功能提供動力。
您可以僅使用WordPress核心就擁有一個功能強(qiáng)大的網(wǎng)站,但這有什么樂趣呢?您需要向站點(diǎn)添加令人興奮的功能。這就是WordPress插件和主題介入的地方,它們都廣泛使用鉤子。
在上面的示例中,每個編號的站點(diǎn)就像WordPress核心中的一個鉤子。有兩種類型的站點(diǎn),例如動作和過濾器。每個站都包含一個特定類型的插槽,它只接受某些工具,類似于動作函數(shù)和過濾器函數(shù)。
為了模塊化和效率,所有站點(diǎn)都以頻繁的間隔放置。
根據(jù)特定位置的要求,我們可以為該特定站點(diǎn)的工作安裝(或鉤子)最合適的工具。這些工具就像用于與WordPress交互或修改WordPress的回調(diào)函數(shù)。
一些工具可以顯著改變汽車的工作,就像注冊到動作的回調(diào)一樣。其他工具僅用于自定義汽車的外觀,例如注冊到過濾器的回調(diào)。
在正確的站點(diǎn)使用正確的工具對于制造一流的汽車至關(guān)重要。同樣,鉤子幫助我們根據(jù)我們的獨(dú)特需求定制WordPress。
如果你擴(kuò)展這個類比,插件就像添加有用的汽車功能,如安全氣囊、娛樂控制臺、遠(yuǎn)程無鑰匙系統(tǒng)等(像這些是為了增強(qiáng)WooCommerce的功能)。主題類似于自定義汽車的視覺部分,例如整體設(shè)計、噴漆、輪輞等(這是自定義WordPress主題的方法)。
在哪里注冊鉤子及其函數(shù)?
在WordPress中添加鉤子有兩種推薦的方法:
- 插件:制作您自己的插件并在其中添加所有自定義代碼。
- 子主題:在子主題的
functions.php文件中注冊鉤子和回調(diào)函數(shù)。
對于本教程,讓我們從創(chuàng)建插件開始。為此,請在您的/wp-content/plugins/目錄中創(chuàng)建一個新文件夾。
我給我的插件命名salhooks,但你可以隨意命名它。根據(jù) WordPress 指南,您需要在插件目錄中創(chuàng)建一個具有相同名稱 (salhooks.php )的PHP文件。
將以下標(biāo)題字段添加到您的插件文件以將其注冊到WordPress。您可以在WordPress Codex中了解有關(guān)插件標(biāo)頭要求的更多信息。
保存此文件,然后在您的WordPress儀表盤中激活該插件。我將在本地WordPress安裝中使用這個插件來演示鉤子是如何工作的。
作為旁注,您還可以直接編輯WordPress核心文件以注冊鉤子。但是,不建議這樣做,因為每次更新WordPress時,您的所有自定義代碼都會被覆蓋。出于同樣的原因,您不應(yīng)該在父主題中添加鉤子。
使用WordPress鉤子
一個WordPress鉤子本身什么都不做。它只是坐在代碼中,等待一些鉤子函數(shù)來激活它。要使用鉤子,您至少需要調(diào)用2個其他函數(shù)。
首先,您需要使用鉤子函數(shù)注冊鉤子并在其中引用回調(diào)函數(shù)。然后你需要定義你之前在鉤子函數(shù)中提到的回調(diào)函數(shù)。每次觸發(fā)鉤子時,WordPress都會運(yùn)行此回調(diào)函數(shù)。
定義這些函數(shù)的順序無關(guān)緊要,但最好將它們放在一起。
動作和過濾器具有不同的鉤子函數(shù)。從現(xiàn)在開始,讓我們將它們稱為Action Functions和Filter Functions。正如您將看到的,它們有自己的語法和參數(shù)要求。
鉤住一個動作
動作提供了一種在WordPress 核心、插件或主題執(zhí)行中的特定點(diǎn)運(yùn)行自定義代碼的方法。
add_action() 動作函數(shù)
您可以按照以下步驟使用動作注冊回調(diào)函數(shù):
最好將回調(diào)函數(shù)參數(shù)命名為盡可能接近鉤子函數(shù)傳遞的參數(shù)。
讓我們看一個使用該
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掛鉤動作的示例
WordPress包含一個名為init的內(nèi)置動作,它會在WordPress完成加載并驗證用戶之后,但在發(fā)送任何標(biāo)頭之前觸發(fā)。許多插件使用此鉤子作為實(shí)例化其代碼的起點(diǎn),因為在WordPress運(yùn)行此動作時,幾乎所有主要的WordPress功能都已完成加載。
WordPress有一個類似的動作叫做admin_init。它在初始化管理屏幕時
init觸發(fā),而動作僅在WordPress完成加載后觸發(fā)。讓我們
echo在init動作執(zhí)行期間為一條簡單的消息運(yùn)行一個自定義代碼。這是如何做到的: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安裝的左上角看到這條消息。
不是很漂亮,但這是一個很好的開始!
查找WordPress支持的動作
WordPress每次執(zhí)行某些動作時都會包含操作,例如用戶登錄或發(fā)布新文章。您可以在插件API/動作參考頁面中找到WordPress運(yùn)行的所有動作的完整列表。
幾乎每次使用都有一個動作
Codex將其中列出的所有動作分為不同的類別,并按照WordPress執(zhí)行順序從頭到尾排列。
在大多數(shù)情況下,許多這些動作不會做任何事情,因為沒有任何東西與它們掛鉤。但是,如果您需要它們,它們就在那里供您使用。
對所有的動作感到有點(diǎn)不知所措?這是自然的。隨著您獲得更多經(jīng)驗并瀏覽WordPress核心源代碼,找到滿足您需求的完美鉤子將變得更加容易。只需搜索術(shù)語“ do_action ”,您就會發(fā)現(xiàn)許多可以鉤子的動作。
add_action() 的附加參數(shù)
add_action()函數(shù)可以接受另外兩個參數(shù):一個用于設(shè)置priority,另一個用于設(shè)置number of arguments。雖然它們是可選的,但如果使用得當(dāng),它們會非常有用。優(yōu)先事項
函數(shù)支持的第一個附加參數(shù)
add_action()設(shè)置priority. 該參數(shù)只能是正整數(shù)。優(yōu)先級數(shù)字越低,函數(shù)運(yùn)行得越早。如果不指定,其默認(rèn)值為10。為了看看它是如何工作的,讓我們?yōu)?code>init動作注冊三個回調(diào)函數(shù),但每個都有不同的優(yōu)先級。
// 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)先級編號最低的回調(diào)函數(shù)將首先運(yùn)行,編號最高的回調(diào)函數(shù)將最后運(yùn)行。如果它們的優(yōu)先級相同,那么它們將按照您注冊它們的順序運(yùn)行。
當(dāng)單個鉤子可以注冊多個回調(diào)函數(shù)時,優(yōu)先級起著重要作用。為避免意外結(jié)果,您可以為每個回調(diào)函數(shù)設(shè)置優(yōu)先級,以便它們按您希望的順序觸發(fā)。
參數(shù)數(shù)量
默認(rèn)情況下,通過該函數(shù)注冊的任何回調(diào)函數(shù)
add_action()將只接收一個參數(shù)。但是,有時您可能需要向回調(diào)函數(shù)傳遞額外的數(shù)據(jù)。出于這個原因,
add_action()函數(shù)接受一個可選參數(shù)來設(shè)置參數(shù)的數(shù)量。展示這一點(diǎn)的一個很好的例子是comment_post動作。此動作會在WordPress向數(shù)據(jù)庫添加評論后立即運(yùn)行。如果您不設(shè)置
number of arguments參數(shù),它只會將一個值傳遞給回調(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,則動作函數(shù)將傳遞三個值:
comment_ID、comment_approved和commentdata。WordPress將
comment_approved的值設(shè)置為1,如果未批準(zhǔn),則設(shè)置為0,如果評論標(biāo)記為垃圾評論,則設(shè)置為“spam”。
commentdata變量是一個包含所有評論數(shù)據(jù)的數(shù)組,例如評論作者的姓名、電子郵件地址、網(wǎng)站和評論本身的內(nèi)容。您可以查看WordPress Codex以查找包含在 ‘commentdata’ 數(shù)組中的所有鍵值對。您可以擁有任意數(shù)量的參數(shù),但回調(diào)函數(shù)和
add_action()函數(shù)需要指定相同數(shù)量的參數(shù)。通過將附加參數(shù)傳遞給回調(diào)函數(shù),您可以對代碼執(zhí)行更多動作。例如,您可以檢查評論是否獲得批準(zhǔn),并在獲得批準(zhǔn)后自動將評論文本通過電子郵件發(fā)送給管理員。不指定附加參數(shù)就不可能做到這一點(diǎn),因為您的回調(diào)函數(shù)將無法訪問
comment_content數(shù)據(jù)。如果不想設(shè)置優(yōu)先級,只想改變參數(shù)個數(shù),還是需要設(shè)置一個優(yōu)先級。只需使用其默認(rèn)值(即 10)。
WordPress核心如何使用動作鉤子
WordPress Core本身使用許多內(nèi)置動作來執(zhí)行各種功能。
以wp_head動作為例。當(dāng)WordPress輸出網(wǎng)頁的標(biāo)題部分(在
和之間的代碼)時,它會被觸發(fā)。你可以在
wp includes/default-filters.php文件中找到大多數(shù)與wp_head鉤子相關(guān)的WordPress核心動作函數(shù)。我仔細(xì)查看了代碼并編譯了所有調(diào)用wp_head動作的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ù)只與一個動作鉤子。設(shè)置
priority此處對于確保最重要的鉤子函數(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)更多信息,請訪問WordPress Codex上的函數(shù)參考頁面。
其他動作函數(shù)
雖然
add_action()是最常用的動作函數(shù),但還有許多其他函數(shù)同樣有用。讓我們看看它們是如何工作的。(1)has_action()
這個動作函數(shù)檢查一個動作是否已經(jīng)被掛鉤。它接受兩個參數(shù)。第一個是動作的名稱。第二個參數(shù)是可選的,是回調(diào)函數(shù)的名稱。
has_action( 'action_name', 'function_to_check' );如果只指定第一個參數(shù),則如果任何函數(shù)連接到
action_name參數(shù),則返回true。但是,如果您還指定了第二個參數(shù),那么如果指定的回調(diào)函數(shù)未注冊到上述動作,那么它將返回
false。但是,如果它找到附加到動作動作的回調(diào)函數(shù),它將返回該動作鉤子上為該函數(shù)設(shè)置的
priority(整數(shù))。(2)do_action()
我們以前遇到過此動作函數(shù)。WordPress使用它來定義它的所有默認(rèn)動作,使其他函數(shù)能夠鉤住它們。與WordPress一樣,您也可以使用
do_action()函數(shù)通過指定新動作名稱作為參數(shù)來創(chuàng)建新的自定義動作。do_action( 'action_name', [argument1], [argument2] );僅僅聲明這個函數(shù)本身不會做任何事情。但它將保存在代碼中,等待其他動作函數(shù)激活它。傳遞任何額外的參數(shù)都是可選的,但如果希望回調(diào)函數(shù)使用它們,這一點(diǎn)很重要。
(3)do_action_ref_array()
此動作函數(shù)與
do_action()相同,只是有一個區(qū)別。通過它傳遞的任何參數(shù)都必須是數(shù)組。當(dāng)您有很多參數(shù)要傳遞,或者您的參數(shù)已經(jīng)在數(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ù)組是有序映射,因此請確保傳遞的參數(shù)順序正確。
此動作函數(shù)的使用示例是admin_bar_menu動作。它可以被掛鉤以添加、操作或刪除各種管理欄項目。所有管理欄項目都定義為數(shù)組元素。
(4)did_action()
如果你想計算任何動作被觸發(fā)的次數(shù),你可以調(diào)用這個動作函數(shù)。
did_action( 'action_name' );此函數(shù)返回一個整數(shù)值。
當(dāng)您只想在第一次運(yùn)行動作時運(yùn)行回調(diào)函數(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()
這個動作函數(shù)移除一個與指定動作鉤子的回調(diào)函數(shù)。例如,您可以使用此函數(shù)刪除連接到內(nèi)置動作的默認(rèn)WordPress函數(shù),并將其替換為您自己的函數(shù)。
remove_action( 'action_name', 'function_to_be_removed', [priority] );調(diào)用
remove_action()函數(shù)有幾個先決條件:這是WooCommerce如何使用此動作函數(shù)刪除主商店頁面上的默認(rèn)產(chǎn)品縮略圖的示例。
remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );(6)remove_all_actions()
這個動作函數(shù)刪除所有與動作鉤子的東西。優(yōu)先級參數(shù)是可選的。
remove_all_actions( 'action_name', [priority] );請記住,不能從您要取消注冊回調(diào)函數(shù)的動作中調(diào)用此函數(shù)。那會導(dǎo)致無限循環(huán)。您可以掛鉤之前觸發(fā)的動作以運(yùn)行此函數(shù)而不會出現(xiàn)任何錯誤。
(7)doing_action()
這個動作函數(shù)檢查指定的動作是否正在運(yùn)行。它返回一個布爾值(
true或false)。// check whether the 'action_name' action is being executed if ( doing_action( 'action_name' ) ) { // execute your code here }您可以將
action_name參數(shù)留空以檢查是否正在執(zhí)行任何動作。每次觸發(fā)任何動作時它都會返回true。// check if any action is running and do something if ( doing_action() ) { // the code here is run when any action is fired }動作示例 1:向站點(diǎn)訪問者顯示維護(hù)消息
有時,最好讓您的網(wǎng)站脫機(jī)并設(shè)置維護(hù)中頁面。幸運(yùn)的是,WordPress提供了一種簡單的方法來做到這一點(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.' ); }讓我們分解代碼并完成每個步驟:
- get_header是在站點(diǎn)的頭模板文件加載之前觸發(fā)的動作。如果您想中斷主站點(diǎn)的加載,這是一個完美的動作。
get_header使用add_action()帶有maintenance_message()回調(diào)函數(shù)的函數(shù)連接到動作中。- 定義
maintenance_message()回調(diào)函數(shù)。 current_user_can( 'edit_posts' )是一個用戶能力測試函數(shù),用于檢查當(dāng)前用戶是否已登錄并可以編輯文章。除了具有訂閱者角色的用戶之外,在WordPress站點(diǎn)上注冊的每個用戶都可以編輯文章。還有其他可靠的方法來執(zhí)行此檢查,但我們將在這里堅持使用這種簡單的方法。- 使用默認(rèn)的wp_die()函數(shù)優(yōu)雅地終止WordPress執(zhí)行并顯示帶有錯誤消息的HTML頁面。您可以在錯誤消息參數(shù)中使用HTML語法對其進(jìn)行格式化。
在我的自定義插件中保存代碼后,我以隱私瀏覽模式加載了本地WordPress安裝。將在維護(hù)頁是成功的!
向站點(diǎn)訪問者顯示錯誤消息
如果我在通過用戶能力測試時登錄,該站點(diǎn)將成功加載。您現(xiàn)在可以繼續(xù)修復(fù)您的網(wǎng)站,同時它會向??惋@示此頁面。
動作示例 2:對非管理員用戶隱藏儀表板菜單項
如果您正在運(yùn)行一個多作者博客或為您的客戶管理一個站點(diǎn),那么您可能需要為非管理員用戶在WordPress儀表盤中隱藏某些管理菜單。你可以通過掛鉤到admin_menu動作來做到這一點(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ā)的動作。
- 使用
add_action()函數(shù)和hide_admin_menus()回調(diào)函數(shù),以實(shí)現(xiàn)鉤住admin_menu動作。 hide_admin_menus()回調(diào)函數(shù)定義的代碼的邏輯。每次admin_menu動作觸發(fā)時它都會運(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)前用戶對象。通過這個函數(shù),我們可以檢查登錄用戶是否有設(shè)置特定的
display_name。這是一個可選行,以防您想省略某些非管理員用戶由于此回調(diào)函數(shù)而被鎖定。 - WordPress的函數(shù)remove_menu_page() 刪除頂級管理菜單。在上面的代碼示例中,我刪除了以下管理菜單:插件、主題、工具、用戶、頁面和選項。
保存插件文件后,這是管理員登錄的WordPress儀表盤的快照。
默認(rèn)的WordPress管理儀表盤
這是非管理員用戶登錄的WordPress儀表盤的屏幕截圖。
對非管理員用戶隱藏敏感的管理菜單項
此解決方案僅隱藏指定的管理菜單項,以免出現(xiàn)在WordPress儀表盤中。所有用戶仍然可以通過在瀏覽器中輸入菜單URL來訪問它們。
要禁止某些用戶角色訪問特定菜單,您需要編輯他們的能力。
掛鉤過濾器
過濾器為您的自定義代碼提供了一種方法來修改其他WordPress功能使用的數(shù)據(jù)。與動作不同,掛鉤到過濾器的函數(shù)需要返回一個值。
add_filter() 過濾函數(shù)
您可以按照以下步驟將回調(diào)函數(shù)掛接到過濾器:
下面是一個示例,說明如何使用add_filter()函數(shù)將回調(diào)函數(shù)掛接到過濾器。
// 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
掛鉤過濾器的示例
WordPress提供了一個名為login_message的過濾器來過濾登錄表單上方登錄頁面上顯示的消息。此過濾器返回的值可以帶有HTML標(biāo)記。
讓我們掛入login_message過濾器并修改登錄屏幕上顯示的消息。
// 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ù)中的語句檢查登錄消息是否已經(jīng)設(shè)置,主要是由另一個插件或主題設(shè)置的。在這種情況下,回調(diào)函數(shù)返回原始值,不做任何更改。這是避免與其他插件或主題沖突的一種方法。
您可以在WordPress登錄頁面的登錄表單上方看到顯示的消息。
在登錄表單上方顯示自定義登錄消息
您可以通過將自定義樣式表排入隊列來設(shè)置登錄頁面上所有元素的樣式。這樣做將允許您完全自定義默認(rèn)的WordPress登錄頁面。
您將在“使用鉤子自定義WordPress登錄頁面”部分中了解如何使用動作鉤子加載自定義樣式表。
查找WordPress支持的過濾器
在WordPress處理或修改數(shù)據(jù)的任何地方,您幾乎肯定可以找到一個過濾器來連接和更改它。將過濾器視為WordPress數(shù)據(jù)庫和瀏覽器之間的接口。
您可以在插件API/過濾器參考頁面中找到WordPress支持的所有過濾器的詳盡列表。
WordPress提供了多種過濾器來掛鉤
那里列出的所有過濾器都分為多個類別,并按照WordPress執(zhí)行順序從上到下排列。
如果您想在WordPress源代碼中找到要掛鉤的過濾器,請搜索術(shù)語“apply_filters”,您將獲得大量結(jié)果。在WordPress的代碼參考也來搜索隨機(jī)配備在WordPress,包括動作和過濾器一切的好地方。
WordPress核心如何使用過濾器
WordPress Core本身使用許多內(nèi)置過濾器來修改其各種功能使用的數(shù)據(jù)。
例如考慮the_content過濾器。它在從數(shù)據(jù)庫中檢索到文章內(nèi)容之后和在瀏覽器上顯示之前過濾文章內(nèi)容。
就像動作一樣,您可以the_content在wp-includes/default-filters.php文件中找到與鉤子相關(guān)的大多數(shù)WordPress Core過濾器函數(shù)。
add_filter()是掛接到the_content過濾器的所有核心函數(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().
請注意為某些回調(diào)函數(shù)指定的優(yōu)先級。
例如,do_blocks()函數(shù)解析文章內(nèi)容中的任何動態(tài)塊并重新渲染它們以與WordPress的新區(qū)塊編輯器兼容。它指定了比默認(rèn)值 (10) 更高的優(yōu)先級,以確保在運(yùn)行其他功能之前內(nèi)容已準(zhǔn)備好塊。
convert_smilies()函數(shù)設(shè)置為較低的優(yōu)先級運(yùn)行它的任務(wù)是將文本轉(zhuǎn)換表情圖像精靈。在過濾所有文章內(nèi)容后讓它在最后運(yùn)行是有道理的。
有趣的事實(shí):短代碼是過濾器的一個子集。他們從短代碼中獲取輸入,對其進(jìn)行處理,然后將輸出返回給它。
其他過濾器函數(shù)
雖然add_filter()是最常用的過濾函數(shù),但還有許多其他有用的過濾函數(shù)。讓我們深入討論它們。
(1)has_filter()
此函數(shù)檢查指定的過濾器是否被任何函數(shù)掛鉤。它接受兩個參數(shù)。第一個參數(shù)用于輸入過濾器名稱。第二個參數(shù)是可選的,用于輸入回調(diào)函數(shù)的名稱。
has_filter( 'filter_name', 'function_to_check' );
如果您僅指定第一個參數(shù),則它會在任何函數(shù)filter_name掛鉤時返回true。
但是,如果您同時指定了這兩個參數(shù),那么如果提到的回調(diào)函數(shù)未在給定的過濾器中注冊,它將返回false。如果它找到了向過濾器注冊的回調(diào)函數(shù),那么它會在此過濾器上返回該函數(shù)的priority(整數(shù))集。
has_filter()函數(shù)的一種可能應(yīng)用是檢查是否已經(jīng)掛接了任何過濾器,并在此基礎(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()
這個過濾器函數(shù)就像do_action()動作函數(shù)。任何掛鉤到此過濾器的回調(diào)函數(shù)都將在WordPress代碼中此函數(shù)的任何位置運(yùn)行。
您還可以使用此函數(shù)通過將過濾器名稱和過濾器值指定為參數(shù)來創(chuàng)建新的自定義過濾器。
apply_filters( 'filter_name', 'value_to_filter', [argument1], [argument2] );
如果要將它們傳遞給回調(diào)函數(shù),請不要忘記指定任何其他參數(shù)。大多數(shù)過濾器只使用一個參數(shù),因此很容易錯過定義其他參數(shù)。
- apply_filters_ref_array()
這個函數(shù)就像apply_filters()函數(shù)一樣,除了它接受的所有參數(shù)都捆綁成一個數(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ù)會很方便。確保數(shù)組內(nèi)的參數(shù)順序正確。
(3)current_filter()
此過濾器函數(shù)檢索當(dāng)前正在運(yùn)行的過濾器或動作的名稱。您不需要指定任何參數(shù),因為它在回調(diào)函數(shù)中運(yùn)行。
下面是它的用法示例:
function example_callback() {
echo current_filter(); // 'the_title' will be echoed
return
}
add_filter( 'the_title', 'example_callback' );
盡管它的名字,這個函數(shù)可以檢索動作和過濾器的名稱。
(4)remove_filter()
此過濾器函數(shù)刪除附加到指定過濾器的回調(diào)函數(shù)。它的工作原理與remove_action()函數(shù)完全一樣。您可以使用它來刪除使用特定過濾器注冊的默認(rèn)WordPress函數(shù),并在必要時將其替換為您自己的函數(shù)。
remove_filter( 'filter_name', 'function_to_be_removed', [priority] );
要取消掛鉤到過濾器的回調(diào)函數(shù),function_to_be_removed,并且priority參數(shù)必須與掛鉤回調(diào)函數(shù)時使用的參數(shù)相同。
如果過濾器是從類中添加的,通常是通過插件添加的情況,那么您需要訪問類變量以刪除過濾器。
// 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') );
讓我們看看一個很好的例子remove_filter()。
WooCommerce插件使用wc_lostpassword_url()掛接到它的通話函數(shù)lostpassword_url過濾器重定向用戶的嘗試“忘記密碼?”。
它需要任何用戶單擊該鏈接到帶有URL的自定義前端頁面/my-account/lost-password。如果沒有這個過濾器,它會將它們帶到標(biāo)準(zhǔn)的WordPress登錄URL/wp-login.php。
假設(shè)您要重置此函數(shù)并將您的用戶發(fā)送到默認(rèn)密碼檢索頁面 或完全單獨(dú)的頁面。您可以像這樣刪除此回調(diào)函數(shù):
remove_filter( 'lostpassword_url', 'wc_lostpassword_url', 10 );
(5)remove_all_filters()
此過濾器函數(shù)刪除注冊到過濾器的所有回調(diào)函數(shù)。
remove_all_filters( 'filter_name', [priority] );
它的remove_all_actions()函數(shù)類似。
流行的Advanced Excerpts插件使用此函數(shù)刪除所有與the_excerpt和get_the_excerpt過濾器鉤子的默認(rèn)函數(shù)。這樣做之后,它然后將自己的回調(diào)函數(shù)掛接到過濾器。
// 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()
此過濾器函數(shù)檢查指定的過濾器是否正在執(zhí)行。
if ( doing_filter( 'save_post' ) ) {
// run your code here
}
它返回一個布爾值(true或false)。
您應(yīng)該注意此函數(shù)與current_filter()返回正在運(yùn)行的過濾器或動作的名稱(字符串)的函數(shù)之間的區(qū)別。
過濾器示例 1:為評論添加敏感詞過濾器
管理WordPress網(wǎng)站上的所有評論可能是一個繁瑣的過程。 comment_text過濾器允許您設(shè)置規(guī)則,以便在將評論輸出到顯示器上之前對其進(jìn)行修改。
帶有敏感詞標(biāo)記的未經(jīng)過濾的評論
您可以指示W(wǎng)ordPress在任何敏感詞顯示給您的網(wǎ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是一個過濾器鉤子,允許您在瀏覽器顯示之前修改評論的文本。您可以向它注冊回調(diào)函數(shù)以過濾其輸出。
- 通過
add_filter()函數(shù),您可以連接到comment_text過濾器并為其附加回調(diào)函數(shù)。 the_profanity_filter()是回調(diào)函數(shù)的名稱。它只接受一個參數(shù),即一個包含評論文本的字符串。使用適當(dāng)?shù)拇a邏輯定義此自定義函數(shù)。- 將所有敏感詞存儲在名為
profaneWords的PHP數(shù)組中。您可以向該數(shù)組添加任意數(shù)量的單詞。在PHP函數(shù)sizeof()的幫助下,我將這個數(shù)組的大小存儲在profaneWordsCount變量中。 - 循環(huán)遍歷所有敏感詞,并使用PHP的默認(rèn)str_ireplace() 函數(shù)將任何匹配的敏感詞替換為
*符號。由于這是一個不區(qū)分大小寫的字符串替換函數(shù),因此您不必?fù)?dān)心大小寫。查看執(zhí)行搜索和替換的不同方法。 - 使用
return輸出過濾后的評論文本。
將更改保存到您的自定義插件文件并重新加載任何帶有評論的文章。您包含在profaneWords數(shù)組中的所有單詞現(xiàn)在都應(yīng)替換為“ *”符號。
審查帶有“*”符號的評論中的敏感詞
原始評論仍將在數(shù)據(jù)庫中保持原樣。此過濾器僅在將評論文本輸出到前端之前對其進(jìn)行修改。
網(wǎng)站后臺原評論
一旦你使用了正確的過濾器,你就可以用它做很多很酷的事情。
例如,您還可以使用comment_text過濾器從所有評論中刪除任何 URL(請務(wù)必閱讀有關(guān)如何阻止WordPress中的垃圾評論的深入指南)。
或者,您可以連接到pre_comment_approved過濾器,并根據(jù)預(yù)定義的標(biāo)準(zhǔn)將評論標(biāo)記為已批準(zhǔn)、垃圾郵件或駁回。
過濾器示例 2:在文章后插入內(nèi)容
您已經(jīng)看到WordPress如何使用the_content過濾器來修改文章或頁面內(nèi)容。讓我們使用相同的過濾器在每篇文章的末尾添加一些內(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過濾器鉤子可幫助您獲取當(dāng)前文章的內(nèi)容并對其進(jìn)行自定義。- 使用
add_filter()函數(shù)通過insert_content_below()回調(diào)函數(shù)鉤住the_content過濾器。 - 通過將當(dāng)前文章的內(nèi)容作為參數(shù) (
$content)傳遞來定義回調(diào)函數(shù)。 - 在回調(diào)函數(shù)中,檢查您是否只過濾了主查詢中的內(nèi)容,在本例中是文章內(nèi)容。如果您不驗證這一點(diǎn),有時代碼會無意中過濾來自其他地方的內(nèi)容,例如側(cè)邊欄和頁腳。
- is_main_query()和in_the_loop()條件確定查詢是否為主查詢以及是否發(fā)生在主WordPress循環(huán)中。
- is_single()條件檢查查詢是否針對單個文章。
- 使用PHP的字符串連接運(yùn)算符(
$content . "your additions") 向頁面內(nèi)容添加額外內(nèi)容。 - 如果上述所有條件都檢查出來,則
return過濾后的評論。如果沒有,則只返回內(nèi)容而不做任何更改。
保存您的插件文件,加載您網(wǎng)站上的任何文章,然后滾動到最后。
在文章內(nèi)容的末尾插入一些東西
通過反轉(zhuǎn)字符串連接參數(shù) ( "your additions" . $content)的位置,您可以使用相同的邏輯在所有文章的開頭添加任何內(nèi)容。
使用鉤子自定義WordPress登錄頁面
讓我們同時使用動作和過濾器鉤子來自定義默認(rèn)的WordPress登錄頁面。我將創(chuàng)建一個名為Sal Custom Login Page的新插件來執(zhí)行此動作。您可以在本節(jié)末尾找到此插件的完整源代碼。
最終定制的WordPress登錄頁面
讓我們開始添加標(biāo)準(zhǔn)插件標(biāo)題字段并將其注冊到WordPress。
首先,login_enque_scripts動作鉤子將您的自定義樣式表排入隊列。您在此處排隊的任何腳本或樣式都包含在登錄頁面的標(biāo)題部分中。
如果您想在站點(diǎn)的前端(而不是在管理后端或登錄區(qū)域)加載自定義腳本和樣式表,那么您需要掛接到
wp_enqueue_scripts動作。您可以在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路徑(帶有斜杠)。我不會解釋這里應(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!'; }接下來,login_errors過濾器鉤子更改當(dāng)有人輸入錯誤憑據(jù)時顯示的錯誤消息。過濾錯誤消息將阻止攻擊者輕松猜測您的用戶名。
// 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 ); }每次有人輸入錯誤的登錄憑據(jù)時,登錄表單框都會劇烈晃動。這是一個可選步驟,但我將其包含在內(nèi)是為了表明您還可以從登錄頁面中刪除某些功能。
您將在本文的最后一節(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過濾器來修改它們。
如果您想在此插件的基礎(chǔ)上構(gòu)建并進(jìn)一步試驗,您可以下載該插件的源代碼并開始使用。
WordPress鉤子列表和資源
很難記住WordPress的所有各種鉤子。有數(shù)以千計的內(nèi)置動作和過濾器可供使用。因此,找到一個合適的鉤子有時感覺就像是在尋寶。
值得慶幸的是,您可以使用各種資源來確定滿足您需求的完美鉤子。
- WordPress插件手冊 — Hooks
第一個熟悉鉤子的地方是WordPress Codex,尤其是插件手冊中的鉤子部分。在這里您可以找到有關(guān)鉤子和鏈接的基本信息,以完成有關(guān)所有動作和過濾器鉤子的文檔。
使用WordPress插件手冊開始學(xué)習(xí)鉤子
為插件手冊中的這些有用鏈接添加書簽以加快搜索速度:
- 插件API — 鉤子函數(shù)參考
- 插件API — 動作參考
- 插件API — 過濾器參考
動作參考和過濾器參考頁面都會為您提供通常在特定WordPress請求期間運(yùn)行的所有鉤子的列表。
例如,您可以找到訪問管理頁面、處理文章頁面附件或類別時觸發(fā)的所有鉤子。
- WordPress代碼參考
WordPress Codex還包括一個方便的搜索工具,用于查找其所有函數(shù)、鉤子、方法和類。此頁面還列出了最新版本的WordPress中的新組件和更新組件。如果您想了解WordPress內(nèi)部發(fā)生的事情,請先前往這里。
在此處搜索WordPress內(nèi)的任何內(nèi)容
- Adam R Brown的WordPress鉤子索引
這個WordPress鉤子索引按類型、它們首次亮相的WordPress版本以及它們是否被棄用對所有鉤子進(jìn)行排序。
Adam R Brown的WordPress鉤子索引
按照它們的出現(xiàn)順序?qū)︺^子進(jìn)行排序會告訴你,最古老的WordPress鉤子仍然是最常用的。如果您不熟悉WordPress開發(fā),熟悉這些流行的動作和過濾器是最快的方法。
雖然此索引自WordPress 5.1以來尚未更新,但瀏覽所有主要鉤子仍然很有幫助。
仍然很難找到你想要的鉤子嗎?使用正確的關(guān)鍵字進(jìn)行在線搜索始終是一個很好的開始方式。如果其他一切都失敗了,您可以隨時深入研究WordPress代碼。
查找在WordPress頁面上注冊的鉤子
正如我們所見,WordPress有大量可用的鉤子,但并非每個鉤子都會在每個頁面上觸發(fā)。如果您能找到可以在特定頁面上掛鉤的動作和過濾器,那么您就贏了一半。
雖然您可以使用xdebug和PHPCS等高級PHP調(diào)試工具來幫助解決此問題,但您可以在WordPress中運(yùn)行更簡單的開發(fā)工具,例如調(diào)試欄和查詢監(jiān)視器。
帶有動作和過濾器插件的調(diào)試欄
Debug Bar是一個官方的WordPress插件,它為您的管理欄添加了一個Debug菜單。它顯示PHP警告和通知、緩存請求、MySQL查詢和其他有用的調(diào)試信息。
注:此插件最近未更新,也未使用WordPress的最新主要版本進(jìn)行測試。我們提到它是一個方便的插件,用于了解有關(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)該會在管理欄中看到Debug菜單選項。單擊它會將您帶到其儀表板,在那里您可以看到附加到您訪問它的頁面的各種查詢和緩存。
WordPress管理欄中的“Debug”菜單
接下來,您需要安裝Debug Bar Actions and Filters Addon插件。這是一個
分享標(biāo)題:WordPress鉤子詳解:如何使用動作、過濾器和自定義鉤子
轉(zhuǎn)載來源:http://m.fisionsoft.com.cn/article/dhoedsj.html


咨詢
建站咨詢
