web-dev-qa-db-fra.com

ajouter une action uniquement après publication - pas de mise à jour

J'ai une action qui ajoute un méta-champ avec une valeur après publication. Le problème est que lorsque je mets à jour le champ méta post est réinitialisé à la valeur par défaut.

J'ai déjà essayé 'new_to_publish' au lieu de 'publish_post' mais cela ne fonctionne pas.

add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
  global $wpdb;

  if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, 'votes_count', '0');

}
}

Je ne peux toujours pas le faire fonctionner

add_action( 'transition_post_status', 'wpse120996_post_status_publish', 10, 3 );
function wpse120996_post_status_publish( $new_status, $old_status, $post_ID ) { 
    if ( $new_status == 'publish' && $old_status == 'pending' ) {
          global $wpdb;

  if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, 'votes_count', '0');
    }
}}

Si je comprends bien, chaque fois que le statut passe de l’attente à la publication, faites ce qui est à l’intérieur de si. Mais ça ne marche pas.

Dans mon site, j'ai un système de notation avec le champ méta 'votes_count' où sont stockés les votes. Lorsque j'interroge votes_count du plus élevé au plus bas, il n'affiche pas les messages sans vote. Je dois donc le renseigner avec la valeur par défaut 0 pour les inclure dans la requête. Tout fonctionne bien, mais lorsque je mets à jour les votes sont réinitialisés à 0 ... Les messages sont publiés par les utilisateurs en attente de statut que je vérifie et publie.

5
th3rion

Comme @milo l'a souligné dans le commentaire, vérifier si la méta de publication existe est le moyen le plus simple de réaliser ce que vous voulez - comme ceci:

add_action('publish_post', 'wpse120996_add_custom_field_automatically');
function wpse120996_add_custom_field_automatically($post_id) {
    global $wpdb;
    $votes_count = get_post_meta($post_id, 'votes_count', true);
    if( empty( $votes_count ) && ! wp_is_post_revision( $post_id ) ) {
        update_post_meta($post_id, 'votes_count', '0');
    }
}




→ À la création/publier pas sur les mises à jour

Je garde ça, parce que ça fait l'affaire sur publier et non sur mise à jour. Mais auto-draftpublish ne fonctionne que lors de la première publication d'un article et uniquement si un article est publié directement. Il peut être nécessaire de couvrir davantage de cas, par exemple draftpublish ou pendingpublish.

Tu pourrais essayer:

//it's specific because you specify the hook like this {$old_status}_to_{$new_status}
add_action( 'auto-draft_to_publish', 'wpse120996_specific_post_status_transition' );
function wpse120996_specific_post_status_transition() { 
        //your code
}

au lieu d'utiliser new_to_publish.

→ Consultez Transitions post-statut pour plus d'informations.

Ou vous pouvez utiliser le hook générique transition_post_status comme ceci:

//it's generic because you specify post statuses inside the function not via the hook
add_action( 'transition_post_status', 'wpse120996_generic_post_status_transition', 10, 3 );
function wpse120996_generic_post_status_transition( $new_status, $old_status, $post ) { 
    if ( $new_status == 'publish' && $old_status == 'auto-draft' ) {
        //your code
    }
}


Une autre méthode intéressante faisant sur publier ou pour être exact en premier creation et non sur les mises à jour se déroulerait comme indiqué ci-dessous. J'ai opté pour l'utilisation du hook save_post, mais cela pourrait aussi être fait avec le hook publish_post.

add_action('save_post', 'wpse120996_on_creation_not_update');
function wpse120996_on_creation_not_update($post_id) {
    //get_post( $post_id ) == null checks if the post is not yet in the database
    if( get_post( $post_id ) == null ) {
        //your code
    }
}
2
Nicolai

Étonnamment cela fonctionne. Peut-être que je ne suis pas aussi stupide que je pensais. Merci à vous deux pour l'aide.

add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {

global $wpdb;

$meta_count = get_post_meta($post_ID, "votes_count", true);
if($meta_count == '') {
if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, 'votes_count', '0');

}
}

}
1
th3rion

Cela devrait fonctionner mieux:

add_action( 'publish_post' , 'my_func' , 10 , 2 );
function my_func( $ID , $post )
{
  if ( $post->post_date != $post->post_modified )
  {
    //THIS IS AN UPDATE
  }
  else
  {
    //POST JUST GOT PUBLISHED
  }
}
1