web-dev-qa-db-fra.com

Avis de l'administrateur ne pas afficher

Je suis un nouveau venu dans le développement de WordPress et j'essaie d'afficher une notification de l'administrateur si l'utilisateur omet les champs nécessaires lors de l'enregistrement d'un message personnalisé. Comme ils ne s'affichaient pas, j'ai réalisé qu'il y avait une redirection en cours. J'ai donc déplacé le code dans ma méthode init(), où l'idée était de vérifier si une entrée masquée est définie (indiquant une sauvegarde), puis de vérifier si elle devait être affichée. Après un certain débogage, je me suis trouvé dans une situation vraiment déroutante. Si je mets simplement dans la ligne

add_action('admin_notices', 'image_error');

la notification de l'administrateur s'affiche comme prévu, à chaque fois. Si je le mets dans une simple déclaration if:

if (true) {
  add_action('admin_notices', 'image_error');
}

fonctionne également comme prévu. Cependant, si j'essaie de suivre un bloc de code, la notification de l'administrateur ne s'affiche pas:

$flag_worked = isset($_POST['post_saved']);
if ($flag_worked) {
    $dumb = 1;
    add_action('admin_notices', 'image_error');
}

Le débogage confirme que $flag_worked est bien vrai, que le bloc de code est entré, que $dumb est défini sur un et que la ligne add_action est exécutée. Pourtant, la notification ne s'affiche pas, alors que cette instruction doit essentiellement évaluer la même chose que l'expérience if (true). Il est clair que je comprends mal quelque chose de fondamental. Quelqu'un peut-il expliquer mon erreur et comment y remédier? Pourquoi la notification ne s'affiche-t-elle pas lorsque la ligne pour l'ajouter est touchée? J'ai l'impression de prendre des pilules folles.

1
swilkeni

La fonction add_action ajoute uniquement l'action à une file d'attente, qui sera exécutée à l'appel du do_action correspondant. Donc, quand vous faites la queue trop tard, rien ne se passera.

Pour savoir exactement ce qui se passe dans votre cas, vous devez examiner attentivement l’ordre d’exécution du hook. Cela nécessite un aperçu de votre configuration complète, y compris des plugins, etc.

À mon avis, au moment où isset($_POST['post_saved']) est vrai do_action ('admin_notices') est déjà exécuté et il est inutile de mettre quelque chose en file d'attente.

La solution à ce problème consiste à ne pas ajouter l'action conditionnellement. Ajoutez toujours l'action et placez le test dans la fonction. Comme ça:

add_action('admin_notices', 'image_error');
function image_error () {
  $flag_worked = isset($_POST['post_saved']);
  if ($flag_worked) {
    echo 'error';
    }
2
cjbj