如何在Coherence中使用筛选器挂钩‘POST_UPDATED_MESSAGES’和操作挂钩‘SAVE_POST’

时间:2012-07-19 作者:Michael Ecklund

每当WordPress用户组中的WordPress页面发布/更新时,我都会尝试向该WordPress网站的组成员发送电子邮件、短信和即时消息通知。

我想用动作钩\'save_post\' 是最好的解决方案。然而,我在路上遇到了一些恼人的因素,我相信我已经找到了解决办法。

其中一个恼人的因素是,每次更新页面时,它都会执行两次操作。所以我使用了建议的修复方法here 而且它似乎纠正了双重储蓄问题。如果您对双重储蓄问题有更好的解决方案,我很乐意阅读。

现在,我面临的问题是,我不知道如何正确使用过滤器挂钩\'post_updated_messages\' 与动作钩一致\'save_post\'. 当我将引用放置到add_filter(\'post_updated_messages\', array(&$this, \'message\')); 在类构造函数中,当我刚刚到达编辑屏幕,甚至还没有单击更新按钮时,它会显示更新的消息。

在与@rarst聊天后,他告诉我\'post_updated_messages\' 过滤器被引用为“位置”,而不是“事件”,这让我想到将引用移动到add_filter(\'post_updated_messages\', array(&$this, \'message\'));$this->save_post();.

将过滤器移动到$this->save_post();, 现在,我根本看不到显示的自定义更新消息。我只是看到了典型的帖子更新消息。但是,组通知方法仍会激发。

哪里是进行过滤器引用的最佳位置。或者,如果这种情况不需要这个特定的钩子,那么应该使用什么钩子,应该放在哪里?

我将其标记为与插件开发相关,尽管它只是functions.php 此特定活动WordPress主题的文件。

以下是我的大致情况:

<?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 个回复
最合适的回答,由SO网友:Brian Fegter 整理而成

Updated:

首先,您需要在notifications方法上返回一个bool值,以便我们可以可靠地为message方法设置一个标记。然后,需要设置$\\u 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;
}
以下过滤器工作from your functions.php file. 我无法从插件文件中使其正常工作。基本上,这里要做的是嗅出您在save\\u POST操作中设置的$\\u 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;
}
最后,我们嗅出$\\u GET变量,以便确定是否需要显示消息。

public function message($messages){
    $syndicated = isset($_GET[\'syndicated\']);
    if($syndicated)
         //Do something with the messages array here.
    return $messages;
}
查看这篇文章,了解如何使用此过滤器的一个很好的示例:Set custom messages for post update/save

希望这对你有帮助!

SO网友:Robb

我检查了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 );
  }

  ......

结束

相关推荐

Add_Filters()和Apply_Filter()有什么作用?

我有点困惑,为什么这不起作用-尽管必须说,我不太确定是什么apply_filters() 和add_filter 正在做,所以任何一般性的提示都会很好!我想要一个查询,在一个帖子页面上显示之前的五篇帖子。我正在发送当前帖子的日期,并希望应用一个过滤器,过滤出早于此的帖子。function sw_filter_posts_before( $where = \'\', $date) { $where .= \" AND post_date < \'\" . $date . \"