Kann innerhalb der Aktion save_post festgestellt werden, ob ein neuer Beitrag erstellt oder ein vorhandener Beitrag aktualisiert wird?
save-post
wp-update-post
Hereswhatidid
quelle
quelle
Antworten:
Seit WordPress Version 3.7. - IIRC - the
save_post
hook - Weitere Informationen zum Hook und seiner Verwendung unter Code Reference:save_post
und Codex:save_post
- Mit einem dritten Parameter$update
kann genau das bestimmt werden.Hinweis:
$update
ist nicht immertrue
- Sie können es selbst mit dem folgenden Code sehen und testen. Es ist jedoch nicht gut dokumentiert, möglicherweise alles andere als optimal benannt, und führt daher zu irreführenden Erwartungen. Der folgende Code kann für einige Debugging-Vorgänge verwendet werden. Spielen Sie damit, wann die Codeausführung abgefangen werden soll, da sonst die Informationen / Meldungen nicht angezeigt werden. Ich denke, der Schuldige an betrügerischem Verhalten ist der Umgang mit Revisionen und automatischen Speichern - die deaktiviert werden könnten, aber ich empfehle es nicht und habe es nicht getestet. Ich bin mir nicht sicher, ob dies ein Trac-Ticket rechtfertigt. Daher habe ich kein Ticket geöffnet. Wenn Sie dies glauben, folgen Sie bitte dem Link und machen Sie es selbst. Außerdem sollten Sie, wie in den Kommentaren angegeben, eine neue Frage stellen, wenn Sie ein bestimmtes Problem haben.quelle
$update
Parameter ist IMMER wahr, auch wenn es sich um einen neuen Beitrag handelt. Dieser Parameter ist also unbrauchbar. Ich bin mir nicht sicher, ob es jemals funktioniert hat, aber es funktioniert verdammt noch mal nicht so, wie es in der neuesten Version von WordPress 4.8 dokumentiert ist.wp_publish_post
, dann ja. Dies gilt jedoch nicht für die Verwendung inwp_insert_post
. Ich habe eine Debug-Funktion geschrieben, die ich der Antwort hinzufüge.save_post
Hook hat einen 3. Parameter, der immer auf TRUE gesetzt ist. Sie können sich also nicht sicher sein, was dies mit anderen Hooks zu tun hat, und sprechen nicht über andere Hooks. Ich spreche über den Haken in deiner Antwort. Das ist falsch.wp_insert_post()
,wp_publish_post()
. Letzteres sind nur zukünftige Posts, da$update
soll es immer seintrue
. Ansonsten in Bezug aufwp_insert_post()
,$update
ist nicht immertrue
.Die Art und Weise, wie ich diese Prüfung durchführe (innerhalb einer Hook-Funktion), ist das Vergleichen des Post-Datums und des Änderungsdatums (in GMT zur Standardisierung).
Dies funktioniert, da dem Beitrag bereits bei der Erstellung ein Änderungsdatum zugeordnet ist, das genau dem Erstellungsdatum entspricht. Wir lassen jedoch eine Abweichung von 1 Sekunde zu, falls eine Sekunde während der Erstellung von überschreitet die Post.
quelle
post_date_gmt
ist das2019-03-12 01:31:30
und daspost_modified_gmt
ist2019-03-12 01:31:31
. :(Am Ende habe ich nur überprüft, ob ein benutzerdefinierter Wert vorhanden ist, bevor ich ihn einstelle. Auf diese Weise ist der benutzerdefinierte Wert noch nicht vorhanden, wenn es sich um einen neu erstellten Beitrag handelt.
quelle
Beispiel für die Antwort von ialocin mit dem Parameter "update":
quelle
if($update)
oder den neuen Block an erster Stelle zu behalten, aber zu verwendenif( ! $update )
. Letzteres wird OP zu einer besseren Übung machen und wird von WordPress-Codierungsstandards in Fällen wie dem ternären OperatorSie können den Aktions-Hook pre_post_update für den Aktualisierungscode und save_post für die neue Postleitzahl verwenden. Es funktioniert, bevor ein Beitrag aktualisiert wird.
quelle
save_post
Haken abgefeuert sowohl , wenn ein Post erstellt und aktualisiert wird (nach Wordpress es in der Datenbank gespeichert ist).pre_post_update
wird ausgelöst, wenn ein Beitrag aktualisiert wird, aber bevor der Beitrag aktualisiert wird - dies kann wichtig sein.Wie Darshan Thanki andeutete (und Stephen Harris weiter ausarbeitete), können Sie
pre_post_update
zu Ihrem Vorteil nutzen.Der Grund, warum ich Globals verwendet habe, ist weil
function is_new_post() use ( &$new_post )
es in PHP nicht gültig ist (schockierend ...), also funktioniert es nicht, diese Variable in den Funktionsumfang zu ziehen - daher das Globale.Beachten Sie, dass dies wirklich nur innerhalb / nach der
save_post
Veranstaltung zuverlässig genutzt werden kann (was in der Regel ausreicht, zumindest für das, was wir damit machen).quelle
Wenn save_post ausgelöst wird, sind bereits alle Informationen zu diesem Beitrag verfügbar, sodass Sie theoretisch verwenden können
Dies ist jedoch ungetestet. =)
quelle
save_post
dem Sie den Beitrag selbst erhalten, wäre er bereits in der Datenbank gespeichert worden - alsoget_posts
würde er den aktuellen Beitrag zurückgeben.Ein anderer Ansatz, bei dem eine integrierte Funktion verwendet wird und die Datenbank nicht erweitert wird, ist erforderlich
get_post_status()
.Beachten Sie jedoch, dass es möglicherweise nicht angebracht ist, den Status später auf "Entwurf" zurückzusetzen - Ihre Anweisungen werden beim nächsten Aktualisieren des Posts wiederholt. Je nach Kontext möchten Sie möglicherweise die verschiedenen Zeichenfolgen berücksichtigen, die von zurückgegeben werden können
get_post_status()
, um ein geeigneteres Szenario zu erstellen.Siehe Codex für get_post_status () und Post Status
quelle
save_post()
wird dieser zum ersten Mal ausgeführt, aber während dieser Ausführung wirdget_post_status()
bereits "Veröffentlichen" und nicht "Entwurf" zurückgegeben, obwohl er erst veröffentlicht wird.