¿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?
¿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?
Terminé solo 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.
function attributes_save_postdata($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!wp_verify_nonce($_POST['_attributes_noncename'], plugin_basename(__FILE__))) return;
if ('page' == $_POST['post_type']) {
if (!current_user_can('edit_page', $post_id)) return;
} else {
if (!current_user_can('edit_post', $post_id)) return;
}
$termid = get_post_meta($post_id, '_termid', true);
if ($termid != '') {
// it's a new record
$termid = 'update';
} else {
// it's an existing record
}
update_post_meta($post_id, '_termid', $termid);
}
add_action('save_post', 'attributes_save_postdata');
Desde WordPress versión 3.7. - IIRC - el gancho save_post
- más información sobre el enganche y su uso en Referencia del código: save_post
y Codex: save_post
: tiene un tercer parámetro $update
que se puede usar para determinar eso.
@param int $ post_ID Post ID.
@param WP_Post $ post Publicar objeto.
@param bool $ update Si se trata de una publicación existente que se está actualizando o no.
La forma en que realizo esta comprobación (dentro de una función enlazada) es comparar la fecha de publicación y la fecha de modificación (en GMT para la estandarización)
function check_new_vs_update( $post_id ){
$myPost = get_post($post_id);
if( $myPost->post_modified_gmt == $myPost->post_date_gmt ){
//New Post
}else{
//Updated Post
}
}
add_action('save_post', 'check_new_vs_update' );
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'.
Ejemplo para responder a ialocin con el parámetro "actualizar":
function save_func($ID, $post,$update) {
if($update == false) {
// do something if its first time publish
} else {
// Do something if its update
}
}
add_action( 'save_post', 'save_func', 10, 3 );
Puede usar el gancho 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.
Como lo insinuó Darshan Thanki (y Stephen Harris lo explicó más detalladamente), puedes usar pre_post_update
a tu favor.
global $___new_post;
$___new_post = true;
add_action(
'pre_post_update',
function() {
global $___new_post;
$___new_post = false;
},
0
);
function is_new_post() {
global $___new_post;
return $___new_post;
}
La razón por la que usé globales es que function is_new_post() use ( &$new_post )
no es válido en PHP (impactante ...), por lo que no funciona el alcance de esa variable en el ámbito de la función, por lo tanto, el global.
Tenga en cuenta que esto solo se puede usar de manera confiable dentro / después del evento save_post
(que suele ser suficiente, al menos por lo que estamos haciendo con él).
Cuando se activa save_post, toda la información sobre esa publicación ya está disponible, por lo que en teoría podría utilizar
function f4553265_check_post() {
if (!get_posts($post_id)) {
// if this is a new post get_posts($post_id) should return null
} else {
// $post_id already exists on the database
}
}
add_action('save_post','f4553265_check_post');
esto no está probado, sin embargo. =)
Otro enfoque que utiliza una función incorporada y ninguna adición a la base de datos implicaría get_post_status()
.
$post_status = get_post_status();
if ( $post_status != 'draft' ) {
//draft
} else {
//not a draft: can be published, pending, etc.
}
Sin embargo, tenga en cuenta que puede que no sea apropiado si 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 get_post_status()
puede devolver para crear un escenario más apropiado.
Consulte Codex para get_post_status () y Estado de publicación
Los valores posibles son:
- 'publicar': una publicación o página publicada
- 'pendiente': la publicación está pendiente de revisión
- 'borrador': una publicación en estado de borrador
- 'auto-draft': una publicación recién creada, sin contenido
- 'futuro': una publicación para publicar en el futuro
- 'privado': no está visible para los usuarios que no han iniciado sesión
- 'heredar' - una revisión. ver get_children.
- 'basura' - la publicación está en el basurero. añadido con la versión 2.9.
Lea otras preguntas en las etiquetas save-post wp-update-post