問題描述

當我希望我的過濾器或動作鈎子覆蓋所有其他的,我將它分配給 999 的優先級。不過最近我看到有些人使用極限值來優先考慮,比如 20000,甚至是 99999

除了使用優先級這個高可笑的事實,他們實際上可以工作嗎?掛鈎優先級有限嗎?超過限制會發生什麼?使用極端優先級時是否存在性能差異?

更新:@harke 建議 on Stack Overflow 數量受 PHP_MAX_INT 限制

最佳解決方案

沒有限制,沒有性能處罰。要理解為什麼,您需要了解所有鈎子是如何存儲在 WP 生態系統中的。

首先,您需要了解所有鈎子的存儲位置以及它們的操作方式。過濾器和動作的所有鈎子都存儲在名為 wp_filter 的全局變量中,是的,動作鈎子也存儲在此變量中。這個變量是關聯的數組,其中 key 是動作或過濾器的名稱,value 是另一個關聯數組。比如我們來看看’init’ 的動作,在這個階段我們將看到如下結構:

$wp_filter = array(
    'init' => array(...),
);

此子數組具有數字鍵和值作為數組。數字鍵是我們的優先事項。與數字鍵相關聯的數組包含具有相同優先級的掛鈎列表。所以如果我們調用 add_action( 'init', 'wpse8170_my_first_init', 20 ),然後調用 add_action( 'init', 'wpse8170_my_second_init', 20 ),最後調用 add_action( 'init', 'wpse8170_my_third_init', 10 ),我們的例子如下所示:

$wp_filter = array(
    'init' => array(
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
    ),
);

現在當 init 動作被觸發時,所有的鈎子都將使用 ksort 函數進行排序,我們的數組現在看起來如此:

    array(
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
    ),

並且所有鈎子將在此隊列中執行:首先是'wpse8170_my_third_init',然後是'wpse8170_my_first_init',最後是'wpse8170_my_second_init'

所以你可以看到沒有限制和懲罰,你可以使用任何可接受的值作為 PHP 環境的關聯陣列的關鍵。

次佳解決方案

這是一個整數,所以在一個 32 位的 PHP 系統上,它將被限制在-2147483648 到 2147483647,64 位的 PHP 將被限制在-9223372036854775808 到 9223372036854775807 。

編輯:沒有性能損失,它是一個整數。

但是…… 認真的:)

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。