Por que a ação save_post é acionada ao criar uma nova postagem?

30

Fico surpreso com o fato de que minha função que adicionei à ação save_post é acionada quando clico no link "Nova postagem" no Painel do administrador. Nota - isto é antes de ter pressionado Salvar ou Atualizar , e ele é disparado imediatamente, não depois de um tempo decorrido ou de uma atualização automática.

Por outro lado, quando eu digito algo e pressiono os botões Publicar ou Atualizar ou Salvar rascunho , a instrução echo I Coloquei dentro do meu manipulador de ação não ecoa, por isso parece que a ação não está disparando em qualquer outro momento. Isso pode não estar relacionado.

Aqui está o meu código:

add_action('save_post', 'MyNS\save_event_metabox', 10, 2);
function save_event_metabox($post_id, $post){
  echo "<h1>YES!</h1>";
}

Este YES ecoa (no topo da página) quando eu pressiono o link "New Post", mas NÃO faz eco quando eu digito algo e então pressiono Update ou Publish ou Salvar rascunho . Isso parece contradizer a documentação sobre a ação save_post e a função wp_insert_post() .

Alguém pode esclarecer isso para mim?

    
por Tom Auger 08.06.2011 / 20:31
fonte

1 resposta

37

Quando você clica em "Nova postagem", simplesmente carrega a página wp-admin/post-new.php .

Ao fazer isso, o WordPress sempre criará um novo post (um 'Auto Draft') para garantir que todos os outros recursos (como uploads de mídia) e plugins funcionem normalmente, mesmo antes de você salvar um rascunho ou publicar o post.

E isso, por sua vez, aciona save_post . Daí o seu eco.

  

Ok, então por que eu não recebo eco ao atualizar ou publicar?

Entre o salvamento e o carregamento da página a seguir, o WordPress está realmente enviando um GET de redirecionamento para a mesma página, que parece transparente (você pode testemunhar isso com um monitor HTTP, como HttpFox ).

Em outras palavras,

  1. Você clica em Update ou Publish
  2. O navegador envia dados ao servidor
  3. o WordPress lida com ele e, no processo, aciona save_post
  4. O WordPress envia de volta um cabeçalho de redirecionamento e sai antes que qualquer saída do navegador ocorra (incluindo seu eco) *
  5. O navegador segue o redirecionamento e carrega a página "editar postagem".

O redirecionamento pode parecer desnecessário (desde que você poderia apenas POST para a mesma página), mas é parte de uma técnica conhecida como Publicar / redirecionar / obter para evitar envio de formulários duplicados .

Se você estiver tentando imprimir mensagens personalizadas com base no resultado de uma função conectada a save_post , confira estas perguntas / respostas .

* Não é estritamente verdadeiro, seu eco ocorrerá antes do envio do cabeçalho de redirecionamento, mas o navegador irá descartá-lo ou as coisas acontecerão tão rapidamente que ele nunca renderiza.

    
por TheDeadMedic 08.06.2011 / 20:58
fonte