Warum wird die Aktion save_post ausgelöst, wenn ein neuer Beitrag erstellt wird?

31

Ich bin überrascht über die Tatsache, dass meine Funktion, die ich für die save_postAktion festgelegt habe, ausgelöst wird, wenn ich im Admin-Dashboard auf den Link "Neuer Beitrag" klicke. Hinweis - Dies ist, bevor ich gedrückt habe, Saveoder Updateund es wird sofort ausgelöst, nicht nach einer abgelaufenen Zeit oder nach einer automatischen Aktualisierung.

Wenn ich dann etwas eintippe und die Tasten Publishoder Updateoder drücke Save Draft, wird die Echo-Anweisung, die ich in meinen Aktionshandler eingefügt habe, nicht zurückgegeben, sodass es den Anschein hat, dass die Aktion zu keinem anderen Zeitpunkt ausgelöst wird. Dies kann unabhängig sein.

Hier ist mein Code:

add_action('save_post', 'MyNS\save_event_metabox', 10, 2);
function save_event_metabox($post_id, $post){
  echo "<h1>YES!</h1>";
}

Dieses JA wird (oben auf der Seite) wiedergegeben, wenn ich auf den Link "Neuer Beitrag" drücke, es wird jedoch NICHT wiedergegeben, wenn ich etwas eingebe und dann Updateoder Publishoder drücke Save Draft. Dies scheint der Dokumentation über die save_postAktion und die wp_insert_post()Funktion zu widersprechen .

Kann das jemand für mich klären?

Tom Auger
quelle
Genial!!! Ich bin in der gleichen Situation beim Speichern von benutzerdefinierten Metabox-Felder ausgeführt. eine Idee, was ich verwenden kann?
Prasath Nadarajah

Antworten:

39

Wenn Sie auf "Neuer Beitrag" klicken, laden Sie einfach die Seite wp-admin/post-new.php.

Dabei erstellt WordPress immer einen neuen Beitrag (einen "Auto Draft"), um sicherzustellen, dass alle anderen Funktionen (z. B. das Hochladen von Medien) und Plugins wie gewohnt funktionieren, noch bevor Sie einen Entwurf speichern oder den Beitrag veröffentlichen.

Und das wiederum löst aus save_post. Daher dein Echo.

Okay, warum bekomme ich beim Aktualisieren oder Veröffentlichen kein Echo?

Zwischen dem Speichern und dem Laden der folgenden Seite sendet WordPress tatsächlich eine GETUmleitung zurück auf dieselbe Seite, die transparent erscheint (dies können Sie mit einem HTTP-Monitor wie HttpFox beobachten ).

Mit anderen Worten;

  1. Sie klicken auf UpdateoderPublish
  2. Der Browser sendet Daten an den Server
  3. WordPress kümmert sich darum und löst dabei aus save_post
  4. WordPress sendet einen Umleitungsheader zurück und wird beendet, bevor eine Browser-Ausgabe erfolgt (einschließlich Ihres Echos) *
  5. Der Browser folgt der Umleitung und lädt die Seite 'Beitrag bearbeiten'.

Die Weiterleitung erscheint möglicherweise unnötig (da Sie nur POSTzur gleichen Seite wechseln können), ist jedoch Teil einer Technik, die als " Post / Redirect / Get" bezeichnet wird, um doppelte Formularübermittlungen zu vermeiden .

Wenn Sie versuchen, benutzerdefinierte Nachrichten basierend auf einem Ergebnis einer verknüpften Funktion auszudrucken save_post, lesen Sie diese Fragen / Antworten .

* Nicht ganz richtig, Ihr Echo wird tatsächlich auftreten, bevor der Weiterleitungsheader gesendet wird, aber der Browser wird es entweder verwerfen oder die Dinge geschehen so schnell, dass es nie wiedergegeben wird.

TheDeadMedic
quelle
Hervorragend. Vielen Dank für eine so vollständige und detaillierte Antwort! Wie sind Sie im Interesse des Lernens überhaupt auf dieses Wissen gestoßen?
Tom Auger
Durch den gleichen Frust, den Sie hatten;) Besorgen Sie sich eine gute IDE (ich benutze phpDesigner) und stöbern Sie einfach in den relevanten Admin-Dateien.
TheDeadMedic
1
Direkt am Bruder. Vielen Dank für Ihr Fachwissen!
Tom Auger
Tolle Information. Ich war verrückt, weil es auf meinem lokalen Server "ok" zu funktionieren schien, aber nicht auf meinem Produktionsserver ... es sieht so aus, als ob es auf meinem lokalen Server die Post / Redirect / Get-Technik nicht richtig anwendete, weil es nicht so war Senden des Redirect-Headers (weiß aber nicht warum).
Der WebMacheter