web-dev-qa-db-fra.com

Comment afficher un avis d'erreur d'administrateur si les paramètres ont été enregistrés avec succès?

Titre semble contre-intuitif mais supporte-moi. :)

J'ai une page d'options, réalisée avec les paramètres de l'API. Lorsque l'utilisateur entre des données non valides, je souhaite afficher un avis d'erreur avec l'appel add_settings_error().

Mais! Pour déterminer que les données sont invalides, je dois passer un appel d'API à distance. Cet appel repose sur des données enregistrées. Donc, je ne peux pas faire cela dans le rappel de désinfection (il est recommandé de placer de telles notifications) car mes données ne sont pas encore enregistrées.

Au lieu de cela, j’ai essayé d’enfiler mon chèque dans admin_notices Cela fonctionne bien la plupart du temps, sauf un (et le plus important) cas - lorsque les paramètres sont enregistrés, ils sont toujours suivis de native Paramètres enregistrés. notice et mes notices personnalisées sont complètement ignorées pour une raison quelconque.

Alors, comment puis-je envoyer cette notification d'erreur même si WP pense que tout va bien?

Modifier

Question plus ciblée - pourquoi exactement Paramètres enregistrés. l'emporte sur les autres avis?

PS je pourrais essayer de faire appel API éventuellement prendre des données en argument au lieu de le lire à partir de l'option enregistrée, mais jusqu'à présent, je pense qu'il va faire des arguments trop volumineux.

7
Rarst

Ok, je pense avoir une idée de ce qui se passe.

  1. La liste des avis à afficher est récupérée par get_settings_errors() ( source ).

  2. Cette fonction lit les avis à partir de $wp_settings_errors global à moins que il y ait settings_errors ensemble transitoire qui dépasse la variable globale Var.

  3. Lorsque les paramètres sont enregistrés, aucune erreur de configuration n’est vérifiée. Paramètres enregistrés. Avis est généré. Après cela (dans les deux cas), les erreurs sont enregistrées dans le settings_errors transitoire (je suppose de les conserver lors de la redirection) ( source ).

En gros, quels que soient les avis que vous générez dans votre code, ils seront ignorés lorsque le paramètre transitoire est défini et il le sera toujours après l'enregistrement des paramètres.

Pour moi, il serait logique de concaténer transitoire avec variable globale plutôt que de le rendre exclusif ou choix.

Et je suppose que pour afficher des notifications personnalisées lorsque le paramètre transitoire est défini, je devrai le manipuler, ce qui ne vaut probablement pas la peine.

4
Rarst

Une chose que vous pourriez faire, je suppose:

  • dans votre rappel de validation, lisez les paramètres actuels (vous pouvez le faire quand même?) et stockez-les dans une variable
  • vérifie d'abord toutes les autres valeurs
  • si elles ne sont pas valides, renvoyez les erreurs, ne cochez pas la valeur critique
  • s'ils le sont, stockez-les dans la base de données (au sein de votre fonction de validation)
  • faites votre appel API distant
  • valider la valeur délicate
  • si valide, retourne le paquet entier et tout bon
  • si ce n'est pas le cas, enregistrez les anciens paramètres que vous aviez au début dans la base de données, effectuez votre sortie d'erreur via add_settings_error() Bien sûr, cela défait/abuse quelque peu l'API des paramètres, mais cela pourrait être un moyen.

Modifier: le message Paramètres enregistrés ne l'emporte pas sur vos autres avis, il apparaît uniquement car vos autres avis ont déjà été effacés (pour une raison quelconque) du magasin interne settings_error. Pourquoi je ne le sais pas, mais le message Paramètres enregistrés est simplement ajouté au magasin d’erreurs si et seulement s’il est vide. Ce qui pourrait contribuer à votre dilemme est que chaque fois que le magasin d’erreurs de paramètres est lu (via get_settings_errors()), il est également effacé.

0
wyrfel