web-dev-qa-db-fra.com

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

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

21
hereswhatidid

J'ai fini par vérifier l'existence d'une valeur personnalisée avant de la définir. De cette façon, s'il s'agit d'une publication nouvellement créée, la valeur personnalisée n'existerait 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');
6
hereswhatidid

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

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


Note:

$update n'est pas toujours true - vous pouvez le voir et le tester vous-même avec le code ci-dessous. Cependant, il n’est pas bien documenté, peut-être loin d’être nommé de manière optimale, et crée donc des attentes trompeuses. Le code ci-dessous peut être utilisé pour certaines opérations de débogage, indiquez quand intercepter l'exécution du code, sinon vous ne verrez pas les informations/messages. Je pense que le coupable dans le comportement trompeur est le traitement des révisions et des sauvegardes automatiques - qui pourraient être désactivés, mais je ne le recommande pas et je ne l’ai pas testé. Vous ne savez pas si cela justifie un ticket Trac , alors je ne vous en ai pas ouvert un, si vous le pensez bien, suivez le lien et faites le vous-même. En dehors de cela, comme indiqué dans les commentaires, si vous avez un problème spécifique, posez une nouvelle question.

add_action( 'save_post', 'debug_save_post_update', 10, 3 );
function debug_save_post_update( $ID, $post, $update ) {

  echo '<pre>';
  print_r( $post ); echo '<br>';
  echo '$update == ';
  echo $update ? 'true' : 'false';

  //conditions
  if( ! $update && $post->post_status == "auto-draft" ) {
    // applies to new post
    echo ' && $post->post_status == "auto-draft"';
    //die();
  } else if ( ! $update ) {
    // applies basically to the (auto saved) revision 
    //die();
  } else {
    // applies to updating a published post
    // when there is a revision, which is normally the case, 
    // standard behavior of WordPress, then it is considered 
    // an update, which is where the confusion sets in
    // there are other methods, like checking time or post status
    // depending on your use case it might be more appropriate 
    // to use one of those alternatives 
    //die();
  }

  echo '</pre>';
  //die();
}
15
Nicolai

La façon dont je réalise cette vérification (au sein d’une fonction accrochée) consiste à comparer la date de publication et la date de modification (en GMT pour normalisation)

function check_new_vs_update( $post_id ){
    $myPost        = get_post($post_id);
    $post_created  = new DateTime( $myPost->post_date_gmt );
    $post_modified = new DateTime( $myPost->post_modified_gmt );

    if( abs( $post_created->diff( $post_modified )->s ) <= 1 ){
        // New post
    }else{
        // Updated post
    }
}
add_action('save_post', 'check_new_vs_update' );

Cela fonctionne car même lors de la création, la publication a une date "modifiée", exactement la même que la date "créée", mais nous autorisons un écart de 1 seconde dans les deux cas dans le cas où une seconde défilerait lors de la création de la poste.

11
James Cushing

Exemple pour répondre à ialocin 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 );
4
Goran Jakovljevic

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 dans PHP (choquant ...), donc insérer cette variable dans l'étendue de la fonction ne fonctionne pas - d'où le 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 faisons avec).

1
Qix

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 qu'un message soit mis à jour.

1
Darshan Thanki

Une autre approche utilisant une fonction intégrée et aucun ajout à 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 souhaiterez peut-être examiner les différentes chaînes pouvant être renvoyées par get_post_status() pour créer un scénario plus approprié.

Voir 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' - une publication nouvellement créée, sans contenu
  • 'future' - un post à publier dans le futur
  • 'private' - non visible pour les utilisateurs qui ne sont pas connectés
  • 'hériter' - une révision. voir get_children.
  • 'poubelle' - le message est à la poubelle. ajouté avec la version 2.9.
0
John112

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

ce n'est pas testé, cependant. =)

0
moraleida