Fonction à exécuter lorsqu'un message est placé dans la corbeille.

9

Salut, y a-t-il une action qui peut être exécutée pendant qu'un article est placé dans la corbeille ... Cela ne fonctionne que deux fois pour chaque action (avant et après l'action telle qu'écrite dans le codex) et la sortie n'est affichée que lorsque le message est supprimé de la corbeille. Exemple, je veux envoyer un e-mail à l'auteur indiquant que son message a été placé dans la corbeille pour une raison quelconque et mettre à jour certains user_meta. si j'utilise

add_action('deleted_post', 'emailUser');

ou

add_action('delete_post', 'emailUser');

cela ne fonctionne que lorsque la publication est supprimée de la corbeille. . .

Mise à jour: le faire fonctionner pour les messages de corbeille en utilisant

add_action('trash_post', 'emailUser');

mais le problème de la double exécution de la fonction est toujours là. . .

Harjeet Singh
la source
1
Écrivez la solution ci-dessous et marquez-la comme réponse
Ashfame
ce n'est pas la bonne réponse car la double exécution de la fonction est toujours là ...
Harjeet Singh

Réponses:

10

Ça fera l'affaire!

add_action('trash_post','my_trash_post_function',1,1);
function my_trash_post_function($post_id){
    if(!did_action('trash_post')){
        // do stuff
    }
}

Ici, nous ajoutons la fonction, et pour empêcher le hook de s'exécuter plus d'une fois en utilisant did_action:

http://codex.wordpress.org/Function_Reference/did_action

Comme toujours, ces sortes de crochets prennent la forme {post_status}_{post_type}, donc trash_post, trash_page, trash_customposttype, publish_pageetc.

Tom J Nowell
la source
2

Cette action sera appelée une fois lorsque le message est placé dans la corbeille, puis à nouveau lorsque la corbeille est vidée.

Votre fonction pourrait vérifier la présence d'une option avec l'ID de poste dans le nom, si l'option n'est pas là, elle envoie l'e-mail puis définit l'option. Si l'option existe (par exemple, elle est appelée une deuxième fois), vous n'enverrez pas l'e-mail.

N'oubliez pas de supprimer l'option, afin que votre base de données ne se remplisse pas avec eux!

add_action( 'delete_post', 'emailUser' );

function emailUser( $postid ) {

   if ( ! get_option( 'user_emailed_' . $postid ) ) {
      // send email here
      update_option( 'user_emailed_' . $postid, 'anything' );
   } else {
      delete_option( 'user_emailed_' . $postid );
   }

}

Faites-moi savoir si cela fonctionne!

Simon Blackbourn
la source
vous pouvez utiliser l'API des transitoires au lieu des options, vous n'aurez donc pas à vous soucier de supprimer des options de la base de données codex.wordpress.org/Transients_API
Bainternet
Merci Simon qui fonctionne très bien. . . . Je ne sais pas pourquoi j'ai raté ça. . ..
Harjeet Singh
Bainternet, j'ai vu les transitoires et ils sont assez similaires à get_option dans mon cas et je reste avec get_option pour la suppression, car l'exécution dépendrait également des performances du serveur et du calcul du temps d'exécution du code avant et après la suppression de le poste pourrait devenir difficile.
Harjeet Singh
Il n'est pas nécessaire de commencer à ajouter / modifier des champs d'options ou des transitoires, à ajouter des requêtes supplémentaires. Au lieu de cela, appelez simplement did_action pour vérifier si le crochet s'est déjà déclenché.
Tom J Nowell
1
add_action('trash_post', 'trash_post_function_name');

Le crochet ci-dessus n'a pas fonctionné pour moi dans WP 4.7.5.

C'est ce qui a fonctionné pour moi

add_action('wp_trash_post', 'trash_post_function_name');
Mohamed Salem Lamiri
la source