Comment utiliser le crochet de filtre 'post_updated_messages' en cohérence avec le crochet d'action 'save_post'
2 réponses
- votes
-
- 2012-07-20
<₹Updated:
Tout d'abord,vous devrez renvoyer une valeurbooléenne sur votreméthode denotifications afin quenouspuissions définir demanièrefiable unmarqueurpour laméthode demessage. Ensuite,vous devrez définir un élément detableau $ _POST à transmettre aufiltre de redirection.
public function save_post($post_id){ //Add a $_POST key if you syndicated successfully if($this->send_group_notifications()) //return true from your notification method $_POST['syndicated'] = true; }
Lefiltre suivantfonctionne àpartir de votrefichierfunctions.php . Jene pouvaispas lefairefonctionner correctement àpartir d'unfichier deplugin. Fondamentalement,ce qui sepasseici,c'est quenous détectons l'élément detableau $ _POST que vous avez défini dans l'action save_postet voyons sinous ajoutons une variable de chaîne de requête à la redirection.
add_filter('redirect_post_location', 'update_post_redirect'); function update_post_redirect($location){ $syndicated = isset($_POST['syndicated']) ? $_POST['syndicated'] : 0; if($syndicated == true) $location .= '&syndicated=1'; return $location; }
Enfin,nous reniflons la variable $ _GET afin de déterminer si unmessage doit être affiché.
public function message($messages){ $syndicated = isset($_GET['syndicated']); if($syndicated) //Do something with the messages array here. return $messages; }
Consultez cet articlepour unbelexemple d'utilisation de cefiltre: Définir desmessagespersonnaliséspour lamise àjour/l'enregistrement desmessages
J'espère que cela vous aidera!
Updated:
First, you will need to return a bool value on your notifications method so we can reliably set a marker for the message method. Then, you will need to set a $_POST array element to pass on to the redirection filter.
public function save_post($post_id){ //Add a $_POST key if you syndicated successfully if($this->send_group_notifications()) //return true from your notification method $_POST['syndicated'] = true; }
The following filter works from your functions.php file. I couldn't get it to work properly from a plugin file. Basically, what's happening here is we sniff out the $_POST array element you set in the save_post action and see if we add a query string variable to the redirect.
add_filter('redirect_post_location', 'update_post_redirect'); function update_post_redirect($location){ $syndicated = isset($_POST['syndicated']) ? $_POST['syndicated'] : 0; if($syndicated == true) $location .= '&syndicated=1'; return $location; }
Then finally, we sniff out the $_GET variable so we can determine if a message needs to be displayed.
public function message($messages){ $syndicated = isset($_GET['syndicated']); if($syndicated) //Do something with the messages array here. return $messages; }
Check out this post for a nice example of how to use this filter: Set custom messages for post update/save
Hope this helps you out!
-
Il semble qu'il devrait y avoir une solutionplus simple que l'idée que vousproposez.Quelque chose quine nécessitepeut-êtrepas l'utilisation detransitoires?It seems there should be an easier solution than your proposed idea. Something that maybe doesn't require using transients?
- 0
- 2012-07-21
- Michael Ecklund
-
@MichaelEcklund Après quelquestests difficileset frustrants.J'aifaitfonctionner cela sans ajouter deglobaux ou detransitoires.Découvrezma dernièremodification.@MichaelEcklund After some digging and frustrating testing. I got this to work without adding globals or transients. Check out my latest edit.
- 0
- 2012-07-22
- Brian Fegter
-
Ne semblepasfonctionner?Peut-être queje fais quelque chose demal.Pourriez-vous référencer vosmodifications afin qu'elles soient étroitement liées à l'exemple de code quej'aifourni?Vouspouvezmodifier votre réponse ou un lien verspastebin.Does not appear to be working? Maybe I'm doing something wrong. Could you reference your changes so that it's intertwined with the sample code I have provided? You can edit your answer or link to pastebin.
- 0
- 2012-07-23
- Michael Ecklund
-
@MichaelEcklund Renvoyez-vous une valeurbooléenne àpartir de votreméthode send_group_notificatios?@MichaelEcklund Are you returning a bool value from your send_group_notificatios method?
- 0
- 2012-07-23
- Brian Fegter
-
Non. Ilexécutejuste quelques autresméthodes.Un quigère les SMS,un autrepour le courrier électroniqueet un dernierpour lamessagerieinstantanée.Ilsne rendent rien.No. It just executes a few other methods. One that handles SMS, another for email and one final one for IM. They don't return anything.
- 0
- 2012-07-23
- Michael Ecklund
-
@BrianFegter - J'aiessayé demodifier votre réponsemais c'étaittroppeu à changer ... $ _GET ['syndicated] devrait être $ _GET [' syndicated ']et $ synicated devrait $ syndicated@BrianFegter - I tried to edit your answer but it was to little to change... $_GET['syndicated] should be $_GET['syndicated'] and $synicated should $syndicated
- 0
- 2013-10-10
- bestprogrammerintheworld
-
@bestprogrammerintheworld Mercipour letuyau.Édité.@bestprogrammerintheworld Thanks for the tip. Edited.
- 0
- 2013-10-11
- Brian Fegter
-
@BrianFegter - de rien!:-)@BrianFegter - you're welcome! :-)
- 0
- 2013-10-11
- bestprogrammerintheworld
-
- 2015-02-25
J'ai vérifié comment ACF l'afaitet l'aiessayé à samanière,afonctionnépourmoi.
class Directory_Post_Type { public static $post_type = "directory"; public function __construct() { add_action( 'init', array( $this, 'init' ) ); add_action( 'admin_init', array( $this, 'admin_init' ) ); add_filter('post_updated_messages', array( $this, 'post_updated_messages') ); add_filter('bulk_post_updated_messages', array( $this, 'bulk_post_updated_messages'), 10, 2 ); } ......
I checked how ACF did it and tried it their way, worked for me.
class Directory_Post_Type { public static $post_type = "directory"; public function __construct() { add_action( 'init', array( $this, 'init' ) ); add_action( 'admin_init', array( $this, 'admin_init' ) ); add_filter('post_updated_messages', array( $this, 'post_updated_messages') ); add_filter('bulk_post_updated_messages', array( $this, 'bulk_post_updated_messages'), 10, 2 ); } ......
J'essaie d'envoyer desnotificationspare-mail,SMSet IM auxmembres dugroupe de ce site Web WordPress,chaquefois qu'unepage WordPress de leurgroupe d'utilisateurs a étépubliée/mise àjour.
J'aipensé que l'utilisation du crochet d'action
'save_post'
serait lameilleure solution. Cependant,j'ai rencontré desfacteursgênantsen cours de routeet jepense avoirtrouvé une solutionpoureux.L'un desfacteursennuyeux était que chaquefois que lapage étaitmise àjour,elleeffectuait l'action deuxfois. J'ai donc utilisé le correctifproposé ici et il semble avoir corrigé leproblème de double économie. Si vous avez unemeilleure solution auproblème de la double économie,je serais ravi de vousen informer.
Maintenant,leproblème auquelje suis confrontéest queje ne saispasexactement comment utiliser correctement le crochet defiltre
'post_updated_messages'
en cohérence avec le crochet d'action'save_post'
. Lorsqueje place la référence àadd_filter('post_updated_messages', array(&$this, 'message'));
dans le constructeur de classe,il affiche lemessagemis àjour quandje viensjuste d'arriver sur lemodifier l'écranet jen'aimêmepasencore cliqué sur lebouton demise àjour.Après avoirparlé à @rarst dans le chat,ilm'ainformé que lefiltre
'post_updated_messages'
était référencé comme 'lieu' et non comme 'événement' quim'a donné l'idée de déplacer la référence versadd_filter('post_updated_messages', array(&$this, 'message'));
vers$this->save_post();
.Après avoir déplacé lefiltre vers
$this->save_post();
,je ne voisplus dutout lemessagepersonnalisémis àjour affiché. Je voisjuste lemessagetypiquemis àjour. Cependant,laméthode denotification degroupe se déclenchetoujours.Oùest lemeilleurendroitpourfaire la référence dufiltre. Ou si cette situationne nécessitepas ce crochetparticulier,quel crochet doit être utiliséet où doit-il êtreplacé?
J'aimarqué cela comme lié au développement deplugins,même s'ilne s'agit que d'unfichier de classeinclus dans lefichier functions.php de cethème WordPress actifparticulier.
Voici uneidée approximative de ce quej'ai: