WordPressのエラー処理 WP_Error クラスの使い方

今回の記事では、WordPressのエラー処理について。

WordPressには、WP_Errorっていうエラー処理のための便利なクラスがあります。

これ実は僕もあんまり使わなかったんですけど、超便利なのでちょっと紹介します。

スクリーンショット_2013_03_07_13_01

 

普通のエラー処理

たとえば、以下のようなコード、よく見ますよね。

if (err_check()) {
  echo "ぶぶーっ、エラーです!";
}

function err_check(){

    // 何らかの処理

    if ($foo) {
        return true;
    } else {
        return false
    }
}

これはこれでありなんですが、いろいろと修正を重ねていくうちに、エラーの内容によって細かく処理を分けたいなんて事もでてきます。

そうすると、上の方法では、エラーの時の戻り値が false の1種類しかないので、いろいろと修羅場になってくるわけです。

WP_Error クラスを使ったエラー処理

WP_Error クラスを使用するとコンストラクタに、エラーコードやメッセージを渡すことができるので、その内容によってさらに細かく動作を分岐させることが可能です。

$result = err_check();

if (is_wp_error($result)) {
  echo $result-> get_error_code(); // WP_Error() の第一引数
  echo $result-> get_error_message(); // WP_Error() の第二引数
}

function err_check(){

    // 何らかの処理

    if ($foo) {
        return true;
    } else {
        return new WP_Error('error_code', 'ぶぶーっ、エラーです。');
    }
}

あとは、関数の値を受け取った際に、is_wp_error() でその値を評価して、true であればエラーとして判定するって感じです。

ちなみに、この戻り値を単純に if($err) { とかで評価しちゃうとヒドイめにあいますので、if (is_wp_eror($err)) { で評価するように注意しましょう。(つうかOKの時は true を返さない仕様にした方がいいかもねw)

エラーメッセージは複数のメッセージをあとから追加していくことも可能なので、たとえばフォームの入力チェックで以下のようなやりかたをすると便利かも。

$err = new WP_Error('Error', '入力間違ってない?');

if (...) {
    $err->add('Error', '住所おかしくね?');
}

if (...) {
    $err->add('Warn', '電話番号おかしくね?');
}

var_dump($err->get_error_messages());

第一引数にはエラーコードを、第二引数にはメッセージを格納します。

以上の出力はこんなかんじです。

array(3) {
  [0]=>
  string(27) "入力間違ってない?"
  [1]=>
  string(24) "住所おかしくね?"
  [2]=>
  string(30) "電話番号おかしくね?"
}

get_error_messages() の引数を使うと、add() の第一引数の内容に応じたエラーメッセージを取得することが可能です。

先ほどの例では、”Error” 及び “Warn” を指定したので、以下のようにすることで、それぞれのメッセージだけを取り出せます。

// Errorだけを取得する。
var_dump($err->get_error_messages('Error'));

array(3) {
  [0]=>
  string(27) "入力間違ってない?"
  [1]=>
  string(24) "住所おかしくね?"
}

// Warnだけを取得する。
var_dump($err->get_error_messages('Warn'));

array(1) {
  [0]=>
  string(30) "電話番号おかしくね?"
}

こういうエラー処理については、知らなくてもそれなりに作れちゃうんですが、知ってると便利なのでおすすめですよ。

詳しくは、Codexでどうぞ。

http://codex.wordpress.org/Class_Reference/WP_Error

3/12 追記

フォームの入力チェックで、上で書いた例だと実際には扱いにくいなーと思ってて、wp-login.phpをみたら以下の様な処理をしてました。

$e = new WP_Error(); // 空でエラーオブジェクトを定義

if (...) {
    $e->add('Error', '住所おかしくね?');
}

if ($e->get_error_code()) { // is_wp_error() ではなく、エラーコードの有無で判別
    return $e; // エラー
} else {
    return 'OK';
}

WP_Error() の引数なしでエラーオブジェクトを作って、エラーコードの有無 get_error_code() で判別するのか。なるほど。