quelle est la bonne façon de se connecter lors de la mise à jour du message


19

j'essaye de crocheter quand le post est mis à jour mais tout le crochet j'essaye jamais exécuté sauf updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

J'ai essayé cela, add_action('save_post', 'my_function');mais aucun identifiant n'a été renvoyé, ou peut-être que ce message a déjà un écho mais ne s'affiche jamais en raison de l'en-tête de redirection envoyé.


2
vous avez un espace après save_post, est-ce une faute de frappe ici, ou était-ce dans votre code d'origine? activez également le débogage pendant le développement.
Milo

@Milo désolé faute de frappe, mais pas dans le code d'origine
rusly

si tel est le cas, vous devriez voir votre sortie dans le coin supérieur gauche de l'écran lorsque vous créez un nouveau message. l'enregistrement d'une publication existante se produit avant une redirection, vous ne verrez donc rien sauf si le débogage est activé.
Milo

Réponses:


55

Lorsqu'un article est mis à jour, certains hooks sont déclenchés:

  • 'pre_post_update'est une action déclenchée juste avant la mise à jour de la publication, l'argument passé est 2: $post_IDet $datac'est un tableau de toutes les autres colonnes de la base de données de la table de publication
  • 'transition_post_status'est un hook déclenché lors de la mise à jour et passe 3 arguments: $ new_post_status $old_post_statuset $post(object).
  • Ensuite, il y a 2 autres crochets de transition tirés, mais ils sont nommés de manière dynamique, cela signifie que l'action effective déclenchée dépend de l'ancien et du nouveau statut du post. "{$old_status}_to_{$new_status}"et "{$new_status}_{$post->post_type}". Passez d'abord le seul objet post en argument, le second passez l'id post et l'objet post. Trouvez la documentation ici .
  • 'edit_post'qui passent 2 arguments: $post_IDet $post(objet)
  • 'post_updated'qui passe de 3 arguments: $post_ID, $post_after(object poste après la mise à jour), $post_before(objet poste avant la mise à jour)
  • Un autre crochet dynamique: "save_post_{$post->post_type}"qui dépend du type poste, par exemple pour les postes standards est 'save_post_post'et pour les pages est 'save_post_page', ce passage 3 arguments crochet: $post_ID, $post(objet) et $updatequi est un booléen qui est vrai lorsque vous (vrai ou faux) d' effectuer une mise à jour, en En fait, ce crochet est également déclenché lorsqu'un message est enregistré pour la première fois.
  • ' save_post' qui est déclenché à la fois lors de la mise à jour et lors de la première sauvegarde, et transmet les 3 mêmes arguments du hook précédent.
  • ' save_post_{$post_type}' qui est déclenché à la fois lors de la mise à jour et lors de la première sauvegarde, et transmet les mêmes 2 premiers arguments du hook précédent.
  • Enfin vous avez ' wp_insert_post' , qui est déclenché à la fois lors de la mise à jour et lors de la première sauvegarde, et passez les 3 mêmes arguments des 2 hooks précédents.

Ces hooks sont tirés à chaque fois qu'une publication est mise à jour, à la fois via les pages d'administration dans le backend et via une mise à jour "manuelle" à l'aide des fonctions wp_update_postou wp_insert_post.

Lorsque le message est mis à jour à l'aide des pages d'administration, des hooks supplémentaires sont déclenchés, un exemple est 'update_post_redirect'ou 'post_updated_messages'. (Voir ceci et ces réponses WPSE pour des exemples d'utilisation).

Notez que si vous voulez utiliser un argument hooks, ce n'est pas le premier, vous devez le déclarer explicitement dans l' add_actionappel.

Par exemple , si vous voulez utiliser l' '$update'argument (qui est le 3e) du 'save_post'crochet , vous devez ajouter 3comme $accepted_argsparam sur add_action( voir docs ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

Dernière remarque concernant le timing : vous devez être sûr qu'il add_actionest appelé avant le déclenchement de l'action, sinon il ne fera rien.

Par exemple ce code:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

ne fera rien, car l'action est ajoutée après le tir du crochet. Voici simple à reconnaître, dans le code du monde réel n'est pas toujours le cas.


Je pense que le crochet d'action 'save_post' est également déclenché lorsque vous appuyez sur Ajouter nouveau (message, page, CPT) dans le tableau de bord. Pour vous voir, il suffit d'exécuter ce code. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );Pourquoi l'action «save_post» s'exécute-t-elle sur Ajouter nouveau au lieu de Publier? Pour faire le post automatique, je suppose.
lowtechsun

@lowtechsun Comme il est dit dans le A, les hooks sont tirés à chaque mise à jour d'un post, c'est-à-dire sauvegardés dans la base de données. Lorsque vous appuyez sur "Ajouter un nouveau", près du chargement de la page, WP crée un brouillon de poste stocké dans la base de données afin qu'il soit renvoyé.
gmazzap

Merci de revenir vers moi. Je viens de découvrir cela hier et j'ai pensé que le concept était confus. Cela signifie d'abord que j'ouvre la page pour ajouter un nouveau message. À ce stade, je pensais que je n'avais pas encore créé de poste. Ce n'est qu'une fois que je clique sur Publier que je pense que le nouveau message est créé. En allant plus loin, j'espère que WP supprimera le message de brouillon automatique si je clique sur Ajouter un nouveau, mais que je quitte la page sans appuyer sur Publier?
lowtechsun

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.