web-dev-qa-db-fra.com

Utilisation du hook 'draft_to_publish' (post status status)

J'essaie d'utiliser le hook draft_to_publish ( http://codex.wordpress.org/Post_Status_Transitions ) pour exécuter une fonction lorsqu'une publication en tant que brouillon est publiée. Ce crochet ne semble pas fonctionner:

add_action('draft_to_publish', 'myFunction');

Lorsque je l'utilise dans mon plug-in, myFunction n'est jamais déclenché. J'ai utilisé/testé la fonction auparavant. Je sais que c'est le crochet, pas le contenu de myFunction.

Toutes les "solutions" que j'ai trouvées ne font que renvoyer à la page du Codex ci-dessus. Des idées sur pourquoi ce crochet ne fonctionne pas?

Edit: Voici un exemple. Si l'e-mail ne sera pas envoyé, car l'action ne se déclenche jamais:

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

Vous avez certainement le bon crochet, mais gardez à l'esprit que vous accrochez votre fonctionnalité spécifiquement à l'action draft_to_publish, c'est-à-dire au cas spécifique d'un post-objet pré-existant dans la base de données avec le statut draft mis à jour à publish. Notez que cette action ignore les brouillons automatiquement enregistrés par Wordpress lors de la création d'un nouveau message. Ces "brouillons" ont un post_status de auto-draft.

Je ne sais pas exactement comment vous avez résolu le problème jusqu'à présent, mais si vous ne l'avez pas déjà fait, je vous recommanderais de vérifier que l'action elle-même est déclenchée quand vous le souhaitez, peut-être en joignant des éléments simples, arbitraires. , et sa fonction évidente:

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

Cela dit, une partie de votre problème réside peut-être dans la mise en majuscule. Dans votre exemple, le rappel d'action fait référence à la fonction myFunction alors que la fonction définie s'appelle myfunction.

Bien que je ne sois pas sûr de ce que vous essayez d'accomplir, vous pouvez également essayer de lier vos fonctionnalités à l'action générique transition_post_status qui se voit transmettre le nouveau statut de la publication, le statut précédent de la publication, et l'objet de poste tel que vous auriez quelque chose de similaire à

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');

Il existe également un certain nombre d'outils disponibles qui pourraient vous donner davantage d'informations sur l'exécution des actions de Wordpress, tels que l'inspecteur des crochets d'action pour le Barre de débogage plugin.

9
bosco