it-swarm.com.de

Verwendung des Filter-Hooks 'post_updated_messages' in Übereinstimmung mit dem Aktions-Hook 'save_post'

Ich versuche, E-Mail-,SMS- und IM-Benachrichtigungen an Gruppenmitglieder dieser WordPress-Website zu senden, sobald eine WordPress-Seite in ihrer Benutzergruppe veröffentlicht/aktualisiert wurde.

Ich dachte, der Action-Hook 'save_post' wäre die beste Lösung. Auf dem Weg bin ich jedoch auf einige ärgerliche Faktoren gestoßen, und ich glaube, ich habe eine Lösung für sie gefunden.

Einer der ärgerlichen Faktoren war, dass bei jeder Aktualisierung der Seite die Aktion zweimal ausgeführt wurde. Also habe ich das vorgeschlagene Update hier verwendet und es scheint das Problem der doppelten Speicherung behoben zu haben. Wenn Sie eine bessere Lösung für das Problem der doppelten Einsparung haben, würde ich mich freuen, darüber zu lesen.

Das Problem ist, dass ich nicht genau weiß, wie ich den Filter-Hook 'post_updated_messages' in Übereinstimmung mit dem Action-Hook 'save_post' richtig verwenden soll. Wenn ich den Verweis auf add_filter('post_updated_messages', array(&$this, 'message')); in den Klassenkonstruktor lege, wird die aktualisierte Meldung angezeigt, wenn ich gerade erst auf dem Bearbeitungsbildschirm angekommen bin und noch nicht einmal auf die Schaltfläche zum Aktualisieren geklickt habe.

Nachdem er im Chat mit @rarst gesprochen hatte, informierte er mich, dass der 'post_updated_messages'-Filter als 'Ort' und nicht als 'Ereignis' bezeichnet wurde, was mir die Idee gab, den Verweis auf add_filter('post_updated_messages', array(&$this, 'message')); zu verschieben. zu $this->save_post();.

Nachdem der Filter auf $this->save_post(); verschoben wurde, wird die benutzerdefinierte aktualisierte Nachricht nicht mehr angezeigt. Ich sehe nur die typische postaktualisierte Nachricht. Die Gruppenbenachrichtigungsmethode wird jedoch weiterhin ausgelöst.

Wo kann der Filter am besten referenziert werden? Oder wenn für diese Situation kein bestimmter Haken erforderlich ist, welcher Haken sollte verwendet werden und wo sollte er platziert werden?

Ich habe dies als Plugin-Entwicklung bezeichnet, obwohl es sich nur um eine Klassendatei handelt, die in der Datei functions.php dieses speziellen aktiven WordPress-Themas enthalten ist.

Hier ist eine ungefähre Vorstellung davon, was ich habe:

<?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

Aktualisiert:

Zunächst müssen Sie einen bool-Wert für Ihre Benachrichtigungsmethode zurückgeben, damit wir zuverlässig einen Marker für die Nachrichtenmethode setzen können. Dann müssen Sie ein Array-Element $ _POST festlegen, um es an den Umleitungsfilter weiterzuleiten.

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

Der folgende Filter funktioniertaus Ihrer functions.php-Datei. Aus einer Plugin-Datei konnte ich es nicht richtig zum Laufen bringen. Im Grunde passiert hier nur, dass wir das Array-Element $ _POST ausspähen, das Sie in der Aktion save_post festgelegt haben, und prüfen, ob wir der Umleitung eine Abfragezeichenfolgenvariable hinzufügen.

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

Dann schnüffeln wir die Variable $ _GET aus, um festzustellen, ob eine Nachricht angezeigt werden muss.

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

In diesem Beitrag finden Sie ein gutes Beispiel für die Verwendung dieses Filters: Benutzerdefinierte Nachrichten für die Aktualisierung des Beitrags festlegen/speichern

Hoffe das hilft dir weiter!

6
Brian Fegter

Ich habe nachgesehen, wie ACF es gemacht hat und es auf ihre Weise versucht und für mich gearbeitet.

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