問題描述

過濾器和掛鈎如何在 WordPress 中實際工作?

我在問一些先進的事情。如何在 PHP 中實現?例如,它如何從不同的插件和”attach” 中收集所有鈎子到核心鈎子等。

最佳解決方案

Overview

基本上 「過濾器和鈎子」 的 「Plugin API」 由以下功能組成:

  1. apply_filters() – 執行

  2. do_action – 執行

  3. apply_filters_ref_array() – 執行

  4. do_action_ref_array() – 執行

  5. add_filter() – 添加到堆棧

  6. add_action() – 添加到堆棧

基本內部

總的來説,有幾個全局變量 (WordPress 世界還有什麼):

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

第一個 $wp_filter 是一個全局 Array,它將所有過濾器名稱作為子數組。然後,這些子陣列中的每個子陣列將保存更多的子陣列,這些子陣列是在優先級數組下召集的回調。

簡介 in-depth

所以當一個執行函數被調用時,WordPress 搜索這些全局變量數組的密鑰與該名稱。然後附加的回調優先執行優先級。發生的唯一事情是附加到 all 過濾器的回調。

當您使用 add_actionadd_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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。