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

31

Surpreende-me o fato de que minha função que aderi à save_postação é acionada quando clico no link "Nova postagem" no Painel do administrador. Nota - isto é antes de eu pressionar Saveou Update, e é acionado imediatamente, não após um tempo decorrido ou atualização automática.

Por outro lado, quando digito algo e pressiono os botões Publishou Updateou Save Draft, a instrução echo que coloquei no meu manipulador de ações não ecoa, portanto parece que a ação NÃO está sendo disparada em nenhum 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>";
}

Isso SIM ecoa (na parte superior da página) quando pressiono o link "Nova Postagem", mas NÃO ecoa quando digito alguma coisa e, em seguida, pressione Updateou Publishou Save Draft. Isso parece contradizer a documentação sobre a save_postação e a wp_insert_post()função.

Alguém pode esclarecer isso para mim?

Tom Auger
fonte
Impressionante!!! Estou executando a mesma situação ao salvar campos metabox personalizados. alguma idéia do que eu posso usar?
Prasath Nadarajah

Respostas:

39

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

Ao fazer isso, o WordPress sempre criará uma nova postagem (um 'Rascunho Automático') para garantir que todos os outros recursos (como upload de mídia) e plugins funcionem normalmente, mesmo antes de você salvar um rascunho ou publicar a postagem.

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

Ok, então por que 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 GETredirecionamento de volta para a mesma página, que parece transparente (você pode testemunhar isso com um monitor HTTP, como o HttpFox ).

Em outras palavras;

  1. Você clica UpdateouPublish
  2. Navegador envia dados para o servidor
  3. O WordPress lida com isso e, no processo, dispara save_post
  4. O WordPress envia de volta um cabeçalho de redirecionamento e sai antes que ocorra qualquer saída do navegador (incluindo seu eco) *
  5. O navegador segue o redirecionamento e carrega a página 'editar postagem'.

O redirecionamento pode parecer desnecessário (já que você pode acessar POSTa mesma página), mas faz parte de uma técnica conhecida como Post / Redirect / Get para evitar envios de formulários duplicados .

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

* Não é estritamente verdadeiro, seu eco ocorrerá antes do envio do cabeçalho de redirecionamento, mas o navegador o descartará ou as coisas acontecem tão rapidamente que nunca são processadas.

TheDeadMedic
fonte
Excepcional. Obrigado por uma resposta tão completa e detalhada! No interesse de aprender mais, como você conheceu esse conhecimento em primeiro lugar?
Tom Auger
Com a mesma frustração que você estava enfrentando;) Adquira um bom IDE (eu uso o phpDesigner) e apenas mergulhe nos arquivos de administrador relevantes.
TheDeadMedic
1
Bem no irmão. Obrigado por estar lá com sua experiência!
Tom Auger
Informação impressionante. Eu estava enlouquecendo porque no meu servidor local parecia funcionar "ok", mas não no meu servidor de produção ... parece que no meu servidor local não estava aplicando a técnica post / redirect / get corretamente porque não estava enviando o cabeçalho de redirecionamento (não sei por que).
O WebMacheter