Problem mit der WordPress-Aktion „save_post“.

Lesezeit: 4 Minuten

Benutzeravatar von Lea Hayes
Lea Hayes

Ich habe ein WordPress-Plugin entwickelt, das eine zusätzliche Verarbeitung durchführen muss, wenn ein Beitrag eines benutzerdefinierten Beitragstyps gespeichert wird.

Die logischste Lösung war die Verwendung der Aktion “save_post”. Nach dem Aufruf erstellt oder aktualisiert der Aktionshandler einen Datenbankeintrag in einer benutzerdefinierten Tabelle (abhängig davon, ob auf „Beitrag erstellen“ oder „Beitrag aktualisieren“ geklickt wird).

Ich habe dies implementiert und es schien perfekt zu funktionieren, aber es gibt ein kleines Problem, das ich gerne lösen würde. Es scheint, dass “save_post” auch ausgelöst wird, wenn die Seite “Post erstellen” zum ersten Mal geladen wird (dh bevor Benutzereingaben eingegeben werden und bevor die Schaltfläche “Neue/Änderungen senden” gedrückt wird).

Das bedeutet, dass die benutzerdefinierte Datenbanktabelle für jeden neuen Beitrag, der gespeichert wird, mit einer leeren Zeile gefüllt wird. Es bedeutet auch, dass jedes Mal, wenn die Seite zum Hinzufügen von Beiträgen geladen wird, eine leere Zeile vorhanden ist.

Hier ist eine vereinfachte Version meines “save_post”-Handlers:

function do_save_post($post_id) {
    if (get_post_type($post_id) !== 'mycustomtype')
        return $post_id;

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return $post_id;

    if (!current_user_can('edit_mycustomtype'))
        return $post_id;

    echo 'This happens when selecting "Add New" from admin sidebar.';
    echo 'Even though post has not been saved or updated.';
    echo 'This should only happen when button on right of editor is clicked.';
}

Wie kann ich erkennen, ob der Beitrag tatsächlich gespeichert wird?

  • Was bringt es, $post_id zurückzugeben, wenn es fehlschlägt?

    – Helgathewikinger

    8. Januar 2012 um 13:53 Uhr

  • @helgatheviking Es ermöglicht anderen Hooks, ihre Verarbeitung mit dem richtigen durchzuführen $post_id. Mein Hook versagt nicht, er will nur kontrollieren, wann die Verarbeitung durchgeführt werden soll. Das $post_id wird von jedem Haken zu jedem Haken zurückgereicht.

    – Lea Hayes

    8. Januar 2012 um 14:15 Uhr

  • @lea_hayes danke für die Antwort! Ich wusste nicht, dass die $post_id von Hook zu Hook weitergegeben wurde. Ich habe keine Probleme mit dem Abwürgen des Codes bemerkt, wenn ich ihn nicht zurücksende.

    – Helgathewikinger

    8. Januar 2012 um 14:26 Uhr

Ich hatte das gleiche Problem und habe mir den entsprechenden Abschnitt von post.php angesehen. Es stellt sich heraus, dass save_post jedes Mal aufgerufen wird, wenn post.php ausgeführt wird, sodass Sie es bei der Erstellung von Beiträgen, Listen usw. ausführen.

In WP 3.1 wird “post_updated” nur bei einem save/create-Event in post.php aufgerufen. Also habe ich verwendet:

add_action('post_updated', 'some_function');

Hoffe das funktioniert auch bei dir.

  • Danke, das ist jetzt so nah. Kann verhindert werden, dass es ausgelöst wird, wenn der Beitrag in den Papierkorb verschoben wird?

    – Lea Hayes

    2. Mai 2011 um 11:24 Uhr

  • Das war eigentlich einfach für mich, alles, was ich tun muss, ist if (!isset($_POST['my-extra-data'])) return $post_id;

    – Lea Hayes

    2. Mai 2011 um 11:29 Uhr

  • +1 Das hat mich wirklich gestört, weil es anscheinend eine Reihe von Standardwerten für alle meine Felder erstellt hat, wobei alle Kontrollkästchen deaktiviert waren.

    – Marcus Downing

    16. Mai 2011 um 14:01 Uhr

  • Funktioniert nur, wenn der Beitrag aktualisiert wird. Nicht nach dem Erstellen des Beitrags.

    – Verschmelzung

    10. April 2019 um 16:39 Uhr

Die Verwendung des Hooks „post_updated“ ist tendenziell problematisch, insbesondere wenn benutzerdefinierte Post-Typen verwendet werden. Stattdessen habe ich dies als meine Lösung verwendet:

   function do_save_post($post_id){
        $post = get_post($post_id);
        if($post->post_status == 'trash' or $post->post_status == 'auto-draft'){
                return $post_id;
        }
        echo "do stuff";
    }

Ich wollte auch keine Aktionen ausführen, wenn Elemente in den Papierkorb verschoben wurden.

Dieser Hook wird immer dann ausgeführt, wenn ein Beitrag oder eine Seite erstellt oder aktualisiert wird, was von einem Import, einem Beitrags-/Seitenbearbeitungsformular, xmlrpc oder einem Beitrag per E-Mail stammen kann. Ich würde also vermuten, dass es auch ausgeführt wird, wenn eine Post-Revision gespeichert wird. Wenn ich bei dir wäre, würde ich prüfen, ob die PostID gesetzt ist (ist das einzige Argument, das die Hook-Funktion erhalten sollte) und ob es sich um eine Revision handelt wp_is_post_revision().

  • $post_id enthält eine gültige ID und wp_is_post_revision() scheint nicht hilfreich zu sein. Der Hook wird ausgeführt, sobald „Add New“ in der Admin-Sidebar ausgewählt wird. Ich habe meine ursprüngliche Frage mit Demonstrationscode aktualisiert, um das Problem näher zu erläutern. Vielen Dank.

    – Lea Hayes

    25. März 2011 um 17:04 Uhr

Vielleicht möchten Sie nur überprüfen, ob die Daten tatsächlich gepostet werden oder nicht.

if(isset($_POST['post_title'])){
    //do stuff
}

1392410cookie-checkProblem mit der WordPress-Aktion „save_post“.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy