Buscar actualizaciones vs nuevas publicaciones en la acción save_post

19

¿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?

    
pregunta hereswhatidid 11.04.2012 - 21:43

8 respuestas

6

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');
    
respondido por el hereswhatidid 17.04.2012 - 23:50
16

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.

    
respondido por el Nicolai 30.04.2015 - 23:13
10

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'.

    
respondido por el James Cushing 10.02.2015 - 14:51
4

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 );
    
respondido por el Goran Jakovljevic 01.12.2015 - 18:53
1

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.

    
respondido por el Darshan Thanki 06.08.2012 - 14:08
1

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).

    
respondido por el Qix 06.01.2015 - 21:49
0

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. =)

    
respondido por el moraleida 12.04.2012 - 06:27
0

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.
  •   
    
respondido por el John112 12.12.2014 - 03:15

Lea otras preguntas en las etiquetas