web-dev-qa-db-fra.com

Pourquoi publish_ {custom-post-type} se déclenche-t-il à la mise à jour?

J'essaie de déclencher deux actions différentes sur la publication et la mise à jour. Ni l'un ni l'autre ne devrait jamais tirer en même temps.

Le problème est que publish_pm_task est renvoyé lors de la mise à jour et que save_post n'est jamais renvoyé? Vous voyez quelque chose qui ne va pas avec ça?

<?php
// Updated task notification
add_action( 'save_post', 'pm_updated_task_notification' );

// New task notification
add_action( 'publish_pm_task', 'pm_new_task_notification' );

function pm_new_task_notification() {

    error_log('definitely a task');

}

function pm_updated_task_notification( $post_id ) {

    $slug = 'pm_task';

    /* check whether anything should be done */
    $_POST += array("{$slug}_edit_nonce" => '');
    if ($slug != $_POST['post_type']) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (!wp_verify_nonce($_POST["{$slug}_edit_nonce"], plugin_basename(__FILE__))) {
        return;
    }

    error_log('updated a task');

}
2
developdaly

Tout d’abord, vous devez comprendre que lorsque nous mettons à jour une publication, la fonction wp_update_post est appelée. Mais en raison d'un design un peu pas optimal de WP core, l'enregistrement réel est traité par la fonction wp_insert_post. Voir en trac sur ligne 3006 .

Ok, ensuite voyons ce qu’il y a dans la fonction wp_insert_post. Comme vous pouvez le constater, à la ligne 2950 , l'action save_post est appelée à chaque appel de la fonction, chaque fois qu'elle a été appelée directement ou par la fonction wp_update_post. Cela signifie qu'il ne convient pas de déterminer si post a été inséré/publié ou mis à jour.

Pour trouver une meilleure action, jetons un coup d’œil à la fonction wp_transition_post_status qui s’appelle presque juste avant l’action save_post. Voir à la ligne , ligne 2942 . Cette fonction effectue trois actions transition_post_status, {$old_status}_to_{$new_status} et {$new_status}_{$post->post_type}, à visualiser à la ligne 3273 . Nous avons ici l'action Nice transition_post_status, qui transmet les anciens et les nouveaux statuts. C'est ce dont on a besoin. Ainsi, si le nouveau statut est publish et que l'ancien statut n'est pas publish, la publication est publiée. Et si le nouveau statut est publish et que l'ancien statut est new, la publication a été insérée. Et enfin, si nouveau statut correspond à ancien statut, la publication vient d'être mise à jour.

Voici votre extrait:

add_action( 'transition_post_status', 'wpse_transition_post_status', 10, 3 );  

function wpse_transition_post_status( $new_status, $old_status, $post ) {
    if ( $new_status == 'publish' && $old_status == 'new' ) {
        // the post is inserted
    } else if ( $new_status == 'publish' && $old_status != 'publish' ) {
        // the post is published
    } else {
        // the post is updated
    }
}

P.S .: lisez le code du noyau WordPress, chaque fois que vous avez des doutes, cela vous aidera beaucoup!

7
Eugene Manuilov