問題描述
過濾器和掛鉤如何在 WordPress 中實際工作?
我在問一些先進的事情。如何在 PHP 中實現?例如,它如何從不同的外掛和”attach” 中收集所有鉤子到核心鉤子等。
最佳解決方案
Overview
基本上 「過濾器和鉤子」 的 「Plugin API」 由以下功能組成:
-
apply_filters()– 執行 -
do_action– 執行 -
apply_filters_ref_array()– 執行 -
do_action_ref_array()– 執行 -
add_filter()– 新增到堆疊 -
add_action()– 新增到堆疊
基本內部
總的來說,有幾個全域性變數 (WordPress 世界還有什麼):
global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;
第一個 $wp_filter 是一個全域性 Array,它將所有過濾器名稱作為子陣列。然後,這些子陣列中的每個子陣列將儲存更多的子陣列,這些子陣列是在優先順序陣列下召集的回撥。
簡介 in-depth
所以當一個執行函式被呼叫時,WordPress 搜尋這些全域性變數陣列的金鑰與該名稱。然後附加的回撥優先執行優先順序。發生的唯一事情是附加到 all 過濾器的回撥。
當您使用 add_action 或 add_filter 新增回撥時,WordPress 首先計算”unique” ID 以不覆蓋已附加的回撥。
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
然後它將您的回撥新增到 global $wp_filter 堆疊:
$wp_filter[ $tag ][ $priority ][ $idx ] = array(
'function' => $function_to_add,
'accepted_args' => $accepted_args
);
正如你可以看到主子陣列是 $tag(或動作/過濾器名稱),那麼所有的東西都以特定的優先順序召集,然後”unique” 回撥/ID 字串被用作關鍵。
之後,當一個過濾器被呼叫時,會發生 $tag /action- /filter-name – 陣列被搜尋並且回撥被呼叫。因為它是使用 call_user_func_array,幾乎沒有附加引數是無關緊要的。 WordPress 本身就解決了這個問題。
foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
call_user_func_array(
$the_['function'],
array_slice(
$args,
0,
(int) $the_['accepted_args']
)
);
}
次佳解決方案
鉤子包含在 WordPress 核心檔案和一些父主題檔案中。它們使您能夠掛接檔案中特定位置的內容。
一個例子是 WordPress 中的 wp_head 鉤子。你可以使用這個鉤子在你的孩子主題中新增該地點的內容’
例:
add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}
一些高階主題還包括 action hooks,您可以在小孩主題中使用它來做同樣的事情。這是一個 visual map,它包括所有的動作鉤子和他們在 Genesis 主題框架中輸出你的內容的位置。
例:
add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}
如果您在 Genesis 主題框架中開啟了 header.php 檔案,那麼這個鉤子就是這樣的:
do_action( 'genesis_header' );
這是一個 list of WordPress hooks,您可以在許多方面使用。
過濾器使您能夠修改現有功能的輸出,幷包含在 WordPress 核心檔案和一些父主題框架 (如 Genesis) 中。
這是一個 list of the filters,您可以使用 Genesis 設計框架
以下是 filters included in WordPress 的列表
以下是一個例子,說明如何在如 Genesis 這樣的主題框架中使用過濾器:
add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}
上面的程式碼可以用在一個小孩主題中來修改作者在你的評論中說文字。它可以在任何主題。
這是另一個例子,它將片段的長度定製為 50 個字:
add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50;
}
您可以在 wp-includes/post-template.php file. 中找到 the_excerpt() 功能
這是它的樣子:
function the_excerpt() {
echo apply_filters('the_excerpt', get_the_excerpt());
}
您還可以使用外掛中的鉤子和過濾器來完成相同的操作,並且當您更新父主題或 WordPress 時,程式碼不會丟失。
基本上,鉤子和過濾器使您能夠自定義和修改 WordPress 和您的父主題,而無需編輯核心 WordPress 檔案或您的父主題檔案。
當父主題框架包含鉤子和過濾器,因為您不需要編輯父主題模板檔案,因此更容易定製子主題。這樣你也可以安全地改變主題。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。