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