Wie wird der Admin-Fehler angezeigt, wenn die Einstellungen erfolgreich gespeichert wurden?

Titel klingt kontraintuitiv, aber ertragen Sie mit mir. 🙂

Ich habe eine Optionsseite, die mit der Einstellungs-API erstellt wurde. Wenn der Benutzer ungültige Daten eingibt, möchte ich eine Fehlermeldung mit dem Aufruf von add_settings_error() anzeigen.

Aber! Um festzustellen, dass Daten ungültig sind, muss ich einen Remote-API-Aufruf durchführen. Dieser Anruf beruht auf gespeicherten Daten. Daher kann ich dies nicht im Sanitizierungs-Callback (das ist der empfohlene Ort für solche Benachrichtigungen) tun, da meine Daten noch nicht gespeichert sind.

Stattdessen hatte ich versucht, meinen Scheck in admin_notices . Es funktioniert die meiste Zeit gut außer einem (und am wichtigsten) Fall – wenn Einstellungen gespeichert werden, werden ihnen immer native gespeicherte Einstellungen folgen . Hinweis und meine benutzerdefinierten Hinweise werden aus irgendeinem Grund vollständig ignoriert .

Also, wie kann ich diese Fehlermeldung casting, selbst wenn WP denkt, dass alles in Ordnung ist?

Bearbeiten

Konzentriertere Frage – warum genau Einstellungen gespeichert wurden. übertrumpft andere Hinweise?

PS: Ich könnte versuchen, den API-Aufruf optional dazu zu bringen, Daten als Argument zu nehmen, anstatt sie aus der gespeicherten Option zu lesen, aber bisher denke ich, dass sie Argumente übermäßig sperrig machen wird.

Solutions Collecting From Web of "Wie wird der Admin-Fehler angezeigt, wenn die Einstellungen erfolgreich gespeichert wurden?"

Ok, ich denke, ich habe eine Idee was los ist.

  1. Die Liste der anzuzeigenden Hinweise wird von get_settings_errors() ( source ) abgerufen.

  2. Diese function liest Nachrichten aus globalen $wp_settings_errors sei denn, es gibt transient settings_errors , das globale var übertrumpft.

  3. Wenn Einstellungen gespeichert werden, wird geprüft, ob keine Einstellungserrors aufgetreten sind, und wenn dies der Fall ist, werden die Einstellungen gespeichert. Nachricht wird generiert. Danach (in jedem Fall) werden Fehler in settings_errors transient gespeichert (ich nehme an, sie bei Weiterleitung zu erhalten) ( source ).

Grundsätzlich, egal, welche Hinweise Sie in Ihrem Code generieren – sie werden ignoriert, wenn Transienten eingestellt sind und immer nach dem Speichern der Einstellungen gesetzt werden.

Für mich wäre es sinnvoll, Transiente mit globalen Variablen zu verketten, anstatt sie exklusiv oder wahllos zu machen.

Und ich denke, um benutzerdefinierte Benachrichtigungen anzuzeigen, wenn Transient eingestellt ist, muss ich mich mit diesem Transient befassen, was den Aufwand wahrscheinlich nicht wert ist.

Eine Sache, die du tun könntest, schätze ich:

  • Lesen Sie in Ihrem validations-Callback die aktuellen Einstellungen (Sie können dies trotzdem tun?) und speichern Sie sie in einer Variablen
  • überprüfe zuerst alle anderen Werte
  • Wenn sie nicht gültig sind, geben Sie Fehler zurück, überprüfen Sie nicht den kritischen Wert
  • Wenn dies der Fall ist, speichern Sie sie in der database (innerhalb Ihrer validationsfunktion)
  • Führen Sie Ihren Remote-API-Aufruf aus
  • validiere den kniffligen Wert
  • Wenn es gültig ist, gib den ganzen Haufen zurück und alles gut
  • Wenn nicht, speichern Sie die alten Einstellungen, die Sie am Anfang erhalten haben, zurück in die db, machen Sie Ihre Fehlerausgabe über add_settings_error() Natürlich macht dies die Einstellungs-API etwas add_settings_error() / missbraucht, aber es könnte ein Weg sein.

Bearbeiten: Die Meldung “Einstellungen gespeichert” übertrumpft Ihre anderen Benachrichtigungen nicht, sondern wird nur angezeigt, weil Ihre anderen Benachrichtigungen (aus irgendeinem Grund) bereits aus dem internen Speicher von settings_error gelöscht wurden. Warum weiß ich das nicht, aber die Meldung Gespeicherte Einstellungen wird einfach nur dann zum Fehlerspeicher hinzugefügt, wenn sie leer ist. Was zu Ihrem Dilemma beitragen könnte, ist, dass get_settings_errors() , wenn der Einstellungserrorsspeicher gelesen wird (über get_settings_errors() ), er auch get_settings_errors() wird.