Intereting Posts

Как использовать фильтр hook 'post_updated_messages' в связности с действием hook 'save_post'

Я пытаюсь отправить уведомления по электронной почте, SMS и IM для группировки членов этого веб-сайта WordPress, когда страница WordPress в их группе пользователей была опубликована / обновлена.

Я полагал, что использование 'save_post' будет лучшим решением. Тем не менее, я столкнулся с некоторыми раздражающими факторами на пути и считаю, что нашел для них исправить.

Один из раздражающих факторов – каждый раз, когда страница обновлялась, она выполняла действие дважды. Поэтому я использовал исправление, предлагаемое здесь, и, похоже, он исправил проблему с двойным сохранением. Если у вас есть лучшее решение проблемы с двойным сбережением, я был бы рад прочитать об этом.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что я не знаю точно, как правильно использовать фильтр-фильтр 'post_updated_messages' в связности с действием hook 'save_post' . Когда я add_filter('post_updated_messages', array(&$this, 'message')); ссылку на add_filter('post_updated_messages', array(&$this, 'message')); в конструкторе класса он отображает обновленное сообщение, когда я только что появился на экране редактирования и еще не нажал кнопку обновления.

После беседы с @rarst в чате он сообщил мне, что фильтр 'post_updated_messages' был '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 ?> 

Solutions Collecting From Web of "Как использовать фильтр hook 'post_updated_messages' в связности с действием hook 'save_post'"

Обновлено:

Во-первых, вам нужно будет вернуть значение 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 . Я не мог заставить его работать правильно из файла плагина. В основном, что происходит здесь, мы вынюхиваем элемент массива $ _POST, который вы установили в действии save_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; } 

Отметьте это сообщение для хорошего примера использования этого фильтра: Установите персонализированные сообщения для публикации обновления / сохранения

Надеюсь, что это помогает вам!

Я проверил, как 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 ); } ......