web-dev-qa-db-fra.com

Comment utiliser l'argument WP_Error $ data?

L'appel

$error = new WP_Error( $code, $message, $data );

Le résultat

Supposons que j'ai ajouté trois messages (msg A, msg B, msg C) au code my_code et avec le dernier message, j'ai ajouté "Données" en tant que $data, ce qui a écrasé tous les $data ajoutés aux appels précédents de la classe d'erreur.

WP_Error Object
(
    [errors] => Array
        (
            [my_code] => Array
                (
                    [0] => "msg A"
                    [1] => "msg B"
                    [2] => "msg C"
                )
        )
    [error_data] => Array
        (
            [my_code] => "Data"
        )
)

Après avoir inspecté et joué avec la classe d'erreur wp, je suis arrivé aux questions suivantes:

Problème

Je peux transmettre un nombre illimité de $codes à la classe, puis un nombre illimité de $messages à chaque code. Le point est que je ne peux pas passer plus d'un $data par $code.

Q: Quel est le cas d'utilisation prévu de $data?1)


1) Actuellement, j'essaie de construire une API de wrapper WP_Error assez simple (essentiellement un ensemble de fonctions faciles à utiliser). Le but est d’en faire un ticket de trace et de le déplacer vers WP core.


Modifier # 1

J'ai trouvé un comportement assez étrange dans /wp-includes/functions.php avec la fonction wp_die();: Si vous fournissez un objet d'erreur, la fonction remplit automatiquement le titre fourni par $data['title']. En regardant cela, je pensais que $data pourrait être un tableau associatif pouvant contenir n’importe quelle quantité de données dynamiques supplémentaires.

Q: Mais - et ceci n’est valable que si tel est le cas d’utilisation prévu - si $data est a) un tableau et b) j’ai ajouté avec succès des données supplémentaires: Comment pourrais-je le connecter aux messages correspondants? ?

Q: Plus loin: Pourquoi wp_die(); n'abandonne-t-il pas si je n'ai pas d'erreur? Cela rend son utilisation aussi dynamique - au cas où - la sortie d'erreur ajoutée est complètement invalide.


Modifier # 2

Vous pouvez trouver le ticket pour réparer le gestionnaire wp_die()ici .


Edit # 3

Vous trouverez un brouillon d’une première "API d’erreurs de thème" ici sur github . Forking, etc. et commenter est très apprécié.

5
kaiser

$this->error_data[$code] ... l'objet WP_Error contient $ data dans un tableau et $ code est la clé. La méthode add_data indique clairement:

Le code d'erreur ne peut contenir qu'une seule donnée d'erreur. Mais le $data (mélangé) peut être un tableau ou un objet et contenir autant de clés/propriétés que nécessaire. C'est à vos gestionnaires de décider comment ils l'interprètent.

Error $data est un bonus pour un traitement personnalisé ultérieur de l'erreur. Votre propre fonction spéciale peut générer un WP_Error et vous pouvez ajouter des données personnalisées dans le $data qui peuvent être interprétées par votre propre gestionnaire d'erreur.

wp_die(); est identique à die;, mais il affiche une sortie formatée avant de le faire. Il est prévu de mourir. die; dans PHP n'est pas conditionnel. Il est censé s'arrêter là et wp_die(); est conçu pour imiter la fonctionnalité avec des capacités de sortie avancées avant la mort.

Le 'title' dans le support $data est juste un bonus permettant un support de titre intégré pour la WP_Error(). Il est conçu de manière à ce qu'ils n'aient pas besoin de choisir quel message de error_code est le titre si plusieurs sont présents. Ils utilisent simplement l'attribut title par défaut. NE JAMAIS COMPTER SUR CETTE FONCTIONNALITÉ PAR DÉFAUT! Utilisez toujours votre propre titre dans wp_die().

Aucune erreur ici, juste le comportement souhaité ... si j'ai bien compris votre question.

3
EarnestoDev
/**
 * Creates a static global shared WP_Error object.
 * The object is contained safely inside function body as static variable.
 * It's also protected from external influence.
 * 
 * @return WP_Error
 */
function theme_errors(){
    static $wp_error; // Will hold global variable safely
    return isset($wp_error) ? $wp_error : ($wp_error = new WP_Error(null, null, null));
}
// This is how you add errors (first call initializes the object).
theme_errors()->add($code = 'code', $message = 'message', $data = 'some data');
theme_errors()->add($code = 'code', $message = 'message', $data = 'some data');
// And then do some display stuff on shutdown
add_action('shutdown', function(){
    // If conditions are met and errors exist:
    if(!theme_errors()->get_error_codes()) return;
    // Loop error codes and display errors
    foreach(($codes = theme_errors()->get_error_codes()) as $code){
        $message = theme_errors()->get_error_message($code);
        $data = theme_errors()->get_error_data($code);
        // Display stuff here
    }
});

Alternative beaucoup plus facile. Nom du thème indépendant (nous travaillons uniquement avec le thème actif) . Variable globale protégée dans la fonction.

2
EarnestoDev