Usando o gancho 'draft_to_publish' (transição de status de postagem)

2

Estou tentando usar o gancho draft_to_publish ( enlace ) para executar uma função quando uma publicação que é um rascunho for publicada. Este gancho não parece estar funcionando:

add_action('draft_to_publish', 'myFunction');

Quando eu uso isso no meu plug-in, o myFunction nunca é disparado. Eu usei / testei a função antes. Eu sei que é o gancho, não o conteúdo do myFunction.

Todas as 'soluções' que encontrei apenas apontam para a página do Codex acima. Alguma idéia de por que esse gancho não está funcionando?

Editar: Aqui está um exemplo. O e-mail não será enviado porque a ação nunca é acionada:

function myfunction () {
        $to = "recipient@example.com";
        $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');
    
por AndrewJM 28.12.2012 / 16:12

1 resposta

9

Você certamente tem o gancho certo, mas tenha em mente que está vinculando sua funcionalidade especificamente à ação draft_to_publish , isto é, ao caso específico de um pós-objeto pré-existente no banco de dados com draft status sendo atualizado para publish . Observe que essa ação ignora os rascunhos que são salvos automaticamente pelo Wordpress quando uma nova postagem é criada - esses "rascunhos" têm um post_status de auto-draft .

Não sei exatamente como você depurou o problema até o momento, mas se ainda não o fez, recomendamos que verifique se a ação está sendo acionada quando você espera, talvez anexando alguns função simples, arbitrária e óbvia:

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

Dito isso, parte do seu problema pode estar na capitalização - o callback de ação no seu exemplo faz referência à função myFunction enquanto a função que está definida foi nomeada myfunction .

Embora não tenha certeza do que você está tentando realizar, você pode alternativamente tentar anexar sua funcionalidade a ação genérica transition_post_status que recebe o novo status da postagem, o status anterior da postagem e o objeto post de modo que você teria algo semelhante a

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      = 'recipient@example.com';
        $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');

Há também uma série de ferramentas disponíveis que podem lhe dar mais informações sobre a execução de ações do Wordpress, como o action hooks inspector para o plugin Debug Bar .

    
por bosco 28.12.2012 / 22:31