先加add_filter()添加過濾器,還是先加applay_filters()應用過濾器
過濾器(Filters)對於WordPress來說是非常重要的,它極大地擴展了WordPress的定製能力,提高了WordPress的靈活性。無論是製作主題還是開發插件,我們基本上都會或多或少地使用到過濾器,以實現我們的一些特殊需求。
其實,WordPress過濾器的使用非常簡單,我們經常用到的也就兩個函數而已,它們就是apply_filters和add_filter。本文將對WordPress過濾器進行詳細解讀與分析。
什麼是過濾器?
過濾器就是註冊到過濾器鉤子(Filter Hook)的函數,過濾器鉤子都有一個名字,在WordPress中,一般使用變量$tag來標識這個名字。所有掛接到過濾器鉤子上的函數都是過濾器。
過濾器鉤子和動作鉤子一樣,基本的函數有兩個,動作鉤子有do_action函數,它就有apply_filters函數,該函數是用於執行相應的過濾器函數,不同的是動作鉤子僅僅是執行函數(或者稱為動作,更為貼切),而過濾器鉤子它要做的是通過執行過濾器函數來改變對象或變量的值,就相當於對變量或者對象進行過濾,然後再返回。
過濾器鉤子相關函數:
簡單地說,動作鉤子要的是過程(僅僅執行代碼塊)而不是結果(輸出值/返回值),過濾器鉤子要的是結果而不是過程。
一般情況下 add_filters() 有兩種方式觸發,一種是當程序運行到特定時候 WordPress 程序會判斷用戶是否對某些參數做了新的定義,如果有則優先使用用戶的設置;另一種方式是,用戶可以直接通過 apply_filters() 函數直接調用。代碼示例如下:
一般在模版文件或標籤函數中(需要輸出值),用的是apply_filters()。
apply_filters()函數
鏈接:https://developer.wordpress.org/reference/functions/apply_filters/
apply_filters( string $tag, mixed $value ) 參數: $tag:(字符串)(必需)過濾器鉤子的名字。 $value:(混合)(必需)要過濾的值,如果沒人過濾則直接返回這個值。 $var:(混合) (必需)傳給過濾函數額外的變量參數,輔助過濾函數對返回值進行操作,可以添加無限個。 返回值: (混合)過濾後的值,如果沒人過濾則直接返回 $value 的值。 |
舉例:
// 預定義的過濾器回調函數
function example_callback( $string, $arg1, $arg2 ) {
// (maybe) modify $string
return $string;
}
add_filter( 'example_filter', 'example_callback', 10, 3 );
// 通過 apply_filters() 傳參調用定義好的過濾器回調函數
$value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );
add_filter() 函數
鏈接:https://developer.wordpress.org/reference/functions/add_filter/
add_filter( $tag, $function_to_add, $priority, $accepted_args ); 參數 $tag:(字符串)(必需)所掛載的過濾器名字(和目標 apply_filters() 函數的 $tag 屬性一樣)。 $function_to_add:(回調)(必需)要掛載的回調函數,參考 PHP 回調函數類型文檔。 $priority:(整數)(可選)執行順序,越小函數越先被執行。默認值:10 $accepted_args:(整數)(可選)回調函數接收的參數數量,設置多個可以接收更多 apply_filters() 函數傳進來的參數。默認值:1 返回值 (布爾)總是 True |
由最後一個參數我們可以了解到 add_filter() 鉤子的回調函數 $function_to_add 可以接受零到多個參數,這取決於 add_filter() 最後一個參數的設置。
舉例:
function example_callback( $example ) {
// 對 $example 的一系列處理過程
return $example;
}
add_filter( 'example_filter', 'example_callback' );
回調函數
要注意的是,我們在前面說過,過濾器(過濾器函數)的任務是要改變對象或變量的值,所以通過add_filter函數添加的過濾器必須要有個返回值,也就是函數$function_to_add必需有返回值。
舉例:
1、沒有創建過濾器(預埋過濾器鉤子)
echo '這是一個值,不能被修改' ;
2、添加過濾器鉤子,返回的可以修改,但是如果沒有天劍過濾器,值不變
echo apply_filters( 'test', '這是一個值,能被修改' );
3、通過添加過濾器,修改值,顯示“修改過的值”
function test_function(){
return '修改過的值';
}
add_filter( 'test', 'test_function' );
接受參數的用法:
1、預埋過濾器鉤子:
function test_func( $text, $var, $var2 ){
return '修改值' . $var1 . $var2;
}
add_action( 'test', 'test_func', 10, 3 );
echo apply_filters( 'test', '可以被修改的值', '輔助值1', '輔助值2' );
例子
function test_func( $text, $var1, $var2 ){
return $text . $var1 . $var2;
}
add_filter( 'test', 'test_func', 10, 3 );
echo apply_filters( 'test', '參數2', '參數3', '參數4' );
打印:
test參數2參數3
apply_filters()函數:
add_filter() 函數:
舉例;
function example_callback( $example ) {
// Maybe modify $example in some way.
return $example;
}
add_filter( 'example_filter', 'example_callback' );
這種情況下,代碼執行到某一步遇到某個觸發點,就會有執行函數 example_callback,而 apply_filters 則是主動執行。
apply_filters( 'example_filter', $value );
在頁面的某處加入這個函數,則會連到 add_filter( 'example_filter', 'example_callback' );主動執行 example_callback
這個就好像點外賣,比如我要點一碗面,外賣軟件在你下單前給你很多選項,要不要蔥,要不要蒜,要不要辣椒要不要香菜什麼的,你一個個的調好,下單後老闆開始煮麵,面煮好了,要放調料,就拿出你選的選項,對照着給,要蔥,不要蒜,香菜沒寫,那就給,辣椒也沒寫,默認不給。
用戶下單做選項時就是 add_filter
老闆煮好了面對着選項給調料就是 apply_filter
還有就是第二個問題那裡,只見到 apply_filters 沒見到 add_filter,這個就有點難理解了,不知道是我找的方向不對還是怎麼樣,反正是沒找到對應的 add_filter
add_filter 是主題開發者自己加的