在 WordPress 的執行中難免會產生一些錯誤,我們不希望錯誤直接阻止了使用者對網站的順暢訪問。

這裡指的錯誤並不是 PHP 程式碼錯誤。而是在處理一些資料的時候產生的,尤其是處理表單資料,因為不可能所有使用者都會完全按照我們的要求提交資料。

比如,在註冊使用者的時候需要使用者填寫電子郵件。使用者可能會輸入不符合電子郵件格式的內容,或者這個電子郵件已經有使用者使用,那麼就會產生一個錯誤,導致使用者無法順利註冊。

由於錯誤多種多樣,WordPress 使用了一個 WP_Error 類來統一錯誤的儲存方式,有了統一的方式,外掛和主題就能更好的讀取和新增一些錯誤,也能簡化錯誤的儲存程式碼。

屬性

$errors

用於儲存所有的錯誤。

$error_data

儲存錯誤的額外資料。

這些屬性均為類私有 (private) 。

方法

get_error_codes()

獲取所有錯誤程式碼。

get_error_code()

獲取第一個可用的錯誤程式碼,如果沒有則返回空。

get_error_messages( $code = '' )

獲取一個錯誤的所有錯誤訊息。

get_error_message( $code = '' )

獲取一個錯誤的第一個錯誤訊息。

get_error_data( $code = '' )

獲取錯誤的額外資料,沒有額外資料返回 null.

add( $code, $message, $data = '' )

新增一個錯誤資訊。

add_data( $data, $code = '' )

新增錯誤的額外資料。

WP_Error( $code = '', $message = '', $data = '' ), __construct( $code = '', $message = '', $data = '' )

WP_Error 的建構函式,例項化類的時候自動執行,所有的引數都是可選的。可以直接在例項化類的時候新增一個錯誤。

使用方法

比如下邊這個郵件傳送函式,如果發生錯誤,就會把錯誤返回出去。任何錯誤都沒產生,而且郵件傳送順利則返回 True.

functionBing_send_mail($email){

    if(empty($email))returnnewWP_Error('empty_email','郵箱不能為空');

    if(!is_email($email))returnnewWP_Error('invalid_email','郵箱格式不正確');

    if(wp_mail($email,'測試郵件','Hello World'))returntrue;

    returnnewWP_Error('send_error','郵件傳送失敗');

}

下方是一個登入檔單的處理函式,裡邊多次使用了 WP_Error:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

functionBing_register_user(){

    $sanitized_user_login=sanitize_user($_POST['username']);

    $user_email=apply_filters('user_registration_email',$_POST['email']);

    $register_errors=newWP_Error;

    //驗證使用者名稱

    if(empty($sanitized_user_login))$register_errors->add('empty_username',__('使用者名稱不能為空','Bing'));

    elseif(!validate_username($sanitized_user_login))$register_errors->add('invalid_username',__('使用者名稱包含無效字元','Bing'));

    elseif(username_exists($sanitized_user_login))$register_errors->add('username_exists',__('使用者名稱已經存在','Bing'));

    //驗證郵箱

    if(empty($user_email))$register_errors->add('empty_email',__('郵箱不能為空','Bing'));

    elseif(!is_email($user_email))$register_errors->add('invalid_email',__('郵箱格式不正確','Bing'));

    elseif(email_exists($user_email))$register_errors->add('email_exists',__('郵箱已經存在','Bing'));

    //登入檔單提交事件

    do_action('register_post',$sanitized_user_login,$user_email,$register_errors);

    //錯誤過濾器

    $register_errors=apply_filters('registration_errors',$register_errors,$sanitized_user_login,$user_email);

    //註冊使用者

    if(!$register_errors->get_error_message()){

        $register_new_user=register_new_user($sanitized_user_login,$user_email);

        if(is_wp_error($register_new_user))return$register_new_user;

        returntrue;

    }

    return$register_errors;

}

判斷 WP_Error

在很多時候我們要判斷函式返回的到底是 WP_Error 還是其它內容,因為 WP_Error 是一個類,所以無法透過 True 或 False 直接判斷。

WordPress 提供了一個 is_wp_error() 函式,用它我們就能判斷變數是否是 WP_Error:

$register=Bing_register_user();

if(is_wp_error($register))wp_die('註冊失敗:'.$register->get_error_message());

其它

此類位於:wp-includes/class-wp-error.php