web-dev-qa-db-ja.com

WP REST リクエストからエラー関数への戻り値

WP.SEの助けを借りて、フォームからWP_RESTにデータを送信する方法を学びましたが、現在はカスタムエラーを返すことに問題があります。 WP_REST_Responseに正常に情報を渡すことができ、WP_REST_Responseにチェックを追加してエラーメッセージをAJAXエラー関数に返すようにしたいのですが、問題があります。

たとえば、私のローカルボックスでは、IPは::1で、PHPで関数を作成したとします。

function ipAddress() {
    if (isset($_SERVER['REMOTE_ADDR'])) :
        $ip_address = clean($_SERVER['REMOTE_ADDR']);
    else :
        $ip_address = "undefined";
    endif;
    return $ip_address;
}

私が遭遇した小切手を返却する方法を調べた後:

だから私は私のWP_REST_Responseに追加しました:

function vader(\WP_REST_Request $request) {
    if (ipAddress() == "::1") :
        return json_encode(array(
            'error' => 'you are localhost'
            ));
    endif;
}

私のvader.jsでは、

error: function(data) {
    throw data.error;
 },

しかし、私はコンソールにエラーがなく、{"error":"you are localhost"}と表示していますが、その値をエラー関数に渡したいだけです。

jQuery.ajax()のドキュメントを見る 私はstatusCodeを見つけました。

if (ek_ip_address() == "::1") :
    return new WP_Error('foo', 'bar', array('status' => 404));
endif;

そして:

statusCode: {
    404: function() {
        $('#testForm').append("thrown 404s");
    }
}

表示するerrorを取得する方法はありますか、それとも私は誤解していますかAJAX error何が間違っているのですか。また、error関数に渡すためにWP_REST_REQUESTからJSON値が返されるようにするにはどうすればよいですか。

Ajax呼び出しはどこにでも送信できます。これは、PHPを実行しているサーバー、C#を使用してシミュレートされた仮想ローカルルート、またはその他のものにすることができます。それで、Ajaxはそれが理解できないので、応答が何であるかを気にしません。

サーバーから any dataを送り返しているとき、ステータスが200(またはエラー以外のもの)である限り、Ajaxスクリプトはこれを successful requestと見なします。その後、あなたの反応に基づいて状況に対処するのはあなた次第です。

簡単な例

私は英語の初心者です。 "success" の代わりに "error" Wordを使用し、それをレスポンスとして返します。

$data['status'] = 'error';
$data['message'] = 'Nice! Request has been done.';
return $data;

サーバーはタスクを正常に実行しましたが、誤った状況を送信しました。 Ajaxはどのようにそれを知っていますか?

そのため、Ajax呼び出しのエラーセクションは、要求の作成に問題があるときで、終了後ではなく終了後です。応答が送信された後、Ajaxはその仕事をしました、それは成功した要求と見なされます。

実生活の例

  1. あなたが友人に手紙を書いて、そして彼がビジネスにあなたに加わるように頼むとしましょう。あなたは "user" です。
  2. 配達のために郵便配達員にあなたの手紙を渡します。ポストマンはここでは "Ajax" 関数です。
  3. あなたの友人は非常に大きい "NO" を彼の返答に書いて(失礼)、手紙を封印して郵便配達員に渡します。あなたの友達は "server" です。
  4. 郵便配達員が手紙をあなたに送り返します。その返事がどうであろうと、郵便配達人は仕事をしました。それで彼は彼の仕事で "successful" と考えられています。 (彼の助言を忘れないでください)
  5. あなたの友人の厳格な "NO" (エラー処理)のために、叫ぶ、叫ぶ、または泣くかどうかを選ぶのはあなた次第です。郵便配達員の問題ではありません。
2
Jack Johansson

Jackが正しく指摘しているように、リクエストが成功したので、あなたはerrorコールバックで終わることは決してないでしょう。あなたのサーバがjQuery.ajax()successコールバックの中で返したものは何でも処理する必要があるでしょう:

success: (data) => {
    if('error' in data) {
        // server returned `error` property in payload - something is wrong!
    }
}

ES6を使用していない場合

success:function(data) {
    if(data && typeof data.error !== 'undefined') {
        // show error message to user
    }
}
2
montrealist