9 Stimmen

Problem mit WordPress "save_post" Aktion

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 bestand darin, die Aktion "save_post" zu verwenden. Beim Aufruf der Aktion wird entweder ein Datenbankeintrag in einer benutzerdefinierten Tabelle erstellt oder aktualisiert (je nachdem, ob "Beitrag erstellen" oder "Beitrag aktualisieren" angeklickt 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 "Create Post" zum ersten Mal geladen wird (d.h. bevor irgendwelche Benutzereingaben eingegeben werden und bevor die Schaltfläche "Submit new/changes" gedrückt wird).

Das bedeutet, dass die benutzerdefinierte Datenbanktabelle mit einer leeren Zeile für jeden neuen Beitrag, der gespeichert wird, gefüllt wird. Das bedeutet auch, dass es jedes Mal eine leere Zeile gibt, wenn die Seite "Beitrag hinzufügen" geladen wird.

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 feststellen, ob der Beitrag tatsächlich gespeichert wird?

19voto

vsz Punkte 292

Ich hatte das gleiche Problem und schaute mir den entsprechenden Abschnitt der post.php an. Es stellte sich heraus, dass save_post jedes Mal aufgerufen wird, wenn post.php läuft, also bei der Erstellung von Beiträgen, Listen usw.

In WP 3.1 wird "post_updated" nur bei einem save/create Ereignis in post.php aufgerufen. Also habe ich verwendet:

add_action('post_updated', 'some_function');

Ich hoffe, das funktioniert auch bei Ihnen.

5voto

Christine Punkte 51

Die Verwendung des "post_updated"-Hakens ist oft problematisch, insbesondere bei der Verwendung von benutzerdefinierten Beitragstypen. 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 durchführen, wenn Objekte in den Papierkorb verschoben wurden.

3voto

Thomas Stachl Punkte 418

Dieser Hook wird immer dann ausgeführt, wenn ein Beitrag oder eine Seite erstellt oder aktualisiert wird, z. B. durch einen Import, ein Formular zum Bearbeiten von Beiträgen/Seiten, xmlrpc oder einen Beitrag per E-Mail. Ich würde also vermuten, dass er auch ausgeführt wird, wenn eine Beitragsrevision gespeichert wird. Wenn ich Sie wäre, würde ich überprüfen, ob die postID gesetzt ist (das ist das einzige Argument, das die Hook-Funktion erhalten sollte) und ob es sich um eine Revision handelt wp_is_post_revision() .

1voto

2hamed Punkte 8289

Überprüfen Sie einfach, ob die Daten tatsächlich gebucht werden oder nicht.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X