¿Por qué se activa la acción save_post al crear una nueva publicación?

31

Me sorprende el hecho de que mi función que he agregado a la save_postacción se activa cuando hago clic en el enlace "Nueva publicación" en el Panel de administración. Nota: esto es antes de presionar Saveo Update, y se dispara inmediatamente, no después de un tiempo transcurrido o una actualización automática.

Por otro lado, cuando el entonces escribo en algo y pulse el Publisho Updateo Save Draftbotones, que la orden echo he puesto en mi gestor de acción no hace eco a cabo, por lo que parece que la acción no está disparando en cualquier otro momento. Esto puede no estar relacionado.

Aquí está mi código:

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

Este SÍ se repite (en la parte superior de la página) cuando presiono el enlace "Nueva publicación" pero NO se repite cuando escribo algo y luego presiono Updateo Publisho Save Draft. Esto parece contradecir la documentación sobre la save_postacción y la wp_insert_post()función.

¿Alguien puede aclarar esto para mí?

Tom Auger
fuente
¡¡¡Increíble!!! Me encuentro con la misma situación al guardar campos de metabox personalizados. alguna idea de lo que puedo usar?
Prasath Nadarajah

Respuestas:

39

Cuando haces clic en 'Nueva publicación', simplemente estás cargando la página wp-admin/post-new.php.

De este modo, WordPress siempre va a crear un nuevo puesto (un 'Proyecto de Auto') para asegurar todas las demás características (tales como archivos de medios de comunicación) y el trabajo plugins como normal, incluso antes de que en realidad guardar un borrador o publicar el mensaje.

Y esto, a su vez, desencadena save_post. De ahí tu eco.

Bien, entonces ¿por qué no obtengo un eco cuando actualizo o publico?

Entre el guardado y la carga de la página siguiente, WordPress en realidad está enviando una GETredirección a la misma página, que parece transparente (puede presenciar esto con un monitor HTTP, como HttpFox ).

En otras palabras;

  1. Haces clic UpdateoPublish
  2. El navegador envía datos al servidor
  3. WordPress lo maneja, y en el proceso se dispara save_post
  4. WordPress devuelve un encabezado de redireccionamiento y sale antes de que se produzca cualquier salida del navegador (incluido su eco) *
  5. El navegador sigue la redirección y carga la página 'editar publicación'.

La redirección puede parecer innecesaria (ya que podría dirigirse POSTa la misma página), pero es parte de una técnica conocida como Post / Redirect / Get para evitar envíos de formularios duplicados .

Si está intentando imprimir mensajes personalizados basados ​​en el resultado de una función conectada save_post, consulte estas preguntas / respuestas .

* No es estrictamente cierto, su eco de hecho ocurrirá antes de que se envíe el encabezado de redireccionamiento, pero el navegador lo descartará o las cosas sucederán tan rápido que nunca se procesará.

TheDeadMedic
fuente
Excepcional. ¡Gracias por una respuesta tan completa y detallada! En el interés de aprender más, ¿cómo se encontró con este conocimiento en primer lugar?
Tom Auger
A través de la misma frustración que estaba experimentando;) Obtenga un buen IDE (yo uso phpDesigner) y simplemente profundice en los archivos administrativos relevantes.
TheDeadMedic
1
Justo en hermano. ¡Gracias por estar allí con tu experiencia!
Tom Auger
Impresionante pieza de información. Me estaba volviendo loco porque en mi servidor local parecía funcionar "bien", pero no en mi servidor de producción ... parece que en mi servidor local no estaba aplicando la técnica de publicación / redirección / obtención correctamente porque no estaba enviando el encabezado de redireccionamiento (aunque no sé por qué).
The WebMacheter