web-dev-qa-db-ja.com

アクションフック 'save_post'と整合してフィルターフック 'post_updated_messages'を使用する方法

ユーザーグループのWordPressページが公開/更新されたときはいつでも、私はこのWordPressウェブサイトのグループメンバーにEメール、SMS、およびIM通知を送信しようとしています。

私はアクションフック'save_post'を使うのが最善の解決策だろうと考えました。しかし、私はその過程でいくつかの厄介な要因に遭遇し、そして私はそれらの修正を見つけたと信じています。

厄介な要因の1つは、ページが更新されるたびに2回アクションが実行されることでした。それで私はここで提案された修正 を使いました そして二重節約の問題を修正したようです。あなたが二重節約問題へのより良い解決策を持っているならば、私はそれについて読むことがうれしいでしょう。

今、私が直面している問題は、アクションフック'post_updated_messages'と一貫してフィルターフック'save_post'を正しく使う方法を正確には知らないということです。クラスコンストラクターにadd_filter('post_updated_messages', array(&$this, 'message'));への参照を入れると、編集画面に到着したばかりで更新ボタンをクリックしていないときに更新されたメッセージが表示されます。

チャットで@rarstと話した後、彼は'post_updated_messages'フィルタが 'イベント'ではなく 'place'として参照されていることを私に知らせました参照をadd_filter('post_updated_messages', array(&$this, 'message'));$this->save_post();に移動するというアイデア。

フィルタを$this->save_post();に移動した後、今度はカスタム更新メッセージがまったく表示されません。典型的な投稿更新メッセージが表示されます。ただし、グループ通知方法は依然として有効です。

フィルタを参照するのに最適な場所はどこですか。それとも、この状況でこのフックが不要な場合は、どのフックを使用すればよいでしょうか。また、どこに配置すればよいでしょうか。

この特定のアクティブなWordPressテーマのfunctions.phpファイルに含まれるクラスファイルにすぎませんが、私はこれをプラグイン開発に関連するものとしてタグ付けしました。

これが私が持っているものの大まかなアイデアです:

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

更新しました:

最初に、あなたはあなたの通知メソッドにbool値を返す必要があるでしょう。そうすれば私たちは確実にメッセージメソッドのためのマーカーを設定することができます。次に、リダイレクトフィルタに渡すための$ _POST配列要素を設定する必要があります。

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

次のフィルタはあなたのfunctions.phpファイルから _で動作します。プラグインファイルから正しく動作させることができませんでした。基本的に、ここで起こっているのは、save_postアクションで設定した$ _POST配列要素を探し出して、リダイレクトにクエリ文字列変数を追加するかどうかを確認することです。

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

最後に、$ _GET変数を探し出して、メッセージを表示する必要があるかどうかを判断します。

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

このフィルタの使用方法の良い例については、この投稿をチェックしてください。 投稿の更新/保存用にカスタムメッセージを設定する

これがあなたを助けてくれることを願っています!

6
Brian Fegter

私はACFがそれをどのようにして行ったかをチェックし、それを彼らのやり方で試してみました、私のために働きました。

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