¿Es posible dentro de la acción save_post determinar si se está creando una nueva publicación o si se está actualizando una publicación existente?
save-post
wp-update-post
hereswhatidid
fuente
fuente
Respuestas:
Desde WordPress versión 3.7. - IIRC - el
save_post
gancho - más información sobre el gancho y su uso en Code Reference:save_post
y Codex:save_post
- tiene un tercer parámetro$update
que puede usarse para determinar exactamente eso.Nota:
$update
no siempre es asítrue
: puede verlo y probarlo usted mismo con el siguiente código. Sin embargo, no está bien documentado, posiblemente lejos de tener un nombre óptimo y, por lo tanto, crea expectativas engañosas. El siguiente código se puede usar para algunas depuraciones, juegue con cuándo interceptar la ejecución del código, porque de lo contrario no verá la información / mensajes. Creo que el culpable del comportamiento engañoso es el manejo de revisiones y guardados automáticos, que podrían desactivarse, pero no lo recomiendo y no lo he probado. No estoy seguro de si esto justifica un ticket de Trac , así que no abrí uno, si lo cree, siga el enlace y hágalo usted mismo. Aparte de eso, como se indica en los comentarios, si tiene un problema específico, publique una nueva pregunta.fuente
$update
parámetro SIEMPRE es verdadero incluso cuando se trata de una nueva publicación. Entonces este parámetro es inútil. No estoy seguro de si alguna vez funcionó, pero de seguro no funciona de la manera que está documentada en la última versión de WordPress 4.8.wp_publish_post
, entonces sí. Pero eso no es cierto para su uso enwp_insert_post
. He escrito una función de depuración, la agrego a la respuesta.save_post
gancho tiene un tercer parámetro que siempre se establece en VERDADERO, por lo que no estoy seguro de qué tiene que ver con otros ganchos, sin hablar de otros ganchos. Estoy hablando del gancho en tu respuesta. Esto es incorrecto.wp_insert_post()
,wp_publish_post()
. Este último es solo publicaciones futuras,$update
está configurado para ser siempretrue
. De lo contrario, en lo que respectawp_insert_post()
,$update
no es siempretrue
.La forma en que realizo esta verificación (dentro de una función enganchada) es comparar la fecha de publicación y la fecha de modificación (en GMT para la estandarización)
Esto funciona porque incluso en la creación, la publicación tiene una fecha 'modificada' adjunta, que es exactamente la misma que la fecha 'creada', pero permitimos una variación de 1 segundo en cualquier caso en caso de que un segundo marque durante la creación de el cargo.
fuente
post_date_gmt
es2019-03-12 01:31:30
y elpost_modified_gmt
es2019-03-12 01:31:31
. :(Terminé simplemente comprobando la existencia de un valor personalizado antes de configurarlo. De esa manera, si se trata de una publicación recién creada, el valor personalizado aún no existiría.
fuente
Ejemplo de respuesta de ialocina con paremeter "update":
fuente
if($update)
o mantener el nuevo bloque primero pero usandoif( ! $update )
. Este último llevará a OP a una mejor práctica y es preferible a su método por los estándares de codificación de WordPress en casos como el operador ternarioPuede usar el enlace de acción pre_post_update para el código de actualización y save_post para el nuevo código postal. Funciona antes de que se actualice una publicación.
fuente
save_post
gancho se disparó tanto cuando se crea un poste y actualiza (después de WordPress se ha guardado en la base de datos).pre_post_update
se activa cuando se actualiza una publicación, pero antes de que se actualice, esto puede ser importante.Como Darshan Thanki insinuó (y Stephen Harris dio más detalles), puede utilizarlo
pre_post_update
para su ventaja.La razón por la que usé globals es porque
function is_new_post() use ( &$new_post )
no es válido en PHP (impactante ...), por lo que incorporar esa variable en el alcance de la función no funciona, de ahí el global.Tenga en cuenta que esto realmente solo se puede usar de manera confiable dentro / después del
save_post
evento (que generalmente es suficiente, al menos para lo que estamos haciendo con él).fuente
Cuando se activa save_post, toda la información sobre esa publicación ya está disponible, por lo que, en teoría, podría usar
Sin embargo, esto no ha sido probado. =)
fuente
save_post
la publicación en sí, ya se habría guardado en la base de datos, porget_posts
lo que devolvería la publicación actual.Otro enfoque que utiliza una función incorporada y no implicaría ninguna adición a la base de datos
get_post_status()
.Sin embargo, tenga en cuenta que es posible que no sea apropiado si luego planea volver a establecer el estado en "borrador"; sus instrucciones se repetirán la próxima vez que actualice la publicación. Dependiendo del contexto, es posible que desee considerar las diversas cadenas que puede devolver
get_post_status()
para crear un escenario más apropiado.Ver Codex para get_post_status () y estado de publicación
fuente
save_post()
se ejecuta por primera vez, pero durante esa ejecuciónget_post_status()
ya devuelve 'publicar' y no 'borrador', aunque solo esté en proceso de publicación.