Wie kann ich eine Admin-Fehlermeldung anzeigen, wenn die Einstellungen erfolgreich gespeichert wurden?

7

Titel klingt kontraintuitiv, aber ertrage es mit mir. :) :)

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

Aber! Um festzustellen, dass die Daten ungültig sind, muss ich einen Remote-API-Aufruf durchführen. Dieser Aufruf basiert auf gespeicherten Daten. Daher kann ich dies beim Desinfektionsrückruf nicht tun (was empfohlen wird, um solche Benachrichtigungen auszulösen), da meine Daten noch nicht gespeichert sind.

Stattdessen hatte ich versucht, meinen Scheck einzuhaken admin_notices. Es funktioniert die meiste Zeit einwandfrei, mit Ausnahme eines (und wichtigsten) Falls. Wenn Einstellungen gespeichert werden, folgen immer native Einstellungen. Hinweis und meine benutzerdefinierten Hinweise werden aus irgendeinem Grund vollständig ignoriert .

Wie kann ich diesen Fehlerhinweis auslösen, selbst wenn WP der Meinung ist, dass alles in Ordnung ist?

Bearbeiten

Fokussiertere Frage - warum genau Einstellungen gespeichert. übertrumpft irgendwelche anderen Hinweise?

PS Ich könnte versuchen, einen API-Aufruf zu veranlassen, Daten optional als Argument zu verwenden, anstatt sie aus der gespeicherten Option zu lesen, aber bisher denke ich, dass dadurch Argumente zu umfangreich werden.

Selten
quelle

Antworten:

4

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

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

  2. Diese Funktion liest Benachrichtigungen von global, es $wp_settings_errors sei denn, es gibt eine settings_errorsvorübergehende Menge, die die globale Variable übertrumpft.

  3. Wenn Einstellungen gespeichert werden, wird geprüft, ob keine Einstellungsfehler vorliegen, und wenn ja, werden die Einstellungen gespeichert. Hinweis wird generiert. Danach werden (in beiden Fällen) Fehler settings_errorsvorübergehend gespeichert (ich gehe davon aus, dass sie bei der Umleitung erhalten bleiben) ( Quelle ).

Unabhängig davon, welche Benachrichtigungen Sie in Ihrem Code generieren, werden diese ignoriert, wenn Transient eingestellt ist, und sie werden immer nach dem Speichern der Einstellungen festgelegt.

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

Und ich denke, um benutzerdefinierte Benachrichtigungen anzuzeigen, wenn Transient eingestellt ist, muss ich mich mit diesem Transienten herumschlagen, was wahrscheinlich die Mühe nicht wert ist.

Selten
quelle
Wow ... ich habe die exklusive Behandlung der vorübergehenden übersehen ... ja, total, man würde erwarten, dass sie kombiniert werden, weshalb ich verpasst habe, was Sie entdeckt haben. ;-) Wie auch immer, das Durcheinander mit den Transienten sollte ziemlich sicher und einfach sein. Sie lesen einfach den Transientenspeicher mit get_settings_errors(), an diesem Punkt wird der Transientenspeicher gelöscht, dann stellen Sie sie add_settings_error()nacheinander wieder her und fügen Ihren neuen hinzu. Jetzt wird der vorübergehende Speicher gelöscht und Sie haben alle im seitenlokalen Speicher, sodass sie beim nächsten Durchlauf settings_errors()abgefangen werden. Was denken Sie?
Wyrfel
Ahh, das war ein bisschen verwirrt ... Ich denke, in Ihrem Fall müssen Sie die gespeicherte Nachricht aus den Ergebnissen Ihres Aufrufs von get_settings_errors () filtern oder dort belassen, wenn bei Ihrer zweiten Überprüfung alles in Ordnung ist.
Wyrfel
@wyrfel Am Ende entschied ich, dass das Ändern der Mechanik der Einstellungs-API und dieser Hinweise weder Zweck noch Umfang des Plugins ist. Daher implementierte ich meine API-Überprüfung im Sanitization-Rückruf (es stellte sich heraus, dass die Anpassung an den optional übergebenen API-Schlüssel einfach war, anstatt gespeichert zu werden).
Rarst
klingt vernünftig, macht aber weniger Spaß. ;-)
Wyrfel
@wyrfel Ich werde diese Art von Spaß speichern, wenn ich für mich selbst
codiere
0

Eine Sache, die Sie tun könnten, denke ich:

  • Lesen Sie in Ihrem Validierungsrückruf die aktuellen Einstellungen (können Sie dies trotzdem tun?) und speichern Sie sie in einer Variablen
  • Überprüfen Sie zuerst alle anderen Werte
  • Wenn sie nicht gültig sind, geben Sie Fehler zurück und überprüfen Sie den kritischen Wert nicht
  • Wenn dies der Fall ist, speichern Sie sie in der Datenbank (innerhalb Ihrer Validierungsfunktion).
  • Führen Sie Ihren Remote-API-Aufruf aus
  • Überprüfen Sie den kniffligen Wert
  • Wenn gültig, geben Sie den ganzen Haufen und alles Gute zurück
  • Wenn nicht, speichern Sie die alten Einstellungen, die Sie am Anfang erhalten haben, wieder in der Datenbank und führen Sie Ihre Fehlerausgabe über aus. add_settings_error() Natürlich wird die Einstellungs-API dadurch etwas besiegt / missbraucht, aber es könnte ein Weg sein.

Bearbeiten: Die Nachricht "Gespeicherte Einstellungen" übertrifft Ihre anderen Benachrichtigungen nicht, sondern wird nur angezeigt, weil Ihre anderen Benachrichtigungen bereits (aus irgendeinem Grund) aus dem internen Speicher "settings_error" gelöscht wurden. Warum das so ist, weiß ich nicht, aber die Nachricht "Gespeicherte Einstellungen" wird nur dann zum Fehlerspeicher hinzugefügt, wenn sie leer ist. Was zu Ihrem Dilemma beitragen könnte, ist, dass der Einstellungsfehlerspeicher immer dann gelöscht wird, wenn er (via get_settings_errors()) gelesen wird.

wyrfel
quelle
Ich dachte darüber nach, es so zu machen. Arbeitsansatz, aber auch sehr sperrig (und ich stimme zu, dass es scheint, Einstellungen API hier zu besiegen). Ich habe eine etwas umformulierte Frage hinzugefügt - ich bin derzeit mehr daran interessiert, wie es funktioniert, aber warum funktioniert es nicht auf meine Weise (mit separaten Administratorbenachrichtigungen)?
Erster
Können Sie bitte die Codezeilen add_settings_error () und diejenigen, die das Hooking durchführen, posten?
Wyrfel
Ich denke, ich habe es herausgefunden (siehe Antwort, die ich gerade gepostet habe), könnte aber eine zweite Meinung dazu gebrauchen :)
Rarst
@Rarst Hast du die zweite Meinung bemerkt?
Wyrfel