操作和過濾器掛鉤是各種 WordPress API 的基本組成部分。沒有它們,您在主題和(尤其是)插件中的功能就會受到限制。
但有時很容易混淆兩者,特別是在 WordPress 同時具有同名的操作鉤子和過濾器鉤子的情況下。
在本文中,我將定義操作和過濾器掛鉤並描述它們之間的區別,並且我將演示如何在主題和插件中使用它們。我還將給出一些示例,說明您何時可以使用它們。
當您在 WordPress 中添加操作並將過濾器掛鉤添加到程式碼中(或將函數掛鉤到它們)時,它有助於了解 WordPress 如何調用操作和過濾器以及按什麼順序發生的情況。我不會在這裡詳細介紹這一點,因為我們有另一個教程可以完成這項工作。
讓我們從一些定義開始。我還將定義操作和過濾器掛鉤和函數,以便您可以看到它們之間的差異。
函數是大多數人在學習 WordPress 開發時首先接觸到的東西;如果您已將程式碼新增至主題的 functions.php 檔案中,那麼您將編寫一個函數。
函數指定事情會如何發生。您編寫一個函數來查詢資料、輸出內容或執行許多其他任務。您可以直接在主題的範本檔案中呼叫(執行)函數,也可以將它們掛接到操作或篩選器掛鉤上。函數還可以包含模板標記(例如條件標記),以指定何時應套用函數。
我將在本文後面向您展示執行函數的不同方法。
當發生某些事情時,例如載入頁面、使用者登入或您在主題或外掛程式中定義的自訂操作,將觸發操作掛鉤(或操作)。
您可以使用 do_action()
函數來新增自己的操作掛鉤,我很快就會示範該函數。您掛鉤到該操作的任何函數都將在程式碼中的該點運行。
過濾器掛鉤或過濾器控制某些事情如何發生或更改已經輸出的內容。您可以使用過濾器以特定格式輸出元數據,覆蓋插件的文字輸出,或完全阻止某些內容的顯示。
您可以使用 apply_filters()
函數在程式碼中新增過濾器,我很快就會示範該函數。正如單字「apply」所示,您將過濾器應用於現有程式碼,而使用 do_action()
建立的操作在您將函數掛鉤到它之前是空的。
讓我們來看一些範例,示範如何使用函數、操作和篩選器。首先,我們將研究直接在程式碼中使用函數,而不將它們附加到掛鉤。
下面是直接在模板檔案中呼叫的函數的範例。在我的客戶網站中,我在頁腳中新增了版權頁,其中包含版權資訊。函數如下:
if ( ! function_exists( 'compass_colophon' ) ) { function compass_colophon() { ?> <section class="colophon" role="contentinfo"> <small class="copyright left"> <?php echo compass_copyright(); ?> <a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> <?php bloginfo( 'name' ); ?> </a> </small><!-- #copyright --> <small class="credits right"> Powered by <a href="https://wordpress.org/">WordPress</a> and designed by <a href="https://compass-design.co.uk">Compass Design</a>. </a> </small><!-- #credits --> </section><!--#colophon--> <?php } }
這個函數是可插入的,因為我在父主題中使用它;如果我隨後在子主題中建立一個具有相同名稱的新函數,它將覆蓋該函數。注意函數中還包含另一個函數compass_colophon()
,直接在程式碼中呼叫。
這個函數位於我的父主題的 functions.php
檔案中。我可以直接在我的主題的 footer.php
檔案中呼叫它,如下所示:
compass_colophon();
這將在我的主題中調用它的位置處輸出函數中的程式碼。您也可以將參數傳遞給函數,然後在函數內部使用這些參數。
正如我稍後將演示的,此函數也可以掛鉤到操作或過濾器。
與直接呼叫該版權頁函數相比,如果將其附加到掛鉤,我將擁有更大的靈活性。
我可以在 footer.php 文件中的该位置添加一个操作挂钩,而不是在页脚文件中调用 compass_colophon()
函数,方法是添加以下内容:
do_action( 'compass_in_footer' );
do_action()
函数有一个强制参数,即操作的名称。您还可以选择向其添加参数。
所以现在我需要将其挂接到我的新操作挂钩,而不是调用我的版权页函数。在我的 functions.php 文件中,我将其添加到我的函数中:
add_action( 'compass_in_footer', 'compass_colophon' );
这将我的函数挂钩到 compass_in_footer
操作,这意味着我的函数内的代码将在代码中放置该操作的位置运行。第一个参数是操作钩子的名称,第二个参数是我的函数的名称。
这样做的一个优点是,您可以将多个函数挂钩到同一个操作,并且您可以设置优先级,以便它们按照您希望的顺序触发。
假设我有另一个函数想要挂钩到我的 compass_in_footer
挂钩,称为 compass_smallprint()
,其中包含更多小字:
if ( ! function_exists( compass_smallprint() ) ) { function compass_smallprint() { // contents of function here } } add_action( 'compass_in_footer', 'compass_smallprint', 20 );
你可以在这里看到我在我的 add_action()
函数中添加了第三个参数,这是优先级。默认优先级是 10
,如果将此留空,则会应用该优先级。因此,因为我没有为 compass_colophon()
函数设置优先级,所以为 compass_smallprint()
函数设置 20 将使该函数在之后运行/em> compass_colophon()
函数。
有时您想停止某个函数的运行。一种方法是创建该函数的虚拟版本,如果它是可插入的,则该函数不执行任何操作。简而言之,可插入函数允许您根据代码的执行顺序覆盖某些行为。您可能还想了解可插入函数的基础知识及其用法,以便在您还没有听说过它们时能够跟上。
实现此目的的另一种方法是使用操作挂钩。如果该函数已挂钩到操作挂钩,则可以使用 remove_action()
函数来执行此操作。因此,如果我想阻止 compass_smallprint()
函数运行,我可以将其从 compass_in_footer
操作中取消挂钩,如下所示:
remove_action( 'compass_in_footer', 'compass_smallprint', 20 );
remove_action()
函数具有三个参数:操作挂钩的名称、函数的名称以及函数最初挂钩到操作的优先级。您必须添加优先级才能使其发挥作用。
如果您想阻止所有函数执行,您还可以将所有函数从操作中取消挂钩。执行此操作时要小心,因为可能有一些您不知道的函数与您的操作挂钩。
为此,请使用 remove_all_actions()
函数:
remove_all_actions( 'compass_in_footer' );
添加优先级数字作为第二个参数只会删除挂钩到具有您指定的优先级的操作挂钩的函数,这为您提供了更多控制权。
您还可以选择将函数挂钩到过滤器挂钩。当您想要更改或覆盖某些现有代码时,可以执行此操作。当您创建过滤器挂钩(使用 apply_filters()
函数)时,您可以将其包装在主题或插件中的代码中,然后由附加到挂钩的任何过滤器进行更改。
如果您有想要覆盖默认设置的主题或插件选项,或者您正在创建可能包含被子主题覆盖的元素的父主题,这可能会很有用。
apply_filters()
函数具有三个参数:过滤器挂钩的名称、要过滤的值(即默认值)以及随后传递给的可选变量挂钩到过滤器的函数。
您可以在主题模板文件中或通过操作挂钩挂钩的函数内添加过滤器。让我们看一下这两个选项。
返回到我的 compass_colophon()
函数,我将其内容添加到 footer.php 文件中,将其转换为过滤器>apply_filters()
函数如下:
echo apply_filters( 'compass_colophon', ' <section class="colophon" role="contentinfo"> <small class="copyright left"> <?php echo compass_copyright(); ?> <a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> <?php bloginfo( 'name' ); ?> </a> </small><!-- #copyright --> <small class="credits right"> Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>. </a> </small><!-- #credits --> </section><!--#colophon-->' );
这将输出我设置为 apply_filters()
函数的第二个参数的代码。
但是,我不想将其直接添加到我的主题模板文件中,因此我会将过滤器添加到我已经通过操作挂钩附加的函数中。
因此,我使用 do_action()
函数将 compass_in_footer
操作添加到我的 footer.php 文件中,如上所示,然后我在我的 functions.php 文件中创建一个函数,该函数与该操作挂钩并包含一个过滤器:
if ( ! function_exists( 'compass_colophon' ) ) { function compass_colophon() { echo apply_filters( 'compass_colophon_filter', ' <section class="colophon" role="contentinfo"> <small class="copyright left"> <?php echo compass_copyright(); ?> <a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> <?php bloginfo( 'name' ); ?> </a> </small><!-- #copyright --> <small class="credits right"> Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>. </a> </small><!-- #credits --> </section><!--#colophon-->' ); } add_action( 'compass_in_footer', 'compass_colophon' );
这意味着我现在可以通过以下三种方式之一覆盖默认内容:
compass_colophon()
的新函数,该函数会覆盖我的父主题中的函数,因为它是可插入的compass_in_footer
操作挂钩中取消 compass_colophon()
函数,并编写一个新函数并将其附加到其位置compass_colophon_filter
过滤器挂钩,该挂钩会覆盖 apply_filters()
函数中的值在现实生活中,您不需要有这么多选项,因此您更有可能将过滤器应用于函数中的部分内容,而不是整个内容。
因此我可以创建两个过滤器,一个用于版权部分,另一个用于制作人员:
if ( ! function_exists( 'compass_colophon' ) ) { function compass_colophon() { echo '<section class="colophon" role="contentinfo">'; echo apply_filters( 'compass_copyright_filter', ' <small class="copyright left"> <?php echo compass_copyright(); ?> <a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> <?php bloginfo( 'name' ); ?> </a> </small><!-- #copyright -->' ); echo apply_filters( 'compass_credit_filter', ' <small class="credits right"> Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>. </a> </small><!-- #credits -->' ); echo '</section><!--#colophon-->'; } add_action( 'compass_in_footer', 'compass_colophon' );
然后我可以通过取消挂钩或在子主题中编写一个新函数来覆盖整个 compass_colophon 函数,或者我可以创建一个挂钩到 compass_copyright_filter
或 compass_credits_filter
过滤器挂钩,单独覆盖每个元素。
要将函数挂钩到过滤器挂钩,请使用 add_filter()
函数,该函数有两个参数:挂钩名称和函数名称。
因此,要更改学分,我会编写以下函数:
function new_credits() { ?> <small class="credits right"> Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://rachelmccollin.co.uk">Rachel McCollin</a>. </a> </small><!-- #credits --> <?php } add_filter( 'compass_credits_filter', 'new_credits' );
这会用我的 new_credits()
函数的内容覆盖我原来的 compass_credits_filter
过滤器挂钩中设置的值,但将其他所有内容保留在 compass_colophon()
功能相同。
您还可以在将函数挂钩到过滤器时指定优先级,其方式与操作挂钩完全相同。优先级较低的函数将首先运行。
与操作挂钩一样,您也可以从过滤器挂钩中删除函数。您可以使用 remove_filter()
函数来执行此操作,该函数具有三个参数:过滤器挂钩的名称、函数的名称和优先级,如果在函数最初挂钩时设置了优先级,则优先级是强制性的过滤器。
因此,要删除我的 new_credits()
函数,我使用这个:
remove_filter( 'compass_credits_filter', 'new_credits' );
代码输出将恢复为我在原始 apply_filters()
函数中指定的值。因此,如果我想删除 new_credits()
函数并且没有任何内容出现在其位置,我必须添加一个新函数。然后,我取消第一个函数的挂钩并挂钩我的新函数,如下所示:
function no_credits() { return; } remove_filter( 'compass_credits_filter', 'new_credits' ); add_filter( 'compass_credits_filter', 'no_credits' );
让我们鸟瞰整个事情,以更好地理解它是如何组合在一起的。本教程的主要目标是将内容输出到页脚,并以一种使其他人可以轻松修改页脚内容的方式进行。
最简单的方法是直接调用 footer.php 文件中的函数。然而,这剥夺了函数执行及其输出的一些灵活性。克服这个限制的一种方法是使用钩子,这就是我们接下来所做的。
我们将对 compass_colophon()
函数的调用替换为对 do_action()
的调用。请记住,do_action()
函数没有调用 compass_colophon()
。它只是在 do_action()
调用的位置创建了一个操作挂钩。在我们的例子中,操作挂钩的名称是 compass_in_footer
。
触发 compass_in_footer
操作时我们要调用的实际函数是通过调用 add_action()
函数来指定的。它将我们的钩子名称作为它的第一个参数,我们的回调函数作为第二个参数。我们附加到 compass_in_footer
操作的第一个回调函数是 compass_colophon()
函数。
我们还可以选择将多个回调函数附加到同一个钩子。这正是我们添加 compass_smallprint()
函数作为操作挂钩的另一个回调时所做的事情。调用函数的顺序由传递给 add_action()
的第三个参数的值决定。这使我们能够确保 compass_smallprint()
函数在 compass_colophon()
之后执行。
使用操作掛鉤的一個優點是,當觸發操作時,您也可以透過將其名稱傳遞給 remove_action()
函數來停止執行任何附加的回呼函數。
此時,我們有一個在頁腳中觸發的操作鉤子,並且我們呼叫了附加到該操作鉤子的不同回調函數。基本上,我們採取了一些操作並輸出想要放置在網站頁腳中的內容。其他人也可以取消我們的函數的掛鉤並將自己的回調函數附加到操作掛鉤。
如果您只想部分更改頁腳的輸出,而不完全覆蓋或取消原始函數,該怎麼辦?這就是過濾器被證明有用的時候。
我們使用 apply_filters()
函數建立新的過濾器掛鉤。它至少接受兩個參數。第一個是過濾器掛鉤的名稱,我們在兩個 apply_filters()
呼叫中將其設為 compass_copyright_filter
和 compass_credit_filter
。第二個參數是我們要過濾或修改的值。我們將其設定為顯示版權和信用資訊的 HTML 程式碼。
然後我們可以將我們自己的函數掛接到這些過濾器上。我們在 add_filter()
函數的幫助下完成此操作。此函數接受兩個參數。第一個參數是過濾鉤子的名稱,第二個參數是要用來過濾值的回呼函數的名稱。
要記住的另一件重要事情是,只有使用 add_filter()
函數附加回呼時,傳遞給 apply_filters()
的值才會被過濾。否則,作為第二個參數傳遞給 apply_filters()
的值將保持不變。
我們使用此功能來更改片尾字幕,但保持頁腳中的版權資訊不變。
現在您已經知道如何在 WordPress 中新增操作了,也許您想擴展您的程式設計技能。 WordPress 應用程式過濾器後,您可以按照我們的教學學習其他技巧:
了解操作掛鉤和過濾掛鉤之間的差異並能夠有效地使用它們將促進您的主題和插件開發。事實上,如果不使用至少一種類型的鉤子,您根本無法編寫插件,因為啟動插件中的程式碼的唯一方法是透過其附加的操作和過濾器鉤子。
本指南向您展示如何使用函數、操作掛鉤和一個或多個過濾器掛鉤添加相同的功能,以及從掛鉤中刪除函數的技術以及有關每種技術何時更有用的建議。
除了將函數掛鉤到您建立的操作和過濾器掛鉤之外,您還可以將它們掛鉤到WordPress 提供的操作和過濾器,例如wp_head
操作或body_class
過濾器。
以上是WordPress 操作與篩選器:了解區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!