Aktualisieren von Post-Inhalten und benutzerdefinierten Feldern im Bildschirm “Bearbeiten”

Ich versuche den besten Ansatz zum Anpassen des Bearbeitungspostbildschirms für einen benutzerdefinierten Posttyp zu finden.

Ich möchte einen Knopf hinzufügen, der beim Anklicken Code austriggers, der eine externe (nicht WP) database sucht, einige Daten erhält und dann verschiedene Felder aktualisiert – sowohl core-WP-Felder als auch benutzerdefinierte Meta-Felder. Im Idealfall sollten die Updates Felder im Editor aktualisieren, aber nichts in die WP-database schreiben, bis der Benutzer die Änderungen speichert (mit der normalen Schaltfläche “Aktualisieren”).

Bis jetzt habe ich versucht, eine Submit-Schaltfläche in der Metabox hinzuzufügen und dann in ‘wp_insert_post_data’ einzuhaken. Das funktioniert, aber ich bekomme einen Browser “Die Änderungen, die Sie vorgenommen haben, werden verloren gehen, wenn Sie von dieser Seite weg navigieren” Nachricht, wenn Felder bearbeitet wurden, die ich nicht will.

Zur Aktualisierung der Daten aktualisiere ich $ post, indem ich mich in ‘dbx_post_advanced’ einklinke und meine eigenen Filter hinzufüge, um in meine benutzerdefinierten Meta-Felder einzufügen, was aktualisiert, was in die Felder hineingeht, ohne die database zu aktualisieren. Auch das funktioniert, aber ‘dbx_post_advanced’ fühlt sich ein bisschen hackisch an, da es tief in edit-form-advanced.php vergraben ist und es gibt keine Dokumentation, die ich finden könnte, wozu es gedacht ist.

Gibt es einen besseren Weg, dies zu erreichen, oder zumindest einen Weg zu vermeiden, dass sich der Browser beschwert, dass ich mich von einer Seite wegbewege, auf der ich Änderungen vorgenommen habe?

Solutions Collecting From Web of "Aktualisieren von Post-Inhalten und benutzerdefinierten Feldern im Bildschirm “Bearbeiten”"

Fügen Sie den unten stehenden JavaScript-Code zu Ihrer Absenden-Schaltfläche hinzu. Dies sollte das Ereignis entfernen, das die Warnung bereitstellt. Bitte beachten Sie, dass dieser Code nicht getestet wurde.

window.onbeforeunload = null; 

Dies sollte die Eigenschaft jedoch deaktivieren, wie oben angegeben, dieser Code ist nicht getestet.

Prost,
Joe

Für die Nachwelt und für den Fall, dass jemand anderes das findet, bin ich zu dem Schluss gekommen, dass mein ursprünglicher Ansatz errorshaft ist. Ich kann zwar verhindern, dass der Browser sich über die von @JoeIzzard vorgeschlagene Lösung beklagt, dass ein Feld geändert wurde, aber die Übermittlungsschaltfläche auf dem Post-Editier-Bildschirm ist so eng mit WordPresss Aktualisierung eines Posts verbunden, dass ich große Anstrengungen unternehmen musste um WordPress herumzuhacken und alles zu retten.

Stattdessen habe ich mich auf den folgenden Ansatz geeinigt, der bisher wie gewünscht funktioniert.

  1. Erstellen Sie eine Schaltfläche mit einem Anker-Tag und einer Schaltflächenklasse ( Clickme )
  2. Binden Sie einen jquery-Click-Handler an diese Schaltfläche ( jQuery('#buttonid').click( function(e){...});) )
  3. wp_ajax_ in diesem Click-Handler einen Ajax-Aufruf an eine PHP-function aus, die mit dem wp_ajax_ Handler von WordPress wp_ajax_ .
  4. Von dieser PHP-function kann ich tun, was immer getan werden muss, und ein json-Objekt mit beliebigen Feldwerten zurückgeben, die geändert werden sollten
  5. Der jQuery ajax done Handler aktualisiert Felder nach Bedarf

Dieser Ansatz ermöglicht es mir, alle gewünschten Aktionen vom Post-Edit-Bildschirm aus durchzuführen, ohne die normalen Post-Saving-Routinen von WordPress zu hacken.

Wenn ich Postfelder gleichzeitig aktualisieren möchte, wäre mein ursprünglicher Ansatz wahrscheinlich besser, und Joes Vorschlag würde Browserbeschwerden verhindern, wenn Felder bearbeitet wurden.