Skip to:
Content

bbPress.org

Ticket #2797: 2797.09.patch

File 2797.09.patch, 25.7 KB (added by mechter, 6 years ago)

Added filters to selectively disable the async part. Reflects recent update to AsynCRONous bbPress Subscriptions (requested feature). Patched against current trunk.

  • includes/common/classes.php

     
    543543        }
    544544}
    545545endif; // class_exists check
     546
     547if ( !class_exists( 'BBP_Subscriber_Notification' ) ) :
     548/**
     549 * Send subscription notification emails via WP Cron
     550 *
     551 * @package bbPress
     552 * @subpackage Classes
     553 *
     554 * @since bbPress (r)
     555 */
     556class BBP_Subscriber_Notification {
     557        public $subject;
     558        public $message;
     559        public $headers;
     560        public $recipients;
     561
     562        protected function __construct( $recipients ) {
     563                $this->recipients = $recipients;
     564                $from = array(
     565                        'name' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ),
     566                        'address' => get_bloginfo( 'admin_email' )
     567                );
     568                $from = apply_filters( 'bbp_subscription_email_from', $from );
     569                $from_string = empty( $from['name'] ) ? $from['address'] : "{$from['name']} <{$from['address']}>";
     570                $from_string = apply_filters( 'bbp_subscription_from_email', $from_string ); // backwards compatibility
     571                $this->headers []= "From: $from_string"; // array version $headers does not require proper line ending, see wp codex on wp_mail()
     572                $this->headers = apply_filters( 'bbp_subscription_email_headers', $this->headers  );
     573                $this->headers = apply_filters( 'bbp_subscription_mail_headers', $this->headers  ); // backwards compatiobility
     574        }
     575       
     576        /**
     577         * WP Cron callback to send notification emails to subscribers
     578         */
     579        public static function send( $notification ) {
     580                do_action( 'bbp_pre_notify_subscribers' );
     581       
     582                add_action( 'phpmailer_init', array( 'BBP_Subscriber_Notification', 'set_bounce_address' ), 10, 1 );
     583       
     584                foreach ( $notification->recipients as $to ) {
     585                        $to_string = empty( $to['name'] ) ? $to['address'] : "{$to['name']} <{$to['address']}>";
     586                        wp_mail( $to_string, $notification->subject, $notification->message, $notification->headers );
     587                }
     588       
     589                remove_action( 'phpmailer_init', array( 'BBP_Subscriber_Notification', 'set_bounce_address' ), 10, 1 );
     590       
     591                do_action( 'bbp_post_notify_subscribers' );
     592        }
     593       
     594        /**
     595         * Sets PHPMailer::Sender to bounce address, configurable via filter
     596         * Invoke via 'phpmailer_init' action hook
     597         */
     598        public static function set_bounce_address( $phpmailer ) {
     599                $bounce_address = apply_filters( 'bbp_bounce_address', false );
     600                $bounce_address = apply_filters( 'bbp_get_do_not_reply_address', $bounce_address ); // backwards compatibility
     601                if ( $bounce_address ) {
     602                        $phpmailer->Sender = $bounce_address;
     603                }
     604        }
     605       
     606        /**
     607         * Initializes recipients array from array of recipient user ids
     608         */
     609        protected static function get_recipients( $user_ids ) {
     610                if ( !$user_ids ) {
     611                        return apply_filters( 'bbp_subscription_email_recipients', array() );
     612                }
     613
     614                global $wpdb;
     615                $ids_substitution = substr( str_repeat( ',%d', count( $user_ids ) ), 1 );
     616                $params = array_merge( array( "select user_email as address, display_name as name from {$wpdb->users} where ID in ($ids_substitution)" ), $user_ids );
     617                $recipients = $wpdb->get_results( call_user_func_array( array( $wpdb, 'prepare' ), $params ), ARRAY_A );
     618                if ( !is_array( $recipients ) ) {
     619                        $recipients = array();
     620                }
     621               
     622                return apply_filters( 'bbp_subscription_email_recipients', $recipients );
     623        }
     624       
     625        /**
     626         * Schedules a sending event with WP Cron
     627         */
     628        protected static function schedule_wp_cron_event( $notification ) {
     629                wp_schedule_single_event( time(), 'bbp_subscription_email_cron', array( $notification ) );
     630        }
     631}
     632/**
     633 * Forum subscription notification
     634 *
     635 * @package bbPress
     636 * @subpackage Classes
     637 *
     638 * @since bbPress (r)
     639 *
     640 * @uses BBP_Subscriber_Notification
     641 */
     642class BBP_Forum_Subscriber_Notification extends BBP_Subscriber_Notification {
     643
     644        protected function __construct( $recipients, $forum_id, $topic_id ) {
     645                parent::__construct( $recipients );
     646       
     647                // Remove filters from reply content and topic title to prevent content
     648                // from being encoded with HTML entities, wrapped in paragraph tags, etc...
     649                remove_all_filters( 'bbp_get_topic_content' );
     650                remove_all_filters( 'bbp_get_topic_title'   );
     651       
     652                // collect various pieces of information
     653                $blog_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
     654                $topic_title = strip_tags( bbp_get_topic_title( $topic_id ) );
     655                $topic_author_display_name = bbp_get_topic_author_display_name( $topic_id );
     656                $topic_url = get_permalink( $topic_id );
     657                $topic_content = strip_tags( bbp_get_topic_content( $topic_id ) );
     658                $user_id = bbp_get_topic_author_id( $topic_id ); // for backwards compatible filters below
     659               
     660                // subject
     661                $this->subject = sprintf( __( "[%s Forums] New topic: \"%s\"", 'bbpress' ), $blog_name, $topic_title );
     662                $this->subject = apply_filters( 'bbp_forum_subscription_email_subject', $this->subject, $forum_id, $topic_id );
     663                $this->subject = apply_filters( 'bbp_forum_subscription_mail_title', $this->subject, $topic_id, $forum_id, $user_id ); // backwards compatibility
     664
     665                // message
     666                $this->message = sprintf( __( "%s wrote:\r\n\r\n%s\r\n\r\n\r\n-----------------------------------------\r\nRead this post online: %s\r\n\r\nIf you don't want to receive any more email notifications for this forum, please visit the above link and click \"Unsubscribe\" at the top of the page.", 'bbpress' ), $topic_author_display_name, $topic_content, $topic_url );
     667                $this->message = apply_filters( 'bbp_forum_subscription_email_message', $this->message, $forum_id, $topic_id );
     668                $this->message = apply_filters( 'bbp_forum_subscription_mail_message', $this->message, $topic_id, $forum_id, $user_id ); // backwards compatibility
     669        }
     670       
     671        /**
     672         * Factory
     673         *
     674         * @return true on success, false on failure
     675         */
     676        public static function schedule_sending( $forum_id, $topic_id ) {
     677
     678                // general checks and parameter validation
     679                if ( !bbp_is_subscriptions_active() ||
     680                                !bbp_get_forum_id( $forum_id ) ||
     681                                !bbp_is_topic_published( $topic_id ) ) {
     682                        return false;
     683                }
     684               
     685                // recipients
     686                $user_ids = bbp_get_forum_subscribers( $forum_id, true );
     687                $user_ids = array_diff( $user_ids, array( bbp_get_topic_author_id( $topic_id ) ) );
     688                $user_ids = apply_filters( 'bbp_forum_subscription_user_ids', $user_ids );
     689                $recipients = parent::get_recipients( $user_ids );
     690                if ( !$recipients ) {
     691                        return false;
     692                }
     693               
     694                $notification = new ABBPS_Forum_Subscriber_Notification( $recipients, $forum_id, $topic_id );
     695               
     696                if ( apply_filters( 'bbp_subscription_disable_async', false ) ||
     697                        apply_filters( 'bbp_forum_subscription_disable_async', false ) ) {
     698                        parent::send( $notification );
     699                        return false;
     700                }
     701               
     702                parent::schedule_wp_cron_event( $notification );
     703               
     704                return true;
     705        }
     706}
     707/**
     708 * Topic subscription notification
     709 *
     710 * @package bbPress
     711 * @subpackage Classes
     712 *
     713 * @since bbPress (r)
     714 *
     715 * @uses BBP_Subscriber_Notification
     716 */
     717class BBP_Topic_Subscriber_Notification extends BBP_Subscriber_Notification {
     718
     719        protected function __construct( $recipients, $forum_id, $topic_id, $reply_id ) {
     720                parent::__construct( $recipients );
     721               
     722                // Remove filters from reply content and topic title to prevent content
     723                // from being encoded with HTML entities, wrapped in paragraph tags, etc...
     724                remove_all_filters( 'bbp_get_reply_content' );
     725                remove_all_filters( 'bbp_get_topic_title'   );
     726               
     727                // collect various pieces of information
     728                $blog_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
     729                $topic_title = strip_tags( bbp_get_topic_title( $topic_id ) );
     730                $reply_author_display_name = bbp_get_reply_author_display_name( $reply_id );
     731                $reply_url = bbp_get_reply_url( $reply_id );
     732                $reply_content = strip_tags( bbp_get_reply_content( $reply_id ) );
     733
     734                // subject
     735                $this->subject = sprintf( __( "[%s Forums] New reply to: \"%s\"", 'bbpress' ), $blog_name, $topic_title );
     736                $this->subject = apply_filters( 'bbp_topic_subscription_email_subject', $this->subject, $forum_id, $topic_id, $reply_id );
     737                $this->subject = apply_filters( 'bbp_subscription_mail_title', $this->subject, $reply_id, $topic_id ); // backwards compatibility
     738
     739                // message
     740                $this->message = sprintf( __( "%s replied:\r\n\r\n%s\r\n\r\n\r\n-----------------------------------------\r\nRead this post online: %s\r\n\r\nIf you don't want to receive any more email notifications for this topic, please visit the above link and click \"Unsubscribe\" at the top of the page.", 'bbpress' ), $reply_author_display_name, $reply_content, $reply_url );
     741                $this->message = apply_filters( 'bbp_topic_subscription_email_message', $this->message, $forum_id, $topic_id, $reply_id );
     742                $this->message = apply_filters( 'bbp_subscription_mail_message', $this->message, $reply_id, $topic_id ); // backwards compatibility
     743        }
     744       
     745        /**
     746         * Factory
     747         *
     748         * @return true on success, false on failure
     749         */
     750        public static function schedule_sending( $forum_id, $topic_id, $reply_id ) {
     751               
     752                // general checks and parameter validation
     753                if ( !bbp_is_subscriptions_active() ||
     754                                !bbp_get_forum_id( $forum_id ) ||
     755                                !bbp_is_topic_published( $topic_id ) ||
     756                                !bbp_is_reply_published( $reply_id ) ) {
     757                        return false;
     758                }
     759                               
     760                // recipients
     761                $user_ids = bbp_get_topic_subscribers( $topic_id, true );
     762                $user_ids = array_diff( $user_ids, array( bbp_get_reply_author_id( $reply_id ) ) );
     763                $user_ids = apply_filters( 'bbp_topic_subscription_user_ids', $user_ids );
     764                $recipients = parent::get_recipients( $user_ids );
     765                if ( !$recipients ) {
     766                        return false;
     767                }
     768               
     769                $notification = new ABBPS_Topic_Subscriber_Notification( $recipients, $forum_id, $topic_id, $reply_id );
     770               
     771                if ( apply_filters( 'bbp_subscription_disable_async', false ) ||
     772                        apply_filters( 'bbp_topic_subscription_disable_async', false ) ) {
     773                        parent::send( $notification );
     774                        return false;
     775                }
     776               
     777                parent::schedule_wp_cron_event( $notification );
     778               
     779                return true;
     780        }
     781}
     782endif; // class_exists check
  • includes/common/functions.php

     
    10011001/** Subscriptions *************************************************************/
    10021002
    10031003/**
    1004  * Get the "Do Not Reply" email address to use when sending subscription emails.
    1005  *
    1006  * We make some educated guesses here based on the home URL. Filters are
    1007  * available to customize this address further. In the future, we may consider
    1008  * using `admin_email` instead, though this is not normally publicized.
    1009  *
    1010  * We use `$_SERVER['SERVER_NAME']` here to mimic similar functionality in
    1011  * WordPress core. Previously, we used `get_home_url()` to use already validated
    1012  * user input, but it was causing issues in some installations.
    1013  *
    1014  * @since 2.6.0 bbPress (r5409)
    1015  *
    1016  * @see  wp_mail
    1017  * @see  wp_notify_postauthor
    1018  * @link https://bbpress.trac.wordpress.org/ticket/2618
    1019  *
    1020  * @return string
    1021  */
    1022 function bbp_get_do_not_reply_address() {
    1023         $sitename = strtolower( $_SERVER['SERVER_NAME'] );
    1024         if ( substr( $sitename, 0, 4 ) === 'www.' ) {
    1025                 $sitename = substr( $sitename, 4 );
    1026         }
    1027         return apply_filters( 'bbp_get_do_not_reply_address', 'noreply@' . $sitename );
    1028 }
    1029 
    1030 /**
    1031  * Sends notification emails for new replies to subscribed topics
    1032  *
    1033  * Gets new post's ID and check if there are subscribed users to that topic, and
    1034  * if there are, send notifications
    1035  *
    1036  * Note: in bbPress 2.6, we've moved away from 1 email per subscriber to 1 email
    1037  * with everyone BCC'd. This may have negative repercussions for email services
    1038  * that limit the number of addresses in a BCC field (often to around 500.) In
    1039  * those cases, we recommend unhooking this function and creating your own
    1040  * custom emailer script.
    1041  *
    1042  * @since 2.6.0 bbPress (r5413)
    1043  *
    1044  * @param int $reply_id ID of the newly made reply
    1045  * @param int $topic_id ID of the topic of the reply
    1046  * @param int $forum_id ID of the forum of the reply
    1047  * @param mixed $anonymous_data Array of anonymous user data
    1048  * @param int $reply_author ID of the topic author ID
    1049  *
    1050  * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
    1051  * @uses bbp_get_reply_id() To validate the reply ID
    1052  * @uses bbp_get_topic_id() To validate the topic ID
    1053  * @uses bbp_get_forum_id() To validate the forum ID
    1054  * @uses bbp_get_reply() To get the reply
    1055  * @uses bbp_is_reply_published() To make sure the reply is published
    1056  * @uses bbp_get_topic_id() To validate the topic ID
    1057  * @uses bbp_get_topic() To get the reply's topic
    1058  * @uses bbp_is_topic_published() To make sure the topic is published
    1059  * @uses bbp_get_reply_author_display_name() To get the reply author's display name
    1060  * @uses do_action() Calls 'bbp_pre_notify_subscribers' with the reply id,
    1061  *                    topic id and user id
    1062  * @uses bbp_get_topic_subscribers() To get the topic subscribers
    1063  * @uses apply_filters() Calls 'bbp_subscription_mail_message' with the
    1064  *                    message, reply id, topic id and user id
    1065  * @uses apply_filters() Calls 'bbp_subscription_mail_title' with the
    1066  *                    topic title, reply id, topic id and user id
    1067  * @uses apply_filters() Calls 'bbp_subscription_mail_headers'
    1068  * @uses get_userdata() To get the user data
    1069  * @uses wp_mail() To send the mail
    1070  * @uses do_action() Calls 'bbp_post_notify_subscribers' with the reply id,
    1071  *                    topic id and user id
    1072  * @return bool True on success, false on failure
    1073  */
    1074 function bbp_notify_topic_subscribers( $reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = false, $reply_author = 0 ) {
    1075 
    1076         // Bail if subscriptions are turned off
    1077         if ( ! bbp_is_subscriptions_active() ) {
    1078                 return false;
    1079         }
    1080 
    1081         /** Validation ************************************************************/
    1082 
    1083         $reply_id = bbp_get_reply_id( $reply_id );
    1084         $topic_id = bbp_get_topic_id( $topic_id );
    1085         $forum_id = bbp_get_forum_id( $forum_id );
    1086 
    1087         /** Topic *****************************************************************/
    1088 
    1089         // Bail if topic is not published
    1090         if ( ! bbp_is_topic_published( $topic_id ) ) {
    1091                 return false;
    1092         }
    1093 
    1094         /** Reply *****************************************************************/
    1095 
    1096         // Bail if reply is not published
    1097         if ( ! bbp_is_reply_published( $reply_id ) ) {
    1098                 return false;
    1099         }
    1100 
    1101         // Poster name
    1102         $reply_author_name = bbp_get_reply_author_display_name( $reply_id );
    1103 
    1104         /** Mail ******************************************************************/
    1105 
    1106         // Remove filters from reply content and topic title to prevent content
    1107         // from being encoded with HTML entities, wrapped in paragraph tags, etc...
    1108         remove_all_filters( 'bbp_get_reply_content' );
    1109         remove_all_filters( 'bbp_get_topic_title'   );
    1110 
    1111         // Strip tags from text and setup mail data
    1112         $topic_title   = strip_tags( bbp_get_topic_title( $topic_id ) );
    1113         $reply_content = strip_tags( bbp_get_reply_content( $reply_id ) );
    1114         $reply_url     = bbp_get_reply_url( $reply_id );
    1115         $blog_name     = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
    1116 
    1117         // For plugins to filter messages per reply/topic/user
    1118         $message = sprintf( __( '%1$s wrote:
    1119 
    1120 %2$s
    1121 
    1122 Post Link: %3$s
    1123 
    1124 -----------
    1125 
    1126 You are receiving this email because you subscribed to a forum topic.
    1127 
    1128 Login and visit the topic to unsubscribe from these emails.', 'bbpress' ),
    1129 
    1130                 $reply_author_name,
    1131                 $reply_content,
    1132                 $reply_url
    1133         );
    1134 
    1135         $message = apply_filters( 'bbp_subscription_mail_message', $message, $reply_id, $topic_id );
    1136         if ( empty( $message ) ) {
    1137                 return;
    1138         }
    1139 
    1140         // For plugins to filter titles per reply/topic/user
    1141         $subject = apply_filters( 'bbp_subscription_mail_title', '[' . $blog_name . '] ' . $topic_title, $reply_id, $topic_id );
    1142         if ( empty( $subject ) ) {
    1143                 return;
    1144         }
    1145 
    1146         /** Users *****************************************************************/
    1147 
    1148         // Get the noreply@ address
    1149         $no_reply   = bbp_get_do_not_reply_address();
    1150 
    1151         // Setup "From" email address
    1152         $from_email = apply_filters( 'bbp_subscription_from_email', $no_reply );
    1153 
    1154         // Setup the From header
    1155         $headers = array( 'From: ' . get_bloginfo( 'name' ) . ' <' . $from_email . '>' );
    1156 
    1157         // Get topic subscribers and bail if empty
    1158         $user_ids = bbp_get_topic_subscribers( $topic_id, true );
    1159 
    1160         // Dedicated filter to manipulate user ID's to send emails to
    1161         $user_ids = apply_filters( 'bbp_topic_subscription_user_ids', $user_ids );
    1162         if ( empty( $user_ids ) ) {
    1163                 return false;
    1164         }
    1165 
    1166         // Loop through users
    1167         foreach ( (array) $user_ids as $user_id ) {
    1168 
    1169                 // Don't send notifications to the person who made the post
    1170                 if ( ! empty( $reply_author ) && (int) $user_id === (int) $reply_author ) {
    1171                         continue;
    1172                 }
    1173 
    1174                 // Get email address of subscribed user
    1175                 $headers[] = 'Bcc: ' . get_userdata( $user_id )->user_email;
    1176         }
    1177 
    1178         /** Send it ***************************************************************/
    1179 
    1180         // Custom headers
    1181         $headers  = apply_filters( 'bbp_subscription_mail_headers', $headers  );
    1182         $to_email = apply_filters( 'bbp_subscription_to_email',     $no_reply );
    1183 
    1184         do_action( 'bbp_pre_notify_subscribers', $reply_id, $topic_id, $user_ids );
    1185 
    1186         // Send notification email
    1187         wp_mail( $to_email, $subject, $message, $headers );
    1188 
    1189         do_action( 'bbp_post_notify_subscribers', $reply_id, $topic_id, $user_ids );
    1190 
    1191         return true;
    1192 }
    1193 
    1194 /**
    11951004 * Sends notification emails for new topics to subscribed forums
     1005 * Sends notification emails for new topics to subscribed forums
    11961006 *
    11971007 * Gets new post's ID and check if there are subscribed users to that forum, and
    11981008 * if there are, send notifications
    11991009 *
    1200  * Note: in bbPress 2.6, we've moved away from 1 email per subscriber to 1 email
    1201  * with everyone BCC'd. This may have negative repercussions for email services
    1202  * that limit the number of addresses in a BCC field (often to around 500.) In
    1203  * those cases, we recommend unhooking this function and creating your own
    1204  * custom emailer script.
    1205  *
    12061010 * @since 2.5.0 bbPress (r5156)
    12071011 *
    12081012 * @param int $topic_id ID of the newly made reply
     
    12111015 * @param int $topic_author ID of the topic author ID
    12121016 *
    12131017 * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
    1214  * @uses bbp_get_topic_id() To validate the topic ID
    1215  * @uses bbp_get_forum_id() To validate the forum ID
    12161018 * @uses bbp_is_topic_published() To make sure the topic is published
    1217  * @uses bbp_get_forum_subscribers() To get the forum subscribers
    1218  * @uses bbp_get_topic_author_display_name() To get the topic author's display name
    1219  * @uses do_action() Calls 'bbp_pre_notify_forum_subscribers' with the topic id,
    1220  *                    forum id and user id
    1221  * @uses apply_filters() Calls 'bbp_forum_subscription_mail_message' with the
    1222  *                    message, topic id, forum id and user id
    1223  * @uses apply_filters() Calls 'bbp_forum_subscription_mail_title' with the
    1224  *                    topic title, topic id, forum id and user id
    1225  * @uses apply_filters() Calls 'bbp_forum_subscription_mail_headers'
    1226  * @uses get_userdata() To get the user data
    1227  * @uses wp_mail() To send the mail
    1228  * @uses do_action() Calls 'bbp_post_notify_forum_subscribers' with the topic,
    1229  *                    id, forum id and user id
     1019 * @uses BBP_Topic_Subscriber_Notification to notify subscribers
     1020 *
    12301021 * @return bool True on success, false on failure
    12311022 */
    12321023function bbp_notify_forum_subscribers( $topic_id = 0, $forum_id = 0, $anonymous_data = false, $topic_author = 0 ) {
    1233 
    1234         // Bail if subscriptions are turned off
    1235         if ( ! bbp_is_subscriptions_active() ) {
    1236                 return false;
    1237         }
    1238 
    1239         /** Validation ************************************************************/
    1240 
    1241         $topic_id = bbp_get_topic_id( $topic_id );
    1242         $forum_id = bbp_get_forum_id( $forum_id );
    1243 
    1244         /**
    1245          * Necessary for backwards compatibility
    1246          *
    1247          * @see https://bbpress.trac.wordpress.org/ticket/2620
    1248          */
    1249         $user_id  = 0;
    1250 
    1251         /** Topic *****************************************************************/
    1252 
    1253         // Bail if topic is not published
    1254         if ( ! bbp_is_topic_published( $topic_id ) ) {
    1255                 return false;
    1256         }
    1257 
    1258         // Poster name
    1259         $topic_author_name = bbp_get_topic_author_display_name( $topic_id );
    1260 
    1261         /** Mail ******************************************************************/
    1262 
    1263         // Remove filters from reply content and topic title to prevent content
    1264         // from being encoded with HTML entities, wrapped in paragraph tags, etc...
    1265         remove_all_filters( 'bbp_get_topic_content' );
    1266         remove_all_filters( 'bbp_get_topic_title'   );
    1267 
    1268         // Strip tags from text and setup mail data
    1269         $topic_title   = strip_tags( bbp_get_topic_title( $topic_id ) );
    1270         $topic_content = strip_tags( bbp_get_topic_content( $topic_id ) );
    1271         $topic_url     = get_permalink( $topic_id );
    1272         $blog_name     = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
    1273 
    1274         // For plugins to filter messages per reply/topic/user
    1275         $message = sprintf( __( '%1$s wrote:
    1276 
    1277 %2$s
    1278 
    1279 Topic Link: %3$s
    1280 
    1281 -----------
    1282 
    1283 You are receiving this email because you subscribed to a forum.
    1284 
    1285 Login and visit the topic to unsubscribe from these emails.', 'bbpress' ),
    1286 
    1287                 $topic_author_name,
    1288                 $topic_content,
    1289                 $topic_url
    1290         );
    1291 
    1292         $message = apply_filters( 'bbp_forum_subscription_mail_message', $message, $topic_id, $forum_id, $user_id );
    1293         if ( empty( $message ) ) {
    1294                 return;
    1295         }
    1296 
    1297         // For plugins to filter titles per reply/topic/user
    1298         $subject = apply_filters( 'bbp_forum_subscription_mail_title', '[' . $blog_name . '] ' . $topic_title, $topic_id, $forum_id, $user_id );
    1299         if ( empty( $subject ) ) {
    1300                 return;
    1301         }
    1302 
    1303         /** User ******************************************************************/
    1304 
    1305         // Get the noreply@ address
    1306         $no_reply   = bbp_get_do_not_reply_address();
    1307 
    1308         // Setup "From" email address
    1309         $from_email = apply_filters( 'bbp_subscription_from_email', $no_reply );
    1310 
    1311         // Setup the From header
    1312         $headers = array( 'From: ' . get_bloginfo( 'name' ) . ' <' . $from_email . '>' );
    1313 
    1314         // Get topic subscribers and bail if empty
    1315         $user_ids = bbp_get_forum_subscribers( $forum_id, true );
    1316 
    1317         // Dedicated filter to manipulate user ID's to send emails to
    1318         $user_ids = apply_filters( 'bbp_forum_subscription_user_ids', $user_ids );
    1319         if ( empty( $user_ids ) ) {
    1320                 return false;
    1321         }
    1322 
    1323         // Loop through users
    1324         foreach ( (array) $user_ids as $user_id ) {
    1325 
    1326                 // Don't send notifications to the person who made the post
    1327                 if ( ! empty( $topic_author ) && (int) $user_id === (int) $topic_author ) {
    1328                         continue;
    1329                 }
    1330 
    1331                 // Get email address of subscribed user
    1332                 $headers[] = 'Bcc: ' . get_userdata( $user_id )->user_email;
    1333         }
    1334 
    1335         /** Send it ***************************************************************/
    1336 
    1337         // Custom headers
    1338         $headers  = apply_filters( 'bbp_subscription_mail_headers', $headers  );
    1339         $to_email = apply_filters( 'bbp_subscription_to_email',     $no_reply );
    1340 
    1341         do_action( 'bbp_pre_notify_forum_subscribers', $topic_id, $forum_id, $user_ids );
    1342 
    1343         // Send notification email
    1344         wp_mail( $to_email, $subject, $message, $headers );
    1345 
    1346         do_action( 'bbp_post_notify_forum_subscribers', $topic_id, $forum_id, $user_ids );
    1347 
    1348         return true;
     1024        return BBP_Forum_Subscriber_Notification::schedule_sending( $forum_id, $topic_id );
    13491025}
    13501026
    13511027/**
     
    13691045        return bbp_notify_topic_subscribers( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author );
    13701046}
    13711047
     1048/**
     1049 * Sends notification emails for new replies to subscribed topics
     1050 *
     1051 * Gets new post's ID and check if there are subscribed users to that topic, and
     1052 * if there are, send notifications
     1053 *
     1054 * @since bbPress (r5413)
     1055 *
     1056 * @param int $reply_id ID of the newly made reply
     1057 * @param int $topic_id ID of the topic of the reply
     1058 * @param int $forum_id ID of the forum of the reply
     1059 * @param mixed $anonymous_data Array of anonymous user data
     1060 * @param int $reply_author ID of the topic author ID
     1061 *
     1062 * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
     1063 * @uses bbp_is_reply_published() To make sure the reply is published
     1064 * @uses BBP_Topic_Subscriber_Notification to notify subscribers
     1065 *
     1066 * @return bool True on success, false on failure
     1067 */
     1068function bbp_notify_topic_subscribers( $reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = false, $reply_author = 0 ) {
     1069        return BBP_Topic_Subscriber_Notification::schedule_sending( $forum_id, $topic_id, $reply_id );
     1070}
     1071
    13721072/** Login *********************************************************************/
    13731073
    13741074/**
  • includes/core/actions.php

     
    224224add_action( 'bbp_delete_topic', 'bbp_remove_topic_from_all_favorites' );
    225225
    226226// Subscriptions
    227 add_action( 'bbp_spam_topic',   'bbp_remove_topic_from_all_subscriptions'       );
    228 add_action( 'bbp_trash_topic',  'bbp_remove_topic_from_all_subscriptions'       );
    229 add_action( 'bbp_delete_topic', 'bbp_remove_topic_from_all_subscriptions'       );
    230 add_action( 'bbp_trash_forum',  'bbp_remove_forum_from_all_subscriptions'       );
    231 add_action( 'bbp_delete_forum', 'bbp_remove_forum_from_all_subscriptions'       );
    232 add_action( 'bbp_new_reply',    'bbp_notify_subscribers',                 11, 5 );
    233 add_action( 'bbp_new_topic',    'bbp_notify_forum_subscribers',           11, 4 );
     227add_action( 'bbp_subscription_email_cron', array( 'BBP_Subscriber_Notification', 'send' ), 10, 1 );
     228add_action( 'bbp_spam_topic',              'bbp_remove_topic_from_all_subscriptions'             );
     229add_action( 'bbp_trash_topic',             'bbp_remove_topic_from_all_subscriptions'             );
     230add_action( 'bbp_delete_topic',            'bbp_remove_topic_from_all_subscriptions'             );
     231add_action( 'bbp_trash_forum',             'bbp_remove_forum_from_all_subscriptions'             );
     232add_action( 'bbp_delete_forum',            'bbp_remove_forum_from_all_subscriptions'             );
     233add_action( 'bbp_new_reply',               'bbp_notify_subscribers',                       11, 5 );
     234add_action( 'bbp_new_topic',               'bbp_notify_forum_subscribers',                 11, 4 );
    234235
    235236// Sticky
    236237add_action( 'bbp_spam_topic',   'bbp_unstick_topic' );