WordPress 的插件架構建立在「鉤子」機制之上,其中過濾器負責資料的修改與轉換。掌握 apply_filters() 與 add_filter() 這兩個核心函數,是開發高品質主題與外掛的關鍵。
apply_filters() 用於在程式碼中建立一個「過濾點」,讓其他程式碼有機會修改特定的值。它是 WordPress 可擴充性的基石。
apply_filters( string $tag, mixed $value, mixed ...$args ): mixed
經過所有掛載函數處理後的最終值;若無函數掛載,則回傳原始 $value。
echo apply_filters( 'custom_text', '預設文字' );
輸出:預設文字
function modify_text() {
return '已修改的文字';
}
add_filter( 'custom_text', 'modify_text' );
echo apply_filters( 'custom_text', '預設文字' );
輸出:已修改的文字
function append_suffix_1( $text ) {
return $text . ' - 第一階段';
}
function append_suffix_2( $text ) {
return $text . ' - 第二階段';
}
add_filter( 'custom_text', 'append_suffix_1' );
add_filter( 'custom_text', 'append_suffix_2' );
echo apply_filters( 'custom_text', '原始值' );
輸出:原始值 - 第一階段 - 第二階段
function format_price( $price, $currency, $decimals ) {
return $currency . number_format( $price, $decimals );
}
add_filter( 'product_price', 'format_price', 10, 3 );
echo apply_filters( 'product_price', 1234.56, 'NT$', 0 );
輸出:NT$1,235
add_filter() 將自訂函數掛載到指定的過濾器上,構成「發布-訂閱」模式。
add_filter( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 ): bool
apply_filters() 的 $tag 完全一致。apply_filters() 傳遞的參數數量對應。永遠返回 true。
add_filter( 'content_filter', 'func_a', 5 ); // 最早執行 add_filter( 'content_filter', 'func_b', 10 ); // 預設優先序 add_filter( 'content_filter', 'func_c', 15 ); // 最後執行
null)。$accepted_args 需大於等於實際接收的參數數,否則會遺漏額外參數。myplugin_)作為過濾器名稱,避免與核心或其他外掛衝突。兩個函數均定義於 wp-includes/plugin.php,建議閱讀原始碼深入理解底層實現(WP_Hook 類別)。
過濾器實現了「資料流向可攔截、可修改」的設計模式。善用 apply_filters() 暴露擴充點,配合 add_filter() 實現業務邏輯解耦,是 WordPress 開發的核心功力。