web-dev-qa-db-fra.com

Comment utiliser le hook de filtre 'post_updated_messages' en cohérence avec l'action hook 'save_post'

J'essaie d'envoyer des notifications par courrier électronique, SMS et par messagerie instantanée aux membres du groupe de ce site Web WordPress, chaque fois qu'une page WordPress de leur groupe d'utilisateurs a été publiée/mise à jour.

J'ai pensé que l'utilisation du crochet d'action 'save_post' serait la meilleure solution. Cependant, j'ai rencontré des facteurs agaçants en cours de route et je pense avoir trouvé une solution.

L'un des facteurs gênants était que chaque fois que la page était mise à jour, l'action était exécutée deux fois. J'ai donc utilisé le correctif proposé ici et il semble avoir corrigé le problème de la double sauvegarde. Si vous avez une meilleure solution au problème de la double économie, je serais heureux de lire à ce sujet.

Maintenant, le problème auquel je suis confronté est que je ne sais pas exactement comment utiliser correctement le crochet de filtre 'post_updated_messages' en cohérence avec le crochet d’action 'save_post'. Lorsque je place la référence à add_filter('post_updated_messages', array(&$this, 'message')); dans le constructeur de la classe, le message mis à jour s'affiche lorsque je viens tout juste d'arriver sur l'écran d'édition et que je n'ai même pas encore cliqué sur le bouton de mise à jour.

Après avoir discuté avec @rarst en chat, il m'a informé que le filtre 'post_updated_messages' était référencé comme 'place' et non comme 'événement' , ce qui m'a donné l'idée de déplacer la référence à add_filter('post_updated_messages', array(&$this, 'message'));. à $this->save_post();.

Après avoir déplacé le filtre sur $this->save_post();, je ne vois plus du tout le message personnalisé mis à jour. Je viens de voir le message post typique mis à jour. Toutefois, la méthode de notification de groupe est toujours activée.

Où est le meilleur endroit pour faire la référence du filtre. Ou si cette situation n'exige pas ce crochet particulier, quel crochet faut-il utiliser et où doit-il être placé?

Je l'ai étiquetée comme étant liée au développement de plug-in, même s'il ne s'agit que d'un fichier de classe inclus dans le fichier functions.php de ce thème WordPress actif particulier.

Voici une idée approximative de ce que j'ai:

<?php
if(!class_exists('tester_class')){
    class tester_class{
        /**
         * Initiate!
         *
         * @return void
         **/
        public function __construct() {
            add_action('save_post', array(&$this, 'save_post'));
        }

        /**
         * Display update message
         * 
         * Outputs a message using post_updated_messages, after the WP save_post action
         *
         * @return void
         **/
        public function message(){
            _e('<div class="updated"><p><strong>Post updated &amp; Notified all group members!</strong></p></div>');
        }

        /**
         * Hooks the WP save_post action
         * 
         * Perform class call after post is saved.
         *
         * @return void
         **/
        public function save_post(){
            global $flag;
            if($flag == 0){
                $this->send_group_notifications();
                add_filter('post_updated_messages', array(&$this, 'message'));
            }
            $flag = 1;
        }

        /**
         * Notifies group members
         * 
         * Sends email, SMS, and IM notifications to all group members.
         *
         * @return void
         **/
        public function send_group_notifications(){
            // example...
        }   

    }// EoF tester_class class

    // Initiate tester_class class
    $tester_class = new tester_class();

}// EoF tester_class class_exists
?>
2
Michael Ecklund

Mis à jour:

Tout d'abord, vous devrez renvoyer une valeur booléenne sur votre méthode de notification afin que nous puissions définir de manière fiable un marqueur pour la méthode de message. Ensuite, vous devrez définir un élément de tableau $ _POST à ​​transmettre au filtre 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;
}

Le filtre suivant fonctionneà partir de votre fichier functions.php. Je ne pouvais pas le faire fonctionner correctement à partir d'un fichier de plugin. En gros, ce qui se passe ici, c’est que nous recherchons l’élément de tableau $ _POST que vous avez défini dans l’action save_post et si nous 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 détectons la variable $ _GET afin de déterminer si un message doit être affiché.

public function message($messages){
    $syndicated = isset($_GET['syndicated']);
    if($syndicated)
         //Do something with the messages array here.
    return $messages;
}

Découvrez cet article pour un exemple intéressant d'utilisation de ce filtre: Définir des messages personnalisés pour la mise à jour/sauvegarde

J'espère que cela vous aide!

6
Brian Fegter

J'ai vérifié comment ACF l'avait fait et essayé à sa manière, a travaillé pour moi.

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

  ......
0
Robb