WordPress 使用 Namespace Warning call_user_func_array() expects parameter 1 to be a valid callback

在開發 WordPress Plugin 常用字串來代表 functions ,最常用的莫過於add_action() &add_filter()

add_action('init','function_name');
add_action('init',[$this,'function_name']);

add_filter('init','function_name');
add_filter('init',[$this,'function_name']);

實際上在 WordPress API 中是用 php call_user_func() 來執行傳入的 function,但到了執行階段並沒有辦法直接調用在 Namespace 中的 function , 否則 Namespace 就沒意義了。

所以在 Namespace 文件中用上述的方法呼叫

Namespace V123\DEV;

function test() {
    echo "Hello world!\n";
}

add_action('init','test');

會得到下列錯誤訊息,主要是找不到傳入的 function

Warning call_user_func_array() expects parameter 1 to be a valid callback …

正確的傳入的 function 名稱前方需包含Namespace名稱,如下,這樣執行階段就可正確調用到這個方法。

Namespace V123\DEV;

function test() {
    echo "Hello world!\n";
}

add_action('init','V123\DEV\test');

有時一個 Plugin 中會傳入很多個,包含 Namespace 名的 function 名稱在我們的程式碼中,但如果我們要修改Namespace名稱就需要一個一個改非常痛苦,這時我們可透過 __NAMESPACE__  讓城市變得更聰明

使用 __NAMESPACE__  取得當前文件的 Namespace

呼叫 Namespace 裡的 function

/**
* https://v123.tw
*/
Namespace V123\DEV;

function test() {
    echo "Hello world!\n";
}

call_user_func(__NAMESPACE__ .'\test');

呼叫 Namespace 裡的 class 中的 function

/**
* https://v123.tw
*/
Namespace V123\DEV;

class Hello {
    static public function test() {
        echo "Hello world!\n";
    }
}

add_action('init',__NAMESPACE__ .'\Hello::test'); // String
add_action('init',array(__NAMESPACE__ .'\Hello', 'test')); // Array

參考資料:

https://vector.cool/php-namespace-%E9%8C%AF%E8%AA%A4-warning-call_user_func_array-expects-parameter-1-to-be-a-valid-callback/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料