web-dev-qa-db-fra.com

WP REST Renvoie la valeur à la fonction d'erreur à partir de la requête

Avec l'aide de WP.SE, j'ai appris à envoyer des données d'un formulaire à WP_REST, mais maintenant, je ne parviens pas à renvoyer une erreur personnalisée. Je peux transmettre avec succès des informations au WP_REST_Response et j'ai ajouté un contrôle dans WP_REST_Response et je veux qu'il renvoie le message d'erreur à la fonction d'erreur AJAX, mais j'ai des problèmes.

Par exemple, sur ma boîte locale, l'adresse IP est ::1 et si je crée une fonction en PHP:

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

et après avoir cherché comment retourner le chèque, je suis tombé sur:

alors j'ai ajouté à mon WP_REST_Response:

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

et dans mon vader.js si j'utilise:

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

mais je n'ai aucune erreur dans la console et il affiche {"error":"you are localhost"} mais je veux juste que la valeur aille à la fonction d'erreur.

En regardant la documentation jQuery.ajax () j'ai trouvé statusCode et je peux obtenir:

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

et:

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

Existe-t-il un moyen de faire apparaître error ou ai-je mal compris AJAX error? Qu'est-ce que je fais de travers et comment puis-je obtenir la valeur JSON renvoyée par WP_REST_REQUEST pour accéder à la fonction error?

3

Un appel Ajax peut être envoyé n'importe où. Il peut s'agir d'un serveur exécutant PHP, d'une route locale virtuelle simulée à l'aide de C # ou de toute autre solution. Ainsi, Ajax se fiche de la réponse, car elle ne peut pas la comprendre.

Lorsque vous envoyez toute données à partir de votre serveur, tant que l'état est 200 (ou autre chose qu'une erreur), le script Ajax considère qu'il s'agit d'une demande réussie. Ensuite, à vous de gérer la situation en fonction de votre réponse.

Un exemple simple

Je suis novice en langue anglaise. J'utilise le "erreur"Mot au lieu de "succès" et le retourne en réponse.

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

Le serveur a réussi à exécuter la tâche, mais a envoyé un statut incorrect. Comment Ajax pourrait-il savoir cela?

Ainsi, la section d'erreur d'un appel Ajax est destinée aux cas où il y a un problème lors de la demande, avant la fin, pas après. Après l'envoi de la réponse, Ajax a fait son travail, c'est considéré comme une demande réussie.

Exemple concret

  1. Supposons que vous écriviez une lettre à un ami et que vous lui demandiez de vous rejoindre dans une entreprise. Vous êtes le "utilisateur" ici.
  2. Vous donnez votre lettre au facteur pour la livraison. Le post man est la "Ajax" fonction ici.
  3. Votre ami a écrit un très gros "NON" dans sa réponse (quelle impolitesse), scelle la lettre et la rend au postier. Votre ami est le "serveur" ici.
  4. Le facteur vous remet la lettre. Le postier faisait son travail, peu importe la réponse. Donc, il est considéré comme un "réussi" à son travail. (n'oubliez pas son pourboire)
  5. C'est à vous de choisir de crier, de crier ou de pleurer à cause de la stricte "NON" de votre ami (gestion des erreurs). Ce n'est pas le problème du postier.
2
Jack Johansson

Comme le souligne correctement Jack, la requête ayant abouti, vous ne vous retrouverez jamais dans le rappel error. Vous préférez traiter tout ce que votre serveur a renvoyé dans le callback success de jQuery.ajax():

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

Si vous n'utilisez pas ES6:

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