web-dev-qa-db-de.com

Verwenden des Hooks 'draft_to_publish' (nach dem Statuswechsel)

Ich versuche, den Hook "draft_to_publish" ( http://codex.wordpress.org/Post_Status_Transitions ) zu verwenden, um eine Funktion auszuführen, wenn ein Beitrag, der ein Entwurf ist, veröffentlicht wird. Dieser Hook scheint nicht zu funktionieren:

add_action('draft_to_publish', 'myFunction');

Wenn ich dies in meinem Plug-In verwende, wird myFunction niemals ausgelöst. Ich habe die Funktion schon einmal benutzt/getestet. Ich weiß, es ist der Haken, nicht der Inhalt von myFunction.

Alle 'Lösungen', die ich gefunden habe, verlinken einfach auf die obige Codex-Seite. Irgendwelche Ideen, warum dieser Haken nicht funktioniert?

Edit: Hier ist ein Beispiel. Die E-Mail wird nicht gesendet, da die Aktion niemals ausgelöst wird:

function myfunction () {
        $to = "[email protected]";
        $subject = "Hi!";
        $body = "Hi,\n\nHow are you?";
        if (mail($to, $subject, $body)) {
          echo("<p>Message successfully sent!</p>");
         } else {
          echo("<p>Message delivery failed...</p>");
         }
    }
add_action('draft_to_publish', 'myFunction');
2
AndrewJM

Sie haben sicherlich den richtigen Hook, aber denken Sie daran, dass Sie Ihre Funktionalität speziell an die Aktion draft_to_publish binden, d. H. An den speziellen Fall, dass ein in der Datenbank vorhandenes Post-Objekt mit dem Status draft auf publish aktualisiert wird. Beachten Sie, dass diese Aktion Entwürfe ignoriert, die automatisch von Wordpress gespeichert werden, wenn ein neuer Beitrag erstellt wird - diese "Entwürfe" haben einen post_status von auto-draft.

Ich bin mir nicht ganz sicher, wie Sie das Problem bis zu diesem Zeitpunkt behoben haben, aber wenn Sie dies noch nicht getan haben, würde ich Ihnen empfehlen, zu überprüfen, ob die Aktion selbst ausgelöst wird, wenn Sie dies erwarten, indem Sie möglicherweise eine einfache, willkürliche Aktion anhängen und offensichtliche Funktion dazu:

function kill_wp( $post ) {
  die( 'draft_to_publish fired for post #' . $post['ID'] . ' entitled, "' . $post['post_title'] . '"' );
}
add_action( 'draft_to_publish', 'kill_wp' );

Das heißt, ein Teil Ihres Problems könnte in der Großschreibung liegen - der Aktionsrückruf in Ihrem Beispiel verweist auf die Funktion myFunction, während die definierte Funktion myfunction heißt.

Obwohl ich nicht sicher bin, was Sie erreichen möchten, können Sie alternativ versuchen, Ihre Funktionalität an die generische Aktion transition_post_status anzuhängen, die den neuen Status des Beitrags, den vorherigen Status des Beitrags und/oder den neuen Status des Beitrags erhält das post objekt so dass du sowas ähnliches haben würdest

function wpse77561_mail_on_publish( $new_status, $old_status, $post ) {
  if (get_post_type($post) !== 'post')
        return;    //Don't touch anything that's not a post (i.e. ignore links and attachments and whatnot )

    //If some variety of a draft is being published, dispatch an email
    if( ( 'draft' === $old_status || 'auto-draft' === $old_status ) && $new_status === 'publish' ) {
        $to      = '[email protected]';
        $subject = 'Hi!';
        $body    = 'Hi,' . chr(10) . chr(10) . 'How are you?';

        if( wp_mail( $to, $subject, $body ) ) {
            echo('<p>Message successfully sent!</p>');
        } else {
            echo('<p>Message delivery failed...</p>');
        }
    }
}
add_action('transition_post_status', 'wpse77561_mail_on_publish');

Es gibt auch eine Reihe von Tools, die Ihnen einen besseren Einblick in die Ausführung von Wordpress-Aktionen gewähren, wie zum Beispiel den Action Hooks Inspector für das Debug Bar Plugin.

9
bosco