Verifique se há atualização versus nova postagem na ação save_post

19

É possível, dentro da ação save_post, determinar se uma nova postagem está sendo criada ou uma postagem existente está sendo atualizada?

    
por hereswhatidid 11.04.2012 / 21:43

8 respostas

6

Acabei de verificar a existência de um valor personalizado antes de configurá-lo. Dessa forma, se for uma postagem recém-criada, o valor personalizado ainda não existiria.

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

Desde o WordPress versão 3.7. - IIRC - o save_post hook - mais informações sobre o anzol e seu uso em Referência de código: save_post e Codex: save_post - tem um terceiro parâmetro $update que pode ser usado para determinar exatamente isso.

  

@param int $ post_ID ID do post.
  @param WP_Post $ post Post object.
  @param bool $ update Se esta é uma postagem existente sendo atualizada ou não.

    
por Nicolai 30.04.2015 / 23:13
10

A maneira que eu executo esta verificação (dentro de uma função conectada) é comparar a data de postagem e a data de modificação (em GMT para padronização)

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' );

Isso funciona porque, mesmo na criação, o post tem uma data 'modificada' anexada a ele, que é exatamente igual à data 'criada'.

    
por James Cushing 10.02.2015 / 14:51
4

Exemplo de resposta ialocin com paremeter "update":

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

Você pode usar o gancho de ação pre_post_update para o código de atualização e save_post para o novo código postal. Funciona antes de uma publicação ser atualizada.

    
por Darshan Thanki 06.08.2012 / 14:08
1

Como Darshan Thanki sugeriu (e Stephen Harris ainda mais elaborado), você pode usar pre_post_update a seu 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;
}

A razão pela qual eu usei globals é porque function is_new_post() use ( &$new_post ) não é válido no PHP (chocante ...), então puxar essa variável para o escopo da função não funciona - daí o global.

Note que isso só pode realmente ser usado com segurança dentro / após o evento save_post (que geralmente é suficiente, pelo menos para o que estamos fazendo com ele).

    
por Qix 06.01.2015 / 21:49
0

Quando save_post é acionado, todas as informações sobre esse post já estão disponíveis, então, em teoria, você poderia usar

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');

isto não foi testado, no entanto. =)

    
por moraleida 12.04.2012 / 06:27
0

Outra abordagem que usa uma função interna e nenhuma adição ao banco de dados envolveria get_post_status() .

$post_status = get_post_status();
if ( $post_status != 'draft' ) {
    //draft
} else { 
    //not a draft: can be published, pending, etc. 
}

Observe, no entanto, que talvez não seja apropriado se você planeja definir o status novamente como "rascunho" - suas instruções serão repetidas na próxima vez que você atualizar a postagem. Dependendo do contexto, você pode considerar as várias cadeias que podem ser retornadas por get_post_status() para criar um cenário mais apropriado.

Veja o Codex para get_post_status () e Postar status

  

Valores possíveis são:

     
  • 'publicar' - Uma postagem ou página publicada
  •   
  • 'pendente' - a postagem está com revisão pendente
  •   
  • 'rascunho' - uma postagem no status de rascunho
  •   
  • 'auto-draft' - uma postagem recém-criada, sem conteúdo
  •   
  • 'futuro' - uma postagem para publicar no futuro
  •   
  • 'privado' - não visível para usuários que não estão conectados
  •   
  • 'herdar' - uma revisão. veja get_children.
  •   
  • 'lixo' - a postagem está no lixo. adicionado com a versão 2.9.
  •   
    
por John112 12.12.2014 / 03:15