Vérifier la mise à jour par rapport au nouveau message sur l'action save_post

19

Est-il possible, dans l'action save_post, de déterminer s'il s'agit d'un nouveau message en cours de création ou d'une mise à jour existante?

    
posée hereswhatidid 11.04.2012 - 21:43

8 réponses

6

J'ai fini par vérifier l'existence d'une valeur personnalisée avant de la définir. Ainsi, s'il s'agit d'une publication nouvellement créée, la valeur personnalisée n'existe pas encore.

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');
    
réponse donnée hereswhatidid 17.04.2012 - 23:50
16

Depuis WordPress version 3.7. - IIRC - le save_post hook - pour en savoir plus sur le hook et son utilisation à l'adresse Référence du code: save_post et Codex: save_post - a un troisième paramètre $update qui peut être utilisé pour déterminer exactement cela.

  

@param int $ post_ID Identifiant de publication.
  @param WP_Post $ post Objet post.
  @param bool $ update S'il s'agit d'une publication existante mise à jour ou non.

    
réponse donnée Nicolai 30.04.2015 - 23:13
10

La manière dont je vérifie cette fonction (au sein d’une fonction accrochée) consiste à comparer la date de publication et la date de modification (en GMT pour la normalisation)

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

Cela fonctionne car même à la création, la publication a une date "modifiée", qui est identique à la date "créée".

    
réponse donnée James Cushing 10.02.2015 - 14:51
4

Exemple de réponse en ialocine avec le paramètre "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 );
    
réponse donnée Goran Jakovljevic 01.12.2015 - 18:53
1

Vous pouvez utiliser le hook d’action pre_post_update pour le code de mise à jour et save_post pour le nouveau code postal. Cela fonctionne avant la publication d'un article.

    
réponse donnée Darshan Thanki 06.08.2012 - 14:08
1

Comme Darshan Thanki l’a laissé entendre (et Stephen Harris a précisé), vous pouvez utiliser pre_post_update à votre avantage.

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 raison pour laquelle j'ai utilisé globals est que function is_new_post() use ( &$new_post ) n'est pas valide en PHP (choquant ...), donc insérer cette variable dans l'étendue de la fonction ne fonctionne pas - d'où le principe global.

Notez que cela ne peut vraiment être utilisé de manière fiable que dans / après l'événement save_post (ce qui est généralement suffisant, du moins pour ce que nous en faisons).

    
réponse donnée Qix 06.01.2015 - 21:49
0

Lorsque save_post est déclenché, toutes les informations sur cette publication sont déjà disponibles. En théorie, vous pouvez donc utiliser

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

cela n’a pas été testé, cependant. =)

    
réponse donnée moraleida 12.04.2012 - 06:27
0

Une autre approche utilisant une fonction intégrée et aucune addition à la base de données impliquerait get_post_status() .

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

Notez toutefois que cela peut ne pas être approprié si vous envisagez de rétablir ultérieurement le statut "brouillon". Vos instructions seront répétées la prochaine fois que vous mettrez à jour le message. Selon le contexte, vous pouvez envisager les différentes chaînes pouvant être renvoyées par get_post_status() pour créer un scénario plus approprié.

Voir le Codex pour get_post_status () et État du message

  

Les valeurs possibles sont:

     
  • 'publier' - un article ou une page publié
  •   
  • 'en attente' - publication en attente de révision
  •   
  • 'brouillon' - un poste en statut brouillon
  •   
  • 'auto-draft' - un article nouvellement créé, sans contenu
  •   
  • 'future' - un article à publier à l'avenir
  •   
  • 'private' - non visible pour les utilisateurs non connectés
  •   
  • 'inherit' - une révision. voir get_children.
  •   
  • 'corbeille' - le post est à la corbeille. ajouté avec la version 2.9.
  •   
    
réponse donnée John112 12.12.2014 - 03:15

Lire d'autres questions sur les étiquettes