/** * @covers ::bbp_is_reply_published */ public function test_bbp_is_reply_published() { $forum_id = $this->factory->forum->create(); $topic_id = $this->factory->topic->create(array('post_parent' => $forum_id, 'topic_meta' => array('forum_id' => $forum_id))); $reply_id = $this->factory->reply->create(array('post_parent' => $topic_id, 'reply_meta' => array('forum_id' => $forum_id, 'topic_id' => $topic_id))); $r = $this->factory->reply->create(array('post_parent' => $topic_id, 'reply_meta' => array('forum_id' => $forum_id, 'topic_id' => $topic_id))); $reply_published = bbp_is_reply_published($r); $this->assertTrue($reply_published); $reply_published = bbp_is_reply_published($reply_id); $this->assertTrue($reply_published); }
/** * Send a notification to subscribers * * @wp-filter bbp_new_reply 1 */ public function notify_on_reply($reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = false, $reply_author = 0) { if ($this->handler === null) { return false; } global $wpdb; if (!bbp_is_subscriptions_active()) { return false; } $reply_id = bbp_get_reply_id($reply_id); $topic_id = bbp_get_topic_id($topic_id); $forum_id = bbp_get_forum_id($forum_id); if (!bbp_is_reply_published($reply_id)) { return false; } if (!bbp_is_topic_published($topic_id)) { return false; } $user_ids = bbp_get_topic_subscribers($topic_id, true); if (empty($user_ids)) { return false; } // Poster name $reply_author_name = apply_filters('bbsub_reply_author_name', bbp_get_reply_author_display_name($reply_id)); do_action('bbp_pre_notify_subscribers', $reply_id, $topic_id, $user_ids); // Don't send notifications to the person who made the post $send_to_author = Falcon::get_option('bbsub_send_to_author', false); if (!$send_to_author && !empty($reply_author)) { $user_ids = array_filter($user_ids, function ($id) use($reply_author) { return (int) $id !== (int) $reply_author; }); } // Get userdata for all users $user_ids = array_map(function ($id) { return get_userdata($id); }, $user_ids); // Sanitize the HTML into text $content = apply_filters('bbsub_html_to_text', bbp_get_reply_content($reply_id)); // Build email $text = "%1\$s\n\n"; $text .= "---\nReply to this email directly or view it online:\n%2\$s\n\n"; $text .= "You are receiving this email because you subscribed to it. Login and visit the topic to unsubscribe from these emails."; $text = sprintf($text, $content, bbp_get_reply_url($reply_id)); $text = apply_filters('bbsub_email_message', $text, $reply_id, $topic_id, $content); $subject = apply_filters('bbsub_email_subject', 'Re: [' . get_option('blogname') . '] ' . bbp_get_topic_title($topic_id), $reply_id, $topic_id); $options = array('id' => $topic_id, 'author' => $reply_author_name); $this->handler->send_mail($user_ids, $subject, $text, $options); do_action('bbp_post_notify_subscribers', $reply_id, $topic_id, $user_ids); return true; }
/** * Reply Row actions * * Remove the quick-edit action link under the reply title and add the * content and spam link * * @since 2.0.0 bbPress (r2577) * * @param array $actions Actions * @param array $reply Reply object * @uses bbp_get_reply_post_type() To get the reply post type * @uses bbp_reply_content() To output reply content * @uses bbp_get_reply_url() To get the reply link * @uses bbp_get_reply_title() To get the reply title * @uses current_user_can() To check if the current user can edit or * delete the reply * @uses bbp_is_reply_spam() To check if the reply is marked as spam * @uses get_post_type_object() To get the reply post type object * @uses add_query_arg() To add custom args to the url * @uses remove_query_arg() To remove custom args from the url * @uses wp_nonce_url() To nonce the url * @uses get_delete_post_link() To get the delete post link of the reply * @return array $actions Actions */ public function row_actions($actions, $reply) { if ($this->bail()) { return $actions; } unset($actions['inline hide-if-no-js']); // Reply view links to topic $actions['view'] = '<a href="' . esc_url(bbp_get_reply_url($reply->ID)) . '" title="' . esc_attr(sprintf(__('View “%s”', 'bbpress'), bbp_get_reply_title($reply->ID))) . '" rel="permalink">' . esc_html__('View', 'bbpress') . '</a>'; // User cannot view replies in trash if (bbp_get_trash_status_id() === $reply->post_status && !current_user_can('view_trash')) { unset($actions['view']); } // Only show the actions if the user is capable of viewing them if (current_user_can('moderate', $reply->ID)) { // Show the 'approve' link on pending posts only and 'unapprove' on published posts only $approve_uri = wp_nonce_url(add_query_arg(array('reply_id' => $reply->ID, 'action' => 'bbp_toggle_reply_approve'), remove_query_arg(array('bbp_reply_toggle_notice', 'reply_id', 'failed', 'super'))), 'approve-reply_' . $reply->ID); if (bbp_is_reply_published($reply->ID)) { $actions['unapproved'] = '<a href="' . esc_url($approve_uri) . '" title="' . esc_attr__('Unapprove this reply', 'bbpress') . '">' . _x('Unapprove', 'Unapprove reply', 'bbpress') . '</a>'; } elseif (!bbp_is_reply_private($reply->ID)) { $actions['approved'] = '<a href="' . esc_url($approve_uri) . '" title="' . esc_attr__('Approve this reply', 'bbpress') . '">' . _x('Approve', 'Approve reply', 'bbpress') . '</a>'; } // Show the 'spam' link on published and pending replies and 'not spam' on spammed replies if (in_array($reply->post_status, array(bbp_get_public_status_id(), bbp_get_pending_status_id(), bbp_get_spam_status_id()))) { $spam_uri = wp_nonce_url(add_query_arg(array('reply_id' => $reply->ID, 'action' => 'bbp_toggle_reply_spam'), remove_query_arg(array('bbp_reply_toggle_notice', 'reply_id', 'failed', 'super'))), 'spam-reply_' . $reply->ID); if (bbp_is_reply_spam($reply->ID)) { $actions['spam'] = '<a href="' . esc_url($spam_uri) . '" title="' . esc_attr__('Mark the reply as not spam', 'bbpress') . '">' . esc_html__('Not spam', 'bbpress') . '</a>'; } else { $actions['spam'] = '<a href="' . esc_url($spam_uri) . '" title="' . esc_attr__('Mark this reply as spam', 'bbpress') . '">' . esc_html__('Spam', 'bbpress') . '</a>'; } } } // Trash if (current_user_can('delete_reply', $reply->ID)) { if (bbp_get_trash_status_id() === $reply->post_status) { $post_type_object = get_post_type_object(bbp_get_reply_post_type()); $actions['untrash'] = "<a title='" . esc_attr__('Restore this item from the Trash', 'bbpress') . "' href='" . esc_url(add_query_arg(array('_wp_http_referer' => add_query_arg(array('post_type' => bbp_get_reply_post_type()), admin_url('edit.php'))), wp_nonce_url(admin_url(sprintf($post_type_object->_edit_link . '&action=untrash', $reply->ID)), 'untrash-' . $reply->post_type . '_' . $reply->ID))) . "'>" . esc_html__('Restore', 'bbpress') . "</a>"; } elseif (EMPTY_TRASH_DAYS) { $actions['trash'] = "<a class='submitdelete' title='" . esc_attr__('Move this item to the Trash', 'bbpress') . "' href='" . esc_url(add_query_arg(array('_wp_http_referer' => add_query_arg(array('post_type' => bbp_get_reply_post_type()), admin_url('edit.php'))), get_delete_post_link($reply->ID))) . "'>" . esc_html__('Trash', 'bbpress') . "</a>"; } if (bbp_get_trash_status_id() === $reply->post_status || !EMPTY_TRASH_DAYS) { $actions['delete'] = "<a class='submitdelete' title='" . esc_attr__('Delete this item permanently', 'bbpress') . "' href='" . esc_url(add_query_arg(array('_wp_http_referer' => add_query_arg(array('post_type' => bbp_get_reply_post_type()), admin_url('edit.php'))), get_delete_post_link($reply->ID, '', true))) . "'>" . esc_html__('Delete Permanently', 'bbpress') . "</a>"; } elseif (bbp_get_spam_status_id() === $reply->post_status) { unset($actions['trash']); } } return $actions; }
/** * Update the topic with the most recent reply ID * * @since bbPress (r2625) * * @param int $topic_id Optional. Topic id to update * @param int $reply_id Optional. Reply id * @uses bbp_is_reply() To check if the passed topic id is a reply * @uses bbp_get_reply_id() To get the reply id * @uses bbp_get_reply_topic_id() To get the reply topic id * @uses bbp_get_topic_id() To get the topic id * @uses bbp_get_reply_post_type() To get the reply post type * @uses bbp_get_public_child_last_id() To get the last public reply id * @uses update_post_meta() To update the topic last reply id meta * @uses apply_filters() Calls 'bbp_update_topic_last_reply_id' with the reply * id and topic id * @return int Reply id */ function bbp_update_topic_last_reply_id($topic_id = 0, $reply_id = 0) { // If it's a reply, then get the parent (topic id) if (empty($reply_id) && bbp_is_reply($topic_id)) { $reply_id = bbp_get_reply_id($topic_id); $topic_id = bbp_get_reply_topic_id($reply_id); } else { $reply_id = bbp_get_reply_id($reply_id); $topic_id = bbp_get_topic_id($topic_id); } if (empty($reply_id)) { $reply_id = bbp_get_public_child_last_id($topic_id, bbp_get_reply_post_type()); } // Adjust last_id's based on last_reply post_type if (empty($reply_id) || !bbp_is_reply($reply_id)) { $reply_id = 0; } // Update if reply is published if (bbp_is_reply_published($reply_id)) { update_post_meta($topic_id, '_bbp_last_reply_id', (int) $reply_id); } return apply_filters('bbp_update_topic_last_reply_id', (int) $reply_id, $topic_id); }
/** * Update the forum last reply id * * @since bbPress (r2625) * * @param int $forum_id Optional. Forum id * @param int $reply_id Optional. Reply id * @uses bbp_get_forum_id() To get the forum id * @uses bbp_forum_query_subforum_ids() To get the subforum ids * @uses bbp_update_forum_last_reply_id() To update the last reply id of child * forums * @uses bbp_forum_query_topic_ids() To get the topic ids in the forum * @uses bbp_forum_query_last_reply_id() To get the forum's last reply id * @uses bbp_is_reply_published() To make sure the reply is published * @uses update_post_meta() To update the forum's last active id meta * @uses apply_filters() Calls 'bbp_update_forum_last_reply_id' with the last * reply id and forum id * @return bool True on success, false on failure */ function bbp_update_forum_last_reply_id($forum_id = 0, $reply_id = 0) { $forum_id = bbp_get_forum_id($forum_id); // Define local variable(s) $children_last_reply = 0; // Do some calculation if not manually set if (empty($reply_id)) { // Loop through children and get the most recent reply id $children = bbp_forum_query_subforum_ids($forum_id); if (!empty($children)) { foreach ((array) $children as $child) { $children_last_reply = bbp_update_forum_last_reply_id($child); // Recursive } } // If this forum has topics... $topic_ids = bbp_forum_query_topic_ids($forum_id); if (!empty($topic_ids)) { // ...get the most recent reply from those topics... $reply_id = bbp_forum_query_last_reply_id($forum_id, $topic_ids); // ...and compare it to the most recent topic id... $reply_id = $reply_id > max($topic_ids) ? $reply_id : max($topic_ids); } } // Cast as integer in case of empty or string $reply_id = (int) $reply_id; $children_last_reply = (int) $children_last_reply; // If child forums have higher ID, check for newer reply id if (!empty($children) && $children_last_reply > $reply_id) { $reply_id = $children_last_reply; } // Update the last public reply ID if (bbp_is_reply_published($reply_id)) { update_post_meta($forum_id, '_bbp_last_reply_id', $reply_id); } return (int) apply_filters('bbp_update_forum_last_reply_id', $reply_id, $forum_id); }
/** * Walk up the ancestor tree from the current reply, and update all the counts * * @since bbPress (r2884) * * @param int $reply_id Optional. Reply id * @param string $last_active_time Optional. Last active time * @param int $forum_id Optional. Forum id * @param int $topic_id Optional. Topic id * @param bool $refresh If set to true, unsets all the previous parameters. * Defaults to true * @uses bbp_get_reply_id() To get the reply id * @uses bbp_get_reply_topic_id() To get the reply topic id * @uses bbp_get_reply_forum_id() To get the reply forum id * @uses get_post_ancestors() To get the ancestors of the reply * @uses bbp_is_reply() To check if the ancestor is a reply * @uses bbp_is_topic() To check if the ancestor is a topic * @uses bbp_update_topic_last_reply_id() To update the topic last reply id * @uses bbp_update_topic_last_active_id() To update the topic last active id * @uses bbp_get_topic_last_active_id() To get the topic last active id * @uses get_post_field() To get the post date of the last active id * @uses bbp_update_topic_last_active_time() To update the last active topic meta * @uses bbp_update_topic_voice_count() To update the topic voice count * @uses bbp_update_topic_reply_count() To update the topic reply count * @uses bbp_update_topic_reply_count_hidden() To update the topic hidden reply * count * @uses bbp_is_forum() To check if the ancestor is a forum * @uses bbp_update_forum_last_topic_id() To update the last topic id forum meta * @uses bbp_update_forum_last_reply_id() To update the last reply id forum meta * @uses bbp_update_forum_last_active_id() To update the forum last active id * @uses bbp_get_forum_last_active_id() To get the forum last active id * @uses bbp_update_forum_last_active_time() To update the forum last active time * @uses bbp_update_forum_reply_count() To update the forum reply count */ function bbp_update_reply_walker($reply_id, $last_active_time = '', $forum_id = 0, $topic_id = 0, $refresh = true) { // Verify the reply ID $reply_id = bbp_get_reply_id($reply_id); // Reply was passed if (!empty($reply_id)) { // Get the topic ID if none was passed if (empty($topic_id)) { $topic_id = bbp_get_reply_topic_id($reply_id); } // Get the forum ID if none was passed if (empty($forum_id)) { $forum_id = bbp_get_reply_forum_id($reply_id); } } // Set the active_id based on topic_id/reply_id $active_id = empty($reply_id) ? $topic_id : $reply_id; // Setup ancestors array to walk up $ancestors = array_values(array_unique(array_merge(array($topic_id, $forum_id), (array) get_post_ancestors($topic_id)))); // If we want a full refresh, unset any of the possibly passed variables if (true === $refresh) { $forum_id = $topic_id = $reply_id = $active_id = $last_active_time = 0; } // Walk up ancestors if (!empty($ancestors)) { foreach ($ancestors as $ancestor) { // Reply meta relating to most recent reply if (bbp_is_reply($ancestor)) { // @todo - hierarchical replies // Topic meta relating to most recent reply } elseif (bbp_is_topic($ancestor)) { // Last reply and active ID's bbp_update_topic_last_reply_id($ancestor, $reply_id); bbp_update_topic_last_active_id($ancestor, $active_id); // Get the last active time if none was passed $topic_last_active_time = $last_active_time; if (empty($last_active_time)) { $topic_last_active_time = get_post_field('post_date', bbp_get_topic_last_active_id($ancestor)); } // Only update if reply is published if (bbp_is_reply_published($reply_id)) { bbp_update_topic_last_active_time($ancestor, $topic_last_active_time); } // Counts bbp_update_topic_voice_count($ancestor); bbp_update_topic_reply_count($ancestor); bbp_update_topic_reply_count_hidden($ancestor); // Forum meta relating to most recent topic } elseif (bbp_is_forum($ancestor)) { // Last topic and reply ID's bbp_update_forum_last_topic_id($ancestor, $topic_id); bbp_update_forum_last_reply_id($ancestor, $reply_id); // Last Active bbp_update_forum_last_active_id($ancestor, $active_id); // Get the last active time if none was passed $forum_last_active_time = $last_active_time; if (empty($last_active_time)) { $forum_last_active_time = get_post_field('post_date', bbp_get_forum_last_active_id($ancestor)); } // Only update if reply is published if (bbp_is_reply_published($reply_id)) { bbp_update_forum_last_active_time($ancestor, $forum_last_active_time); } // Counts bbp_update_forum_reply_count($ancestor); } } } }
/** * Record an activity stream entry when a reply is created * * @since bbPress (r3395) * @param int $topic_id * @param int $forum_id * @param array $anonymous_data * @param int $topic_author_id * @uses bbp_get_reply_id() * @uses bbp_get_topic_id() * @uses bbp_get_forum_id() * @uses bbp_get_user_profile_link() * @uses bbp_get_reply_url() * @uses bbp_get_reply_content() * @uses bbp_get_topic_permalink() * @uses bbp_get_topic_title() * @uses bbp_get_forum_permalink() * @uses bbp_get_forum_title() * @uses bp_create_excerpt() * @uses apply_filters() * @return Bail early if topic is by anonywous user */ public function reply_create($reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id) { // Do not log activity of anonymous users if (!empty($anonymous_data)) { return; } // Bail if site is private if (!bbp_is_site_public()) { return; } // Validate activity data $user_id = $reply_author_id; $reply_id = bbp_get_reply_id($reply_id); $topic_id = bbp_get_topic_id($topic_id); $forum_id = bbp_get_forum_id($forum_id); // Bail if user is not active if (bbp_is_user_inactive($user_id)) { return; } // Bail if reply is not published if (!bbp_is_reply_published($reply_id)) { return; } // Setup links for activity stream $user_link = bbp_get_user_profile_link($user_id); // Reply $reply_url = bbp_get_reply_url($reply_id); $reply_content = get_post_field('post_content', $reply_id, 'raw'); // Topic $topic_permalink = bbp_get_topic_permalink($topic_id); $topic_title = get_post_field('post_title', $topic_id, 'raw'); $topic_link = '<a href="' . $topic_permalink . '" title="' . $topic_title . '">' . $topic_title . '</a>'; // Forum $forum_permalink = bbp_get_forum_permalink($forum_id); $forum_title = get_post_field('post_title', $forum_id, 'raw'); $forum_link = '<a href="' . $forum_permalink . '" title="' . $forum_title . '">' . $forum_title . '</a>'; // Activity action & text $activity_text = sprintf(__('%1$s replied to the topic %2$s in the forum %3$s', 'bbpress'), $user_link, $topic_link, $forum_link); $activity_action = apply_filters('bbp_activity_reply_create', $activity_text, $user_id, $reply_id, $topic_id); $activity_content = apply_filters('bbp_activity_reply_create_excerpt', bp_create_excerpt($reply_content), $reply_content); // Compile the activity stream results $activity = array('id' => $this->get_activity_id($reply_id), 'user_id' => $user_id, 'action' => $activity_action, 'content' => $activity_content, 'primary_link' => $reply_url, 'type' => $this->reply_create, 'item_id' => $reply_id, 'secondary_item_id' => $topic_id, 'recorded_time' => get_post_time('Y-m-d H:i:s', true, $reply_id), 'hide_sitewide' => !bbp_is_forum_public($forum_id, false)); // Record the activity $activity_id = $this->record_activity($activity); // Add the activity entry ID as a meta value to the reply if (!empty($activity_id)) { update_post_meta($reply_id, '_bbp_activity_id', $activity_id); } }
/** * Sends notification emails for new replies to subscribed topics * * Gets new post's ID and check if there are subscribed users to that topic, and * if there are, send notifications * * Note: in bbPress 2.6, we've moved away from 1 email per subscriber to 1 email * with everyone BCC'd. This may have negative repercussions for email services * that limit the number of addresses in a BCC field (often to around 500.) In * those cases, we recommend unhooking this function and creating your own * custom emailer script. * * @since 2.6.0 bbPress (r5413) * * @param int $reply_id ID of the newly made reply * @param int $topic_id ID of the topic of the reply * @param int $forum_id ID of the forum of the reply * @param mixed $anonymous_data Array of anonymous user data * @param int $reply_author ID of the topic author ID * * @uses bbp_is_subscriptions_active() To check if the subscriptions are active * @uses bbp_get_reply_id() To validate the reply ID * @uses bbp_get_topic_id() To validate the topic ID * @uses bbp_get_forum_id() To validate the forum ID * @uses bbp_get_reply() To get the reply * @uses bbp_is_reply_published() To make sure the reply is published * @uses bbp_get_topic_id() To validate the topic ID * @uses bbp_get_topic() To get the reply's topic * @uses bbp_is_topic_published() To make sure the topic is published * @uses bbp_get_reply_author_display_name() To get the reply author's display name * @uses do_action() Calls 'bbp_pre_notify_subscribers' with the reply id, * topic id and user id * @uses bbp_get_topic_subscribers() To get the topic subscribers * @uses apply_filters() Calls 'bbp_subscription_mail_message' with the * message, reply id, topic id and user id * @uses apply_filters() Calls 'bbp_subscription_mail_title' with the * topic title, reply id, topic id and user id * @uses apply_filters() Calls 'bbp_subscription_mail_headers' * @uses get_userdata() To get the user data * @uses wp_mail() To send the mail * @uses do_action() Calls 'bbp_post_notify_subscribers' with the reply id, * topic id and user id * @return bool True on success, false on failure */ function bbp_notify_topic_subscribers($reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = false, $reply_author = 0) { // Bail if subscriptions are turned off if (!bbp_is_subscriptions_active()) { return false; } /** Validation ************************************************************/ $reply_id = bbp_get_reply_id($reply_id); $topic_id = bbp_get_topic_id($topic_id); $forum_id = bbp_get_forum_id($forum_id); /** Topic *****************************************************************/ // Bail if topic is not published if (!bbp_is_topic_published($topic_id)) { return false; } /** Reply *****************************************************************/ // Bail if reply is not published if (!bbp_is_reply_published($reply_id)) { return false; } // Poster name $reply_author_name = bbp_get_reply_author_display_name($reply_id); /** Mail ******************************************************************/ // Remove filters from reply content and topic title to prevent content // from being encoded with HTML entities, wrapped in paragraph tags, etc... remove_all_filters('bbp_get_reply_content'); remove_all_filters('bbp_get_topic_title'); // Strip tags from text and setup mail data $topic_title = strip_tags(bbp_get_topic_title($topic_id)); $reply_content = strip_tags(bbp_get_reply_content($reply_id)); $reply_url = bbp_get_reply_url($reply_id); $blog_name = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); // For plugins to filter messages per reply/topic/user $message = sprintf(__('%1$s wrote: %2$s Post Link: %3$s ----------- You are receiving this email because you subscribed to a forum topic. Login and visit the topic to unsubscribe from these emails.', 'bbpress'), $reply_author_name, $reply_content, $reply_url); $message = apply_filters('bbp_subscription_mail_message', $message, $reply_id, $topic_id); if (empty($message)) { return; } // For plugins to filter titles per reply/topic/user $subject = apply_filters('bbp_subscription_mail_title', '[' . $blog_name . '] ' . $topic_title, $reply_id, $topic_id); if (empty($subject)) { return; } /** Users *****************************************************************/ // Get the noreply@ address $no_reply = bbp_get_do_not_reply_address(); // Setup "From" email address $from_email = apply_filters('bbp_subscription_from_email', $no_reply); // Setup the From header $headers = array('From: ' . get_bloginfo('name') . ' <' . $from_email . '>'); // Get topic subscribers and bail if empty $user_ids = bbp_get_topic_subscribers($topic_id, true); // Dedicated filter to manipulate user ID's to send emails to $user_ids = apply_filters('bbp_topic_subscription_user_ids', $user_ids); if (empty($user_ids)) { return false; } // Loop through users foreach ((array) $user_ids as $user_id) { // Don't send notifications to the person who made the post if (!empty($reply_author) && (int) $user_id === (int) $reply_author) { continue; } // Get email address of subscribed user $headers[] = 'Bcc: ' . get_userdata($user_id)->user_email; } /** Send it ***************************************************************/ // Custom headers $headers = apply_filters('bbp_subscription_mail_headers', $headers); $to_email = apply_filters('bbp_subscription_to_email', $no_reply); do_action('bbp_pre_notify_subscribers', $reply_id, $topic_id, $user_ids); // Send notification email wp_mail($to_email, $subject, $message, $headers); do_action('bbp_post_notify_subscribers', $reply_id, $topic_id, $user_ids); return true; }
/** * @group canonical * @covers ::bbp_create_initial_content */ public function test_bbp_create_initial_content() { $category_id = $this->factory->forum->create(array('forum_meta' => array('_bbp_forum_type' => 'category', '_bbp_status' => 'open'))); bbp_create_initial_content(array('forum_parent' => $category_id)); $forum_id = bbp_forum_query_subforum_ids($category_id); $forum_id = (int) $forum_id[0]; $topic_id = bbp_get_forum_last_topic_id($forum_id); $reply_id = bbp_get_forum_last_reply_id($forum_id); // Forum post $this->assertSame('General', bbp_get_forum_title($forum_id)); $this->assertSame('General chit-chat', bbp_get_forum_content($forum_id)); $this->assertSame('open', bbp_get_forum_status($forum_id)); $this->assertTrue(bbp_is_forum_public($forum_id)); $this->assertSame($category_id, bbp_get_forum_parent_id($forum_id)); // Topic post $this->assertSame($forum_id, bbp_get_topic_forum_id($topic_id)); $this->assertSame('Hello World!', bbp_get_topic_title($topic_id)); remove_all_filters('bbp_get_topic_content'); $topic_content = "I am the first topic in your new forums."; $this->assertSame($topic_content, bbp_get_topic_content($topic_id)); $this->assertSame('publish', bbp_get_topic_status($topic_id)); $this->assertTrue(bbp_is_topic_published($topic_id)); // Reply post $this->assertSame($forum_id, bbp_get_reply_forum_id($reply_id)); $this->assertSame('Reply To: Hello World!', bbp_get_reply_title($reply_id)); $this->assertSame($reply_id, bbp_get_reply_title_fallback($reply_id)); remove_all_filters('bbp_get_reply_content'); $reply_content = "Oh, and this is what a reply looks like."; $this->assertSame($reply_content, bbp_get_reply_content($reply_id)); $this->assertSame('publish', bbp_get_reply_status($reply_id)); $this->assertTrue(bbp_is_reply_published($reply_id)); // Category meta $this->assertSame(1, bbp_get_forum_subforum_count($category_id, true)); $this->assertSame(0, bbp_get_forum_topic_count($category_id, false, true)); $this->assertSame(0, bbp_get_forum_topic_count_hidden($category_id, true)); $this->assertSame(0, bbp_get_forum_reply_count($category_id, false, true)); $this->assertSame(1, bbp_get_forum_topic_count($category_id, true, true)); $this->assertSame(1, bbp_get_forum_reply_count($category_id, true, true)); $this->assertSame(0, bbp_get_forum_post_count($category_id, false, true)); $this->assertSame(2, bbp_get_forum_post_count($category_id, true, true)); $this->assertSame($topic_id, bbp_get_forum_last_topic_id($category_id)); $this->assertSame('Hello World!', bbp_get_forum_last_topic_title($category_id)); $this->assertSame($reply_id, bbp_get_forum_last_reply_id($category_id)); $this->assertSame('Reply To: Hello World!', bbp_get_forum_last_reply_title($category_id)); $this->assertSame($reply_id, bbp_get_forum_last_active_id($category_id)); $this->assertSame('1 day, 16 hours ago', bbp_get_forum_last_active_time($category_id)); // Forum meta $this->assertSame(0, bbp_get_forum_subforum_count($forum_id, true)); $this->assertSame(1, bbp_get_forum_topic_count($forum_id, false, true)); $this->assertSame(0, bbp_get_forum_topic_count_hidden($forum_id, true)); $this->assertSame(1, bbp_get_forum_reply_count($forum_id, false, true)); $this->assertSame(1, bbp_get_forum_topic_count($forum_id, true, true)); $this->assertSame(1, bbp_get_forum_reply_count($forum_id, true, true)); $this->assertSame(2, bbp_get_forum_post_count($forum_id, false, true)); $this->assertSame(2, bbp_get_forum_post_count($forum_id, true, true)); $this->assertSame($topic_id, bbp_get_forum_last_topic_id($forum_id)); $this->assertSame('Hello World!', bbp_get_forum_last_topic_title($forum_id)); $this->assertSame($reply_id, bbp_get_forum_last_reply_id($forum_id)); $this->assertSame('Reply To: Hello World!', bbp_get_forum_last_reply_title($forum_id)); $this->assertSame($reply_id, bbp_get_forum_last_active_id($forum_id)); $this->assertSame('1 day, 16 hours ago', bbp_get_forum_last_active_time($forum_id)); // Topic meta $this->assertSame('127.0.0.1', bbp_current_author_ip($topic_id)); $this->assertSame($forum_id, bbp_get_topic_forum_id($topic_id)); $this->assertSame(1, bbp_get_topic_voice_count($topic_id, true)); $this->assertSame(1, bbp_get_topic_reply_count($topic_id, true)); $this->assertSame(0, bbp_get_topic_reply_count_hidden($topic_id, true)); $this->assertSame($reply_id, bbp_get_topic_last_reply_id($topic_id)); $this->assertSame($reply_id, bbp_get_topic_last_active_id($topic_id)); $this->assertSame('1 day, 16 hours ago', bbp_get_topic_last_active_time($topic_id)); // Reply Meta $this->assertSame('127.0.0.1', bbp_current_author_ip($reply_id)); $this->assertSame($forum_id, bbp_get_reply_forum_id($reply_id)); $this->assertSame($topic_id, bbp_get_reply_topic_id($reply_id)); }
/** * Sends notification emails for new posts * * Gets new post's ID and check if there are subscribed users to that topic, and * if there are, send notifications * * @since bbPress (r2668) * * @param int $reply_id ID of the newly made reply * @uses bbp_is_subscriptions_active() To check if the subscriptions are active * @uses bbp_get_reply_id() To validate the reply ID * @uses bbp_get_reply() To get the reply * @uses bbp_get_reply_topic_id() To get the topic ID of the reply * @uses bbp_is_reply_published() To make sure the reply is published * @uses bbp_get_topic_id() To validate the topic ID * @uses bbp_get_topic() To get the reply's topic * @uses bbp_is_topic_published() To make sure the topic is published * @uses get_the_author_meta() To get the author's display name * @uses do_action() Calls 'bbp_pre_notify_subscribers' with the reply id and * topic id * @uses bbp_get_topic_subscribers() To get the topic subscribers * @uses apply_filters() Calls 'bbp_subscription_mail_message' with the * message, reply id, topic id and user id * @uses get_userdata() To get the user data * @uses wp_mail() To send the mail * @uses do_action() Calls 'bbp_post_notify_subscribers' with the reply id * and topic id * @return bool True on success, false on failure */ function bbp_notify_subscribers($reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = false, $reply_author = 0) { // Bail if subscriptions are turned off if (!bbp_is_subscriptions_active()) { return false; } /** Validation ************************************************************/ $reply_id = bbp_get_reply_id($reply_id); $topic_id = bbp_get_topic_id($topic_id); $forum_id = bbp_get_forum_id($forum_id); /** Reply *****************************************************************/ // Bail if reply is not published if (!bbp_is_reply_published($reply_id)) { return false; } /** Topic *****************************************************************/ // Bail if topic is not published if (!bbp_is_topic_published($topic_id)) { return false; } /** User ******************************************************************/ // Get subscribers and bail if empty $user_ids = bbp_get_topic_subscribers($topic_id, true); if (empty($user_ids)) { return false; } // Poster name $reply_author_name = bbp_get_reply_author_display_name($reply_id); /** Mail ******************************************************************/ do_action('bbp_pre_notify_subscribers', $reply_id, $topic_id, $user_ids); // Remove filters from reply content and topic title to prevent content // from being encoded with HTML entities, wrapped in paragraph tags, etc... remove_all_filters('bbp_get_reply_content'); remove_all_filters('bbp_get_topic_title'); // Strip tags from text $topic_title = strip_tags(bbp_get_topic_title($topic_id)); $reply_content = strip_tags(bbp_get_reply_content($reply_id)); $reply_url = bbp_get_reply_url($reply_id); $blog_name = get_option('blogname'); // Loop through users foreach ((array) $user_ids as $user_id) { // Don't send notifications to the person who made the post if (!empty($reply_author) && (int) $user_id == (int) $reply_author) { continue; } // For plugins to filter messages per reply/topic/user $message = sprintf(__('%1$s wrote: %2$s Post Link: %3$s ----------- You are receiving this email because you subscribed to a forum topic. Login and visit the topic to unsubscribe from these emails.', 'bbpress'), $reply_author_name, $reply_content, $reply_url); $message = apply_filters('bbp_subscription_mail_message', $message, $reply_id, $topic_id, $user_id); if (empty($message)) { continue; } // For plugins to filter titles per reply/topic/user $subject = apply_filters('bbp_subscription_mail_title', '[' . $blog_name . '] ' . $topic_title, $reply_id, $topic_id, $user_id); if (empty($subject)) { continue; } // Custom headers $headers = apply_filters('bbp_subscription_mail_headers', array()); // Get user data of this user $user = get_userdata($user_id); // Send notification email wp_mail($user->user_email, $subject, $message, $headers); } do_action('bbp_post_notify_subscribers', $reply_id, $topic_id, $user_ids); return true; }
/** * Walk up the ancestor tree from the current reply, and update all the counts * * @since 2.0.0 bbPress (r2884) * * @param int $reply_id Optional. Reply id * @param string $last_active_time Optional. Last active time * @param int $forum_id Optional. Forum id * @param int $topic_id Optional. Topic id * @param bool $refresh If set to true, unsets all the previous parameters. * Defaults to true * @uses bbp_get_reply_id() To get the reply id * @uses bbp_get_reply_topic_id() To get the reply topic id * @uses bbp_get_reply_forum_id() To get the reply forum id * @uses get_post_ancestors() To get the ancestors of the reply * @uses bbp_is_reply() To check if the ancestor is a reply * @uses bbp_is_topic() To check if the ancestor is a topic * @uses bbp_update_topic_last_reply_id() To update the topic last reply id * @uses bbp_update_topic_last_active_id() To update the topic last active id * @uses bbp_get_topic_last_active_id() To get the topic last active id * @uses get_post_field() To get the post date of the last active id * @uses bbp_update_topic_last_active_time() To update the last active topic meta * @uses bbp_update_topic_voice_count() To update the topic voice count * @uses bbp_update_topic_reply_count() To update the topic reply count * @uses bbp_update_topic_reply_count_hidden() To update the topic hidden reply * count * @uses bbp_is_forum() To check if the ancestor is a forum * @uses bbp_update_forum_last_topic_id() To update the last topic id forum meta * @uses bbp_update_forum_last_reply_id() To update the last reply id forum meta * @uses bbp_update_forum_last_active_id() To update the forum last active id * @uses bbp_get_forum_last_active_id() To get the forum last active id * @uses bbp_update_forum_last_active_time() To update the forum last active time * @uses bbp_update_forum_reply_count() To update the forum reply count */ function bbp_update_reply_walker($reply_id, $last_active_time = '', $forum_id = 0, $topic_id = 0, $refresh = true) { // Verify the reply ID $reply_id = bbp_get_reply_id($reply_id); // Reply was passed if (!empty($reply_id)) { // Get the topic ID if none was passed if (empty($topic_id)) { $topic_id = bbp_get_reply_topic_id($reply_id); // Make every effort to get topic id // https://bbpress.trac.wordpress.org/ticket/2529 if (empty($topic_id) && current_filter() === 'bbp_deleted_reply') { $topic_id = get_post_field('post_parent', $reply_id); } } // Get the forum ID if none was passed if (empty($forum_id)) { $forum_id = bbp_get_reply_forum_id($reply_id); } } // Set the active_id based on topic_id/reply_id $active_id = empty($reply_id) ? $topic_id : $reply_id; // Setup ancestors array to walk up $ancestors = array_values(array_unique(array_merge(array($topic_id, $forum_id), (array) get_post_ancestors($topic_id)))); // If we want a full refresh, unset any of the possibly passed variables if (true === $refresh) { $forum_id = $topic_id = $reply_id = $active_id = $last_active_time = 0; } // Walk up ancestors if (!empty($ancestors)) { foreach ($ancestors as $ancestor) { // Reply meta relating to most recent reply if (bbp_is_reply($ancestor)) { // @todo - hierarchical replies // Topic meta relating to most recent reply } elseif (bbp_is_topic($ancestor)) { // Last reply and active ID's bbp_update_topic_last_reply_id($ancestor, $reply_id); bbp_update_topic_last_active_id($ancestor, $active_id); // Get the last active time if none was passed $topic_last_active_time = $last_active_time; if (empty($last_active_time)) { $topic_last_active_time = get_post_field('post_date', bbp_get_topic_last_active_id($ancestor)); } // Update the topic last active time regardless of reply status. // See https://bbpress.trac.wordpress.org/ticket/2838 bbp_update_topic_last_active_time($ancestor, $topic_last_active_time); // Counts bbp_update_topic_voice_count($ancestor); // Only update reply count if we're deleting a reply, or in the dashboard. if (in_array(current_filter(), array('bbp_deleted_reply', 'save_post'), true)) { bbp_update_topic_reply_count($ancestor); bbp_update_topic_reply_count_hidden($ancestor); } // Forum meta relating to most recent topic } elseif (bbp_is_forum($ancestor)) { // Last topic and reply ID's bbp_update_forum_last_topic_id($ancestor, $topic_id); bbp_update_forum_last_reply_id($ancestor, $reply_id); // Last Active bbp_update_forum_last_active_id($ancestor, $active_id); // Get the last active time if none was passed $forum_last_active_time = $last_active_time; if (empty($last_active_time)) { $forum_last_active_time = get_post_field('post_date', bbp_get_forum_last_active_id($ancestor)); } // Only update if reply is published if (bbp_is_reply_published($reply_id)) { bbp_update_forum_last_active_time($ancestor, $forum_last_active_time); } // Counts // Only update reply count if we're deleting a reply, or in the dashboard. if (in_array(current_filter(), array('bbp_deleted_reply', 'save_post'), true)) { bbp_update_forum_reply_count($ancestor); } } } } }