qual é a maneira correta de ligar quando atualizar post

19

Eu tento ligar quando o post é atualizado, mas todos os cabos que eu tento nunca são executados, exceto updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

Eu tentei isso, add_action('save_post', 'my_function');mas nenhum ID foi emitido, ou talvez essa mensagem já seja reproduzida, mas nunca é processada devido ao envio do cabeçalho de redirecionamento.

rusly
fonte
2
você tem um espaço depois save_post, isso é um erro de digitação aqui ou estava no seu código original? Além disso, ative a depuração durante o desenvolvimento.
Milo
@Milo erro de digitação muito, mas não no código original
rusly
se for esse o caso, você verá sua saída no canto superior esquerdo da tela ao criar uma nova postagem. salvar uma postagem existente acontece antes de um redirecionamento; portanto, você não verá nada a menos que tenha a depuração ativada.
Milo

Respostas:

55

Quando uma postagem é atualizada, existem alguns ganchos disparados:

  • 'pre_post_update'é uma ação disparada imediatamente antes da atualização da postagem, o argumento passado é 2: $post_IDe $dataessa é uma matriz de todas as outras colunas do banco de dados da tabela de postagem
  • 'transition_post_status'é um gancho acionado na atualização e transmite 3 argumentos: $ new_post_status $old_post_statuse $post(object).
  • Em seguida, existem outros 2 ganchos de transição acionados, mas eles são nomeados dinamicamente, significa que a ação efetiva acionada depende do status antigo e do novo post. "{$old_status}_to_{$new_status}"e "{$new_status}_{$post->post_type}". Primeiro passe o único objeto de postagem como argumento, o segundo passe o ID da postagem e o objeto de postagem. Encontre a documentação aqui .
  • 'edit_post'que passam 2 argumentos: $post_IDe $post(objeto)
  • 'post_updated'que passam 3 argumentos: $post_ID, $post_after(objeto pós após a atualização), $post_before(objeto post antes da atualização)
  • Outro gancho dinâmico: "save_post_{$post->post_type}"que depende do tipo de post, por exemplo, para mensagens padrão é 'save_post_post'e páginas é 'save_post_page', esta passagem gancho 3 argumentos: $post_ID, $post(objeto) e $updateque é um booleano (verdadeiro ou falso) que é verdadeiro quando você executar uma atualização, em Este gancho também é acionado quando uma postagem é salva pela primeira vez.
  • ' save_post' que é acionado na atualização e na primeira gravação e passa os mesmos 3 argumentos do gancho anterior.
  • ' save_post_{$post_type}' que é acionado na atualização e no primeiro salvamento e passa os mesmos 2 primeiros argumentos do gancho anterior.
  • Finalmente, você tem ' wp_insert_post' , que é acionado na atualização e na primeira gravação e passa os mesmos 3 argumentos dos 2 ganchos anteriores.

Esses ganchos são acionados toda vez que uma postagem é atualizada, tanto nas páginas de administração no back-end quanto nas atualizações "manualmente" usando as funções wp_update_postou wp_insert_post.

Quando a postagem é atualizada usando as páginas de administração, há ganchos adicionais acionados, um exemplo é 'update_post_redirect'ou 'post_updated_messages'. (Veja esta e esta resposta da WPSE para exemplos de uso).

Observe que, se você quiser fazer uso de algum argumento hooks, esse não é o primeiro, você deve declará-lo explicitamente na add_actionchamada.

Por exemplo, se você quiser usar o '$update'argumento (que é o terceiro) do 'save_post'gancho, precisará adicionar 3como $accepted_argsparâmetro add_action( consulte a documentação ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

A última nota diz respeito ao tempo : você deve ter certeza de que add_actioné chamado antes que a ação seja acionada ou ela não fará nada.

Por exemplo, este código:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

não fará nada, porque a ação é adicionada após o disparo do gancho. Aqui é simples reconhecê-lo, no código do mundo real nem sempre é assim.

gmazzap
fonte
Eu acho que o gancho de ação 'save_post' também é acionado ao pressionar Add New (Post, Page, CPT) no painel. Para se ver, basta executar esse código. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );Por que a ação 'save_post' é executada em Adicionar novo em vez de em Publicar? Para fazer a postagem de rascunho automático, suponho.
lowtechsun
@lowtechsun Como é dito no A, os ganchos são disparados toda vez que uma postagem é atualizada, ou seja, salva no DB. Quando você clica em "Adicionar novo", próximo ao carregamento da página, o WP cria um rascunho de postagem armazenado no banco de dados para que ele seja acionado.
gmazzap
Obrigado por voltar para mim. Acabei de descobrir isso ontem e pensei que o conceito disso é confuso. Significado, primeiro eu abro a página para adicionar uma nova postagem. Nesta fase, pensei que ainda não havia criado um post. Somente depois de clicar em Publicar, acho que a nova postagem foi criada. Levando isso adiante, espero que o WP exclua a postagem de rascunho automático se eu clicar em Adicionar novo, mas sair da página sem pressionar Publicar?
lowtechsun
2

Por que não ligar post_updated_messages. Dessa forma, você pode mostrar esta mensagem como o post padrão do wordpress atualizado.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Procure um exemplo aqui:

http://codex.wordpress.org/Function_Reference/register_post_type

debaixo post_updated_messages

Jacob Rambo
fonte