Ich habe eine Funktion, die ein benutzerdefiniertes Feld für einen Beitragstyp definiert. Angenommen, das Feld ist "subhead".
Wenn der Beitrag gespeichert wird, möchte ich eine Überprüfung der Eingabe durchführen und bei Bedarf eine Fehlermeldung auf dem Bildschirm zum Bearbeiten des Beitrags anzeigen. So etwas wie:
// Handle post updating
function wpse_update_post_custom_values($post_id, $post) {
// Do some checking...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors->add('oops', 'There was an error.');
}
return $errors;
}
add_action('save_post','wpse_update_post_custom_values',1,2);
Ich versuche, dies mit der Aktion save_post zu verknüpfen, aber ich kann nicht herausfinden, wie ich mit Fehlern umgehen soll. Es scheint, dass kein Fehlerobjekt an die Funktion übergeben wurde, und wenn ich mein eigenes WP_Error-Objekt erstelle und es zurückgebe, wird es von keinem der Mechanismen beachtet, die Fehler auf der Nachbearbeitungsseite ausspucken.
Ich habe derzeit eine On-Page-Fehlermeldung in meiner benutzerdefinierten Meta-Box, aber dies ist weniger als ideal - ich hätte lieber einen großen, roten Fehler oben, wie er normalerweise in WP angezeigt wird.
Irgendwelche Ideen?
AKTUALISIEREN:
Basierend auf der Antwort von @Denis habe ich ein paar verschiedene Dinge ausprobiert. Das Speichern von Fehlern als global hat nicht funktioniert, da Wordpress während des Prozesses save_post eine Umleitung durchführt, die das globale Element beendet, bevor Sie es anzeigen können.
Am Ende habe ich sie in einem Metafeld gespeichert. Das Problem dabei ist, dass Sie sie löschen müssen oder sie nicht verschwinden, wenn Sie zu einer anderen Seite navigieren. Deshalb musste ich dem admin_footer eine weitere Funktion hinzufügen, die nur die Fehler löscht.
Ich hätte nicht erwartet, dass die Fehlerbehandlung für etwas so Häufiges (Aktualisieren von Posts) so umständlich wäre. Fehlt mir etwas Offensichtliches oder ist dies der beste Ansatz?
// Handle post updating
function wpse_5102_update_post_custom_values($post_id, $post) {
// To keep the errors in
$errors = false;
// Do some validation...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors .= 'whoops...there was an error.';
}
update_option('my_admin_errors', $errors);
return;
}
add_action('save_post','wpse_5102_update_post_custom_values',1,2);
// Display any errors
function wpse_5102_admin_notice_handler() {
$errors = get_option('my_admin_errors');
if($errors) {
echo '<div class="error"><p>' . $errors . '</p></div>';
}
}
add_action( 'admin_notices', 'wpse_5102_admin_notice_handler' );
// Clear any errors
function wpse_5102__clear_errors() {
update_option('my_admin_errors', false);
}
add_action( 'admin_footer', 'wpse_5102_clear_errors' );
quelle
admin_footer
Haken loswerden, wenn Sie die Fehler am Ende Ihrer Benachrichtigungsfunktion beseitigen. Vereinfacht die Dinge nur ein bisschen.update_option('my_admin_errors', false);
unmittelbar nach der if-Anweisung am Ende von auszuführenwpse_5102_admin_notice_handler()
?Antworten:
Speichern Sie Fehler in Ihrer Klasse oder als globales Element, möglicherweise als Transient oder Meta, und zeigen Sie sie in Administratorbenachrichtigungen zu POST-Anforderungen an. WP verfügt über keinen Flash-Message-Handler.
quelle
Ich empfehle die Verwendung von Sitzungen, da dies bei gleichzeitiger Bearbeitung durch zwei Benutzer keine seltsamen Effekte hervorruft. Das mache ich also:
Sitzungen werden nicht von WordPress gestartet. Sie müssen also eine Sitzung in Ihrem Plugin, functions.php oder sogar wp-config.php starten:
Fügen Sie beim Speichern des Beitrags Fehler und Hinweise an die Sitzung an:
Drucken Sie Hinweise und Fehler und bereinigen Sie dann die Nachrichten in der Sitzung:
quelle
Basierend auf Pospi ‚s Vorschlag zur Verwendung Transienten , kam ich mit der Follow - up. Das einzige Problem ist, dass es keinen Haken gibt, um die Nachricht unter das zu setzen
h2
Position anderer Nachrichten platziert werden kann. Daher musste ich einen jQuery-Hack durchführen, um sie dort abzurufen.Speichern Sie zunächst die Fehlermeldung in Ihrem
save_post
(oder einem ähnlichen) Handler. Ich gebe es eine kurze Lebensdauer von 60 Sekunden, so ist es gerade lang genug für die Umleitung passieren.Rufen Sie dann diese Fehlermeldung beim Laden der nächsten Seite ab und zeigen Sie sie an. Ich lösche es auch, damit es nicht zweimal angezeigt wird.
Da es
admin_notices
vor dem Generieren des primären Seiteninhalts zu Bränden kommt, befindet sich der Hinweis nicht dort, wo die anderen Nachbearbeitungsnachrichten abgelegt werden. Daher musste ich diese jQuery verwenden, um sie dorthin zu verschieben:Da die Beitrags-ID Teil des vorübergehenden Namens ist, sollte dies in den meisten Mehrbenutzerumgebungen funktionieren, es sei denn, mehrere Benutzer bearbeiten gleichzeitig denselben Beitrag.
quelle
acme_plugin_error_msg_POSTID
. Sie können dem einfach eine Benutzer-ID hinzufügenacme_plugin_error_msg_POSTID_USERID
.Wenn
save_post
läuft, hat er bereits den Posten auf der Datenbank gespeichert.Ein Blick in Wordpress Kern - Code, genauer gesagt an dem
wp-includes/post.php
‚s -update_post()
Funktion, wird es keine integrierte Möglichkeit , eine Anfrage an abfangen , bevor sie in der Datenbank gespeichert wird.Wir können jedoch einbinden
pre_post_update
und verwendenheader()
undget_post_edit_link()
verhindern, dass der Beitrag gespeichert wird.Wenn Sie den Benutzer darüber informieren möchten, dass ein Fehler aufgetreten ist, überprüfen Sie die folgende Liste: https://gist.github.com/Luc45/09f2f9d0c0e574c0285051b288a0f935
quelle
Warum validieren Sie Ihr Feld nicht mit Hilfe von Javascript? Ich denke, das wäre der beste Ansatz dafür.
quelle
Beim Versuch, das obige Skript zu verwenden, stieß ich auf ein seltsames Problem. Nach dem Post-Update werden auf dem Bearbeitungsbildschirm zwei Nachrichten angezeigt. Einer zeigt den Status des Inhalts aus dem vorherigen Speichern und ein anderer aus dem aktuellen. Wenn ich zum Beispiel den Beitrag richtig speichere und dann einen Fehler mache, ist der erste "Fehler" und der zweite "OK" - obwohl sie gleichzeitig generiert werden. Wenn ich das Skript ändere und nur eine Meldung anhänge (zB "error"), starte ich ein Update mit "error" und danach mit "ok", bleibt die Meldung "error" (wird zum zweiten Mal angezeigt). Ich muss noch einmal mit "ok" speichern, um es loszuwerden. Ich weiß wirklich nicht, was los ist, ich habe es auf drei verschiedenen lokalen Servern getestet und es gibt auf jedem das gleiche Problem.
quelle
Ich habe ein Plugin geschrieben, das eine Flash-Fehlerbehandlung für Post-Edit-Bildschirme hinzufügt und das Veröffentlichen von Posts verhindert, bis erforderliche Felder ausgefüllt sind:
https://github.com/interconnectit/required-fields
Sie können alle Post-Felder als obligatorisch festlegen, aber Sie können die von ihr bereitgestellte API verwenden, um auch alle benutzerdefinierten Felder mit einer anpassbaren Fehlermeldung und Validierungsfunktion zu erstellen. Standardmäßig wird überprüft, ob das Feld leer ist oder nicht.
quelle