Example #1
0
/**
 * Handles the front end topic submission
 *
 * @param string $action The requested action to compare this function to
 * @uses bbp_add_error() To add an error message
 * @uses bbp_verify_nonce_request() To verify the nonce and check the referer
 * @uses bbp_is_anonymous() To check if an anonymous post is being made
 * @uses current_user_can() To check if the current user can publish topic
 * @uses bbp_get_current_user_id() To get the current user id
 * @uses bbp_filter_anonymous_post_data() To filter anonymous data
 * @uses bbp_set_current_anonymous_user_data() To set the anonymous user cookies
 * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
 * @uses esc_attr() For sanitization
 * @uses bbp_is_forum_category() To check if the forum is a category
 * @uses bbp_is_forum_closed() To check if the forum is closed
 * @uses bbp_is_forum_private() To check if the forum is private
 * @uses bbp_check_for_flood() To check for flooding
 * @uses bbp_check_for_duplicate() To check for duplicates
 * @uses bbp_get_topic_post_type() To get the topic post type
 * @uses remove_filter() To remove kses filters if needed
 * @uses apply_filters() Calls 'bbp_new_topic_pre_title' with the content
 * @uses apply_filters() Calls 'bbp_new_topic_pre_content' with the content
 * @uses bbPress::errors::get_error_codes() To get the {@link WP_Error} errors
 * @uses wp_insert_post() To insert the topic
 * @uses do_action() Calls 'bbp_new_topic' with the topic id, forum id,
 *                    anonymous data and reply author
 * @uses bbp_stick_topic() To stick or super stick the topic
 * @uses bbp_unstick_topic() To unstick the topic
 * @uses bbp_get_topic_permalink() To get the topic permalink
 * @uses wp_safe_redirect() To redirect to the topic link
 * @uses bbPress::errors::get_error_messages() To get the {@link WP_Error} error
 *                                              messages
 */
function bbp_new_topic_handler($action = '')
{
    // Bail if action is not bbp-new-topic
    if ('bbp-new-topic' !== $action) {
        return;
    }
    // Nonce check
    if (!bbp_verify_nonce_request('bbp-new-topic')) {
        bbp_add_error('bbp_new_topic_nonce', __('<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress'));
        return;
    }
    // Define local variable(s)
    $view_all = false;
    $forum_id = $topic_author = $anonymous_data = 0;
    $topic_title = $topic_content = '';
    $terms = array(bbp_get_topic_tag_tax_id() => array());
    /** Topic Author **********************************************************/
    // User is anonymous
    if (bbp_is_anonymous()) {
        // Filter anonymous data
        $anonymous_data = bbp_filter_anonymous_post_data();
        // Anonymous data checks out, so set cookies, etc...
        if (!empty($anonymous_data) && is_array($anonymous_data)) {
            bbp_set_current_anonymous_user_data($anonymous_data);
        }
        // User is logged in
    } else {
        // User cannot create topics
        if (!current_user_can('publish_topics')) {
            bbp_add_error('bbp_topic_permissions', __('<strong>ERROR</strong>: You do not have permission to create new topics.', 'bbpress'));
            return;
        }
        // Topic author is current user
        $topic_author = bbp_get_current_user_id();
    }
    // Remove kses filters from title and content for capable users and if the nonce is verified
    if (current_user_can('unfiltered_html') && !empty($_POST['_bbp_unfiltered_html_topic']) && wp_create_nonce('bbp-unfiltered-html-topic_new') === $_POST['_bbp_unfiltered_html_topic']) {
        remove_filter('bbp_new_topic_pre_title', 'wp_filter_kses');
        remove_filter('bbp_new_topic_pre_content', 'bbp_encode_bad', 10);
        remove_filter('bbp_new_topic_pre_content', 'bbp_filter_kses', 30);
    }
    /** Topic Title ***********************************************************/
    if (!empty($_POST['bbp_topic_title'])) {
        $topic_title = esc_attr(strip_tags($_POST['bbp_topic_title']));
    }
    // Filter and sanitize
    $topic_title = apply_filters('bbp_new_topic_pre_title', $topic_title);
    // No topic title
    if (empty($topic_title)) {
        bbp_add_error('bbp_topic_title', __('<strong>ERROR</strong>: Your topic needs a title.', 'bbpress'));
    }
    /** Topic Content *********************************************************/
    if (!empty($_POST['bbp_topic_content'])) {
        $topic_content = $_POST['bbp_topic_content'];
    }
    // Filter and sanitize
    $topic_content = apply_filters('bbp_new_topic_pre_content', $topic_content);
    // No topic content
    if (empty($topic_content)) {
        bbp_add_error('bbp_topic_content', __('<strong>ERROR</strong>: Your topic cannot be empty.', 'bbpress'));
    }
    /** Topic Forum ***********************************************************/
    // Error check the POST'ed topic id
    if (isset($_POST['bbp_forum_id'])) {
        // Empty Forum id was passed
        if (empty($_POST['bbp_forum_id'])) {
            bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum ID is missing.', 'bbpress'));
            // Forum id is not a number
        } elseif (!is_numeric($_POST['bbp_forum_id'])) {
            bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum ID must be a number.', 'bbpress'));
            // Forum id might be valid
        } else {
            // Get the forum id
            $posted_forum_id = intval($_POST['bbp_forum_id']);
            // Forum id is empty
            if (0 === $posted_forum_id) {
                bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum ID is missing.', 'bbpress'));
                // Forum id is a negative number
            } elseif (0 > $posted_forum_id) {
                bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum ID cannot be a negative number.', 'bbpress'));
                // Forum does not exist
            } elseif (!bbp_get_forum($posted_forum_id)) {
                bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum does not exist.', 'bbpress'));
                // Use the POST'ed forum id
            } else {
                $forum_id = $posted_forum_id;
            }
        }
    }
    // Forum exists
    if (!empty($forum_id)) {
        // Forum is a category
        if (bbp_is_forum_category($forum_id)) {
            bbp_add_error('bbp_new_topic_forum_category', __('<strong>ERROR</strong>: This forum is a category. No topics can be created in this forum.', 'bbpress'));
            // Forum is not a category
        } else {
            // Forum is closed and user cannot access
            if (bbp_is_forum_closed($forum_id) && !current_user_can('edit_forum', $forum_id)) {
                bbp_add_error('bbp_new_topic_forum_closed', __('<strong>ERROR</strong>: This forum has been closed to new topics.', 'bbpress'));
            }
            // Forum is private and user cannot access
            if (bbp_is_forum_private($forum_id)) {
                if (!current_user_can('read_private_forums')) {
                    bbp_add_error('bbp_new_topic_forum_private', __('<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new topics in it.', 'bbpress'));
                }
                // Forum is hidden and user cannot access
            } elseif (bbp_is_forum_hidden($forum_id)) {
                if (!current_user_can('read_hidden_forums')) {
                    bbp_add_error('bbp_new_topic_forum_hidden', __('<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new topics in it.', 'bbpress'));
                }
            }
        }
    }
    /** Topic Flooding ********************************************************/
    if (!bbp_check_for_flood($anonymous_data, $topic_author)) {
        bbp_add_error('bbp_topic_flood', __('<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress'));
    }
    /** Topic Duplicate *******************************************************/
    if (!bbp_check_for_duplicate(array('post_type' => bbp_get_topic_post_type(), 'post_author' => $topic_author, 'post_content' => $topic_content, 'anonymous_data' => $anonymous_data))) {
        bbp_add_error('bbp_topic_duplicate', __('<strong>ERROR</strong>: Duplicate topic detected; it looks as though you&#8217;ve already said that!', 'bbpress'));
    }
    /** Topic Blacklist *******************************************************/
    if (!bbp_check_for_blacklist($anonymous_data, $topic_author, $topic_title, $topic_content)) {
        bbp_add_error('bbp_topic_blacklist', __('<strong>ERROR</strong>: Your topic cannot be created at this time.', 'bbpress'));
    }
    /** Topic Status **********************************************************/
    // Maybe put into moderation
    if (!bbp_check_for_moderation($anonymous_data, $topic_author, $topic_title, $topic_content)) {
        $topic_status = bbp_get_pending_status_id();
        // Check a whitelist of possible topic status ID's
    } elseif (!empty($_POST['bbp_topic_status']) && in_array($_POST['bbp_topic_status'], array_keys(bbp_get_topic_statuses()))) {
        $topic_status = $_POST['bbp_topic_status'];
        // Default to published if nothing else
    } else {
        $topic_status = bbp_get_public_status_id();
    }
    /** Topic Tags ************************************************************/
    if (bbp_allow_topic_tags() && !empty($_POST['bbp_topic_tags'])) {
        // Escape tag input
        $terms = esc_attr(strip_tags($_POST['bbp_topic_tags']));
        // Explode by comma
        if (strstr($terms, ',')) {
            $terms = explode(',', $terms);
        }
        // Add topic tag ID as main key
        $terms = array(bbp_get_topic_tag_tax_id() => $terms);
    }
    /** Additional Actions (Before Save) **************************************/
    do_action('bbp_new_topic_pre_extras', $forum_id);
    // Bail if errors
    if (bbp_has_errors()) {
        return;
    }
    /** No Errors *************************************************************/
    // Add the content of the form to $topic_data as an array.
    // Just in time manipulation of topic data before being created
    $topic_data = apply_filters('bbp_new_topic_pre_insert', array('post_author' => $topic_author, 'post_title' => $topic_title, 'post_content' => $topic_content, 'post_status' => $topic_status, 'post_parent' => $forum_id, 'post_type' => bbp_get_topic_post_type(), 'tax_input' => $terms, 'comment_status' => 'closed'));
    // Insert topic
    $topic_id = wp_insert_post($topic_data);
    /** No Errors *************************************************************/
    if (!empty($topic_id) && !is_wp_error($topic_id)) {
        /** Trash Check *******************************************************/
        // If the forum is trash, or the topic_status is switched to
        // trash, trash it properly
        if (get_post_field('post_status', $forum_id) === bbp_get_trash_status_id() || $topic_data['post_status'] === bbp_get_trash_status_id()) {
            // Trash the reply
            wp_trash_post($topic_id);
            // Force view=all
            $view_all = true;
        }
        /** Spam Check ********************************************************/
        // If reply or topic are spam, officially spam this reply
        if ($topic_data['post_status'] === bbp_get_spam_status_id()) {
            add_post_meta($topic_id, '_bbp_spam_meta_status', bbp_get_public_status_id());
            // Force view=all
            $view_all = true;
        }
        /** Update counts, etc... *********************************************/
        do_action('bbp_new_topic', $topic_id, $forum_id, $anonymous_data, $topic_author);
        /** Stickies **********************************************************/
        // Sticky check after 'bbp_new_topic' action so forum ID meta is set
        if (!empty($_POST['bbp_stick_topic']) && in_array($_POST['bbp_stick_topic'], array('stick', 'super', 'unstick'))) {
            // What's the caps?
            if (current_user_can('moderate')) {
                // What's the haps?
                switch ($_POST['bbp_stick_topic']) {
                    // Sticky in this forum
                    case 'stick':
                        bbp_stick_topic($topic_id);
                        break;
                        // Super sticky in all forums
                    // Super sticky in all forums
                    case 'super':
                        bbp_stick_topic($topic_id, true);
                        break;
                        // We can avoid this as it is a new topic
                    // We can avoid this as it is a new topic
                    case 'unstick':
                    default:
                        break;
                }
            }
        }
        /** Additional Actions (After Save) ***********************************/
        do_action('bbp_new_topic_post_extras', $topic_id);
        /** Redirect **********************************************************/
        // Redirect to
        $redirect_to = bbp_get_redirect_to();
        // Get the topic URL
        $redirect_url = bbp_get_topic_permalink($topic_id, $redirect_to);
        // Add view all?
        if (bbp_get_view_all() || !empty($view_all)) {
            // User can moderate, so redirect to topic with view all set
            if (current_user_can('moderate')) {
                $redirect_url = bbp_add_view_all($redirect_url);
                // User cannot moderate, so redirect to forum
            } else {
                $redirect_url = bbp_get_forum_permalink($forum_id);
            }
        }
        // Allow to be filtered
        $redirect_url = apply_filters('bbp_new_topic_redirect_to', $redirect_url, $redirect_to, $topic_id);
        /** Successful Save ***************************************************/
        // Redirect back to new topic
        wp_safe_redirect($redirect_url);
        // For good measure
        exit;
        // Errors
    } else {
        $append_error = is_wp_error($topic_id) && $topic_id->get_error_message() ? $topic_id->get_error_message() . ' ' : '';
        bbp_add_error('bbp_topic_error', __('<strong>ERROR</strong>: The following problem(s) have been found with your topic:' . $append_error, 'bbpress'));
    }
}
Example #2
0
/**
 * Handles the front end forum submission
 *
 * @param string $action The requested action to compare this function to
 * @uses bbp_add_error() To add an error message
 * @uses bbp_verify_nonce_request() To verify the nonce and check the request
 * @uses bbp_is_anonymous() To check if an anonymous post is being made
 * @uses current_user_can() To check if the current user can publish forum
 * @uses bbp_get_current_user_id() To get the current user id
 * @uses bbp_filter_anonymous_post_data() To filter anonymous data
 * @uses bbp_set_current_anonymous_user_data() To set the anonymous user cookies
 * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
 * @uses esc_attr() For sanitization
 * @uses bbp_is_forum_category() To check if the forum is a category
 * @uses bbp_is_forum_closed() To check if the forum is closed
 * @uses bbp_is_forum_private() To check if the forum is private
 * @uses bbp_check_for_flood() To check for flooding
 * @uses bbp_check_for_duplicate() To check for duplicates
 * @uses bbp_get_forum_post_type() To get the forum post type
 * @uses remove_filter() To remove kses filters if needed
 * @uses apply_filters() Calls 'bbp_new_forum_pre_title' with the content
 * @uses apply_filters() Calls 'bbp_new_forum_pre_content' with the content
 * @uses bbPress::errors::get_error_codes() To get the {@link WP_Error} errors
 * @uses wp_insert_post() To insert the forum
 * @uses do_action() Calls 'bbp_new_forum' with the forum id, forum id,
 *                    anonymous data and reply author
 * @uses bbp_stick_forum() To stick or super stick the forum
 * @uses bbp_unstick_forum() To unstick the forum
 * @uses bbp_get_forum_permalink() To get the forum permalink
 * @uses wp_safe_redirect() To redirect to the forum link
 * @uses bbPress::errors::get_error_messages() To get the {@link WP_Error} error
 *                                              messages
 */
function bbp_new_forum_handler($action = '')
{
    // Bail if action is not bbp-new-forum
    if ('bbp-new-forum' !== $action) {
        return;
    }
    // Nonce check
    if (!bbp_verify_nonce_request('bbp-new-forum')) {
        bbp_add_error('bbp_new_forum_nonce', __('<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress'));
        return;
    }
    // Define local variable(s)
    $view_all = $anonymous_data = false;
    $forum_parent_id = $forum_author = 0;
    $forum_title = $forum_content = '';
    /** Forum Author **********************************************************/
    // User cannot create forums
    if (!current_user_can('publish_forums')) {
        bbp_add_error('bbp_forum_permissions', __('<strong>ERROR</strong>: You do not have permission to create new forums.', 'bbpress'));
        return;
    }
    // Forum author is current user
    $forum_author = bbp_get_current_user_id();
    // Remove kses filters from title and content for capable users and if the nonce is verified
    if (current_user_can('unfiltered_html') && !empty($_POST['_bbp_unfiltered_html_forum']) && wp_create_nonce('bbp-unfiltered-html-forum_new') === $_POST['_bbp_unfiltered_html_forum']) {
        remove_filter('bbp_new_forum_pre_title', 'wp_filter_kses');
        remove_filter('bbp_new_forum_pre_content', 'bbp_encode_bad', 10);
        remove_filter('bbp_new_forum_pre_content', 'bbp_filter_kses', 30);
    }
    /** Forum Title ***********************************************************/
    if (!empty($_POST['bbp_forum_title'])) {
        $forum_title = esc_attr(strip_tags($_POST['bbp_forum_title']));
    }
    // Filter and sanitize
    $forum_title = apply_filters('bbp_new_forum_pre_title', $forum_title);
    // No forum title
    if (empty($forum_title)) {
        bbp_add_error('bbp_forum_title', __('<strong>ERROR</strong>: Your forum needs a title.', 'bbpress'));
    }
    /** Forum Content *********************************************************/
    if (!empty($_POST['bbp_forum_content'])) {
        $forum_content = $_POST['bbp_forum_content'];
    }
    // Filter and sanitize
    $forum_content = apply_filters('bbp_new_forum_pre_content', $forum_content);
    // No forum content
    if (empty($forum_content)) {
        bbp_add_error('bbp_forum_content', __('<strong>ERROR</strong>: Your forum description cannot be empty.', 'bbpress'));
    }
    /** Forum Parent **********************************************************/
    // Forum parent was passed (the norm)
    if (!empty($_POST['bbp_forum_parent_id'])) {
        $forum_parent_id = bbp_get_forum_id($_POST['bbp_forum_parent_id']);
    }
    // Filter and sanitize
    $forum_parent_id = apply_filters('bbp_new_forum_pre_parent_id', $forum_parent_id);
    // No forum parent was passed (should never happen)
    if (empty($forum_parent_id)) {
        bbp_add_error('bbp_new_forum_missing_parent', __('<strong>ERROR</strong>: Your forum must have a parent.', 'bbpress'));
        // Forum exists
    } elseif (!empty($forum_parent_id)) {
        // Forum is a category
        if (bbp_is_forum_category($forum_parent_id)) {
            bbp_add_error('bbp_new_forum_forum_category', __('<strong>ERROR</strong>: This forum is a category. No forums can be created in this forum.', 'bbpress'));
        }
        // Forum is closed and user cannot access
        if (bbp_is_forum_closed($forum_parent_id) && !current_user_can('edit_forum', $forum_parent_id)) {
            bbp_add_error('bbp_new_forum_forum_closed', __('<strong>ERROR</strong>: This forum has been closed to new forums.', 'bbpress'));
        }
        // Forum is private and user cannot access
        if (bbp_is_forum_private($forum_parent_id) && !current_user_can('read_private_forums')) {
            bbp_add_error('bbp_new_forum_forum_private', __('<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new forums in it.', 'bbpress'));
        }
        // Forum is hidden and user cannot access
        if (bbp_is_forum_hidden($forum_parent_id) && !current_user_can('read_hidden_forums')) {
            bbp_add_error('bbp_new_forum_forum_hidden', __('<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new forums in it.', 'bbpress'));
        }
    }
    /** Forum Flooding ********************************************************/
    if (!bbp_check_for_flood($anonymous_data, $forum_author)) {
        bbp_add_error('bbp_forum_flood', __('<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress'));
    }
    /** Forum Duplicate *******************************************************/
    if (!bbp_check_for_duplicate(array('post_type' => bbp_get_forum_post_type(), 'post_author' => $forum_author, 'post_content' => $forum_content, 'anonymous_data' => $anonymous_data))) {
        bbp_add_error('bbp_forum_duplicate', __('<strong>ERROR</strong>: This forum already exists.', 'bbpress'));
    }
    /** Forum Blacklist *******************************************************/
    if (!bbp_check_for_blacklist($anonymous_data, $forum_author, $forum_title, $forum_content)) {
        bbp_add_error('bbp_forum_blacklist', __('<strong>ERROR</strong>: Your forum cannot be created at this time.', 'bbpress'));
    }
    /** Forum Moderation ******************************************************/
    $post_status = bbp_get_public_status_id();
    if (!bbp_check_for_moderation($anonymous_data, $forum_author, $forum_title, $forum_content)) {
        $post_status = bbp_get_pending_status_id();
    }
    /** Additional Actions (Before Save) **************************************/
    do_action('bbp_new_forum_pre_extras', $forum_parent_id);
    // Bail if errors
    if (bbp_has_errors()) {
        return;
    }
    /** No Errors *************************************************************/
    // Add the content of the form to $forum_data as an array
    // Just in time manipulation of forum data before being created
    $forum_data = apply_filters('bbp_new_forum_pre_insert', array('post_author' => $forum_author, 'post_title' => $forum_title, 'post_content' => $forum_content, 'post_parent' => $forum_parent_id, 'post_status' => $post_status, 'post_type' => bbp_get_forum_post_type(), 'comment_status' => 'closed'));
    // Insert forum
    $forum_id = wp_insert_post($forum_data);
    /** No Errors *************************************************************/
    if (!empty($forum_id) && !is_wp_error($forum_id)) {
        /** Trash Check *******************************************************/
        // If the forum is trash, or the forum_status is switched to
        // trash, trash it properly
        if (get_post_field('post_status', $forum_id) === bbp_get_trash_status_id() || $forum_data['post_status'] === bbp_get_trash_status_id()) {
            // Trash the reply
            wp_trash_post($forum_id);
            // Force view=all
            $view_all = true;
        }
        /** Spam Check ********************************************************/
        // If reply or forum are spam, officially spam this reply
        if ($forum_data['post_status'] === bbp_get_spam_status_id()) {
            add_post_meta($forum_id, '_bbp_spam_meta_status', bbp_get_public_status_id());
            // Force view=all
            $view_all = true;
        }
        /** Update counts, etc... *********************************************/
        do_action('bbp_new_forum', array('forum_id' => $forum_id, 'post_parent' => $forum_parent_id, 'forum_author' => $forum_author, 'last_topic_id' => 0, 'last_reply_id' => 0, 'last_active_id' => 0, 'last_active_time' => 0, 'last_active_status' => bbp_get_public_status_id()));
        /** Additional Actions (After Save) ***********************************/
        do_action('bbp_new_forum_post_extras', $forum_id);
        /** Redirect **********************************************************/
        // Redirect to
        $redirect_to = bbp_get_redirect_to();
        // Get the forum URL
        $redirect_url = bbp_get_forum_permalink($forum_id, $redirect_to);
        // Add view all?
        if (bbp_get_view_all() || !empty($view_all)) {
            // User can moderate, so redirect to forum with view all set
            if (current_user_can('moderate')) {
                $redirect_url = bbp_add_view_all($redirect_url);
                // User cannot moderate, so redirect to forum
            } else {
                $redirect_url = bbp_get_forum_permalink($forum_id);
            }
        }
        // Allow to be filtered
        $redirect_url = apply_filters('bbp_new_forum_redirect_to', $redirect_url, $redirect_to);
        /** Successful Save ***************************************************/
        // Redirect back to new forum
        wp_safe_redirect($redirect_url);
        // For good measure
        exit;
        // Errors
    } else {
        $append_error = is_wp_error($forum_id) && $forum_id->get_error_message() ? $forum_id->get_error_message() . ' ' : '';
        bbp_add_error('bbp_forum_error', __('<strong>ERROR</strong>: The following problem(s) have been found with your forum:' . $append_error, 'bbpress'));
    }
}
Example #3
0
/**
 * Handles the front end reply submission
 *
 * @since bbPress (r2574)
 *
 * @uses bbp_add_error() To add an error message
 * @uses bbp_verify_nonce_request() To verify the nonce and check the request
 * @uses bbp_is_anonymous() To check if an anonymous post is being made
 * @uses current_user_can() To check if the current user can publish replies
 * @uses bbp_get_current_user_id() To get the current user id
 * @uses bbp_filter_anonymous_post_data() To filter anonymous data
 * @uses bbp_set_current_anonymous_user_data() To set the anonymous user
 *                                                cookies
 * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
 * @uses remove_filter() To remove 'wp_filter_kses' filters if needed
 * @uses esc_attr() For sanitization
 * @uses bbp_check_for_flood() To check for flooding
 * @uses bbp_check_for_duplicate() To check for duplicates
 * @uses apply_filters() Calls 'bbp_new_reply_pre_title' with the title
 * @uses apply_filters() Calls 'bbp_new_reply_pre_content' with the content
 * @uses bbp_get_reply_post_type() To get the reply post type
 * @uses wp_set_post_terms() To set the topic tags
 * @uses wp_insert_post() To insert the reply
 * @uses do_action() Calls 'bbp_new_reply' with the reply id, topic id, forum
 *                    id, anonymous data and reply author
 * @uses bbp_get_reply_url() To get the paginated url to the reply
 * @uses wp_safe_redirect() To redirect to the reply url
 * @uses bbPress::errors::get_error_message() To get the {@link WP_Error} error
 *                                              message
 */
function bbp_new_reply_handler()
{
    // Bail if not a POST action
    if ('POST' !== strtoupper($_SERVER['REQUEST_METHOD'])) {
        return;
    }
    // Bail if action is not bbp-new-reply
    if (empty($_POST['action']) || 'bbp-new-reply' !== $_POST['action']) {
        return;
    }
    // Nonce check
    if (!bbp_verify_nonce_request('bbp-new-reply')) {
        bbp_add_error('bbp_rew_reply_nonce', __('<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress'));
        return;
    }
    // Define local variable(s)
    $topic_id = $forum_id = $reply_author = $anonymous_data = 0;
    $reply_title = $reply_content = $terms = '';
    /** Reply Author **********************************************************/
    // User is anonymous
    if (bbp_is_anonymous()) {
        // Filter anonymous data
        $anonymous_data = bbp_filter_anonymous_post_data();
        // Anonymous data checks out, so set cookies, etc...
        if (!empty($anonymous_data) && is_array($anonymous_data)) {
            bbp_set_current_anonymous_user_data($anonymous_data);
        }
        // User is logged in
    } else {
        // User cannot create replies
        if (!current_user_can('publish_replies')) {
            bbp_add_error('bbp_reply_permissions', __('<strong>ERROR</strong>: You do not have permission to reply.', 'bbpress'));
        }
        // Reply author is current user
        $reply_author = bbp_get_current_user_id();
    }
    /** Topic ID **************************************************************/
    // Handle Topic ID to append reply to
    if (isset($_POST['bbp_topic_id'])) {
        $topic_id = (int) $_POST['bbp_topic_id'];
    } else {
        bbp_add_error('bbp_reply_topic_id', __('<strong>ERROR</strong>: Topic ID is missing.', 'bbpress'));
    }
    /** Forum ID **************************************************************/
    // Handle Forum ID to adjust counts of
    if (isset($_POST['bbp_forum_id'])) {
        $forum_id = (int) $_POST['bbp_forum_id'];
    } elseif (!empty($topic_id)) {
        $forum_id = bbp_get_topic_forum_id($topic_id);
    } else {
        bbp_add_error('bbp_reply_forum_id', __('<strong>ERROR</strong>: Forum ID is missing.', 'bbpress'));
    }
    /** Unfiltered HTML *******************************************************/
    // Remove wp_filter_kses filters from title and content for capable users and if the nonce is verified
    if (current_user_can('unfiltered_html') && !empty($_POST['_bbp_unfiltered_html_reply']) && wp_create_nonce('bbp-unfiltered-html-reply_' . $topic_id) == $_POST['_bbp_unfiltered_html_reply']) {
        remove_filter('bbp_new_reply_pre_title', 'wp_filter_kses');
        remove_filter('bbp_new_reply_pre_content', 'wp_filter_kses');
    }
    /** Reply Title ***********************************************************/
    if (!empty($_POST['bbp_reply_title'])) {
        $reply_title = esc_attr(strip_tags($_POST['bbp_reply_title']));
    }
    // Filter and sanitize
    $reply_title = apply_filters('bbp_new_reply_pre_title', $reply_title);
    // No reply title
    if (empty($reply_title)) {
        bbp_add_error('bbp_reply_title', __('<strong>ERROR</strong>: Your reply needs a title.', 'bbpress'));
    }
    /** Reply Content *********************************************************/
    if (!empty($_POST['bbp_reply_content'])) {
        $reply_content = $_POST['bbp_reply_content'];
    }
    // Filter and sanitize
    $reply_content = apply_filters('bbp_new_reply_pre_content', $reply_content);
    // No reply content
    if (empty($reply_content)) {
        bbp_add_error('bbp_reply_content', __('<strong>ERROR</strong>: Your reply cannot be empty.', 'bbpress'));
    }
    /** Reply Flooding ********************************************************/
    if (!bbp_check_for_flood($anonymous_data, $reply_author)) {
        bbp_add_error('bbp_reply_flood', __('<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress'));
    }
    /** Reply Duplicate *******************************************************/
    if (!bbp_check_for_duplicate(array('post_type' => bbp_get_reply_post_type(), 'post_author' => $reply_author, 'post_content' => $reply_content, 'post_parent' => $topic_id, 'anonymous_data' => $anonymous_data))) {
        bbp_add_error('bbp_reply_duplicate', __('<strong>ERROR</strong>: Duplicate reply detected; it looks as though you&#8217;ve already said that!', 'bbpress'));
    }
    /** Reply Blacklist *******************************************************/
    if (!bbp_check_for_blacklist($anonymous_data, $reply_author, $reply_title, $reply_content)) {
        bbp_add_error('bbp_reply_blacklist', __('<strong>ERROR</strong>: Your reply cannot be created at this time.', 'bbpress'));
    }
    /** Reply Moderation ******************************************************/
    $post_status = bbp_get_public_status_id();
    if (!bbp_check_for_moderation($anonymous_data, $reply_author, $reply_title, $reply_content)) {
        $post_status = bbp_get_pending_status_id();
    }
    /** Topic Tags ************************************************************/
    if (!empty($_POST['bbp_topic_tags'])) {
        $terms = esc_attr(strip_tags($_POST['bbp_topic_tags']));
    }
    /** Additional Actions (Before Save) **************************************/
    do_action('bbp_new_reply_pre_extras', $topic_id, $forum_id);
    // Bail if errors
    if (bbp_has_errors()) {
        return;
    }
    /** No Errors *************************************************************/
    // Add the content of the form to $reply_data as an array
    // Just in time manipulation of reply data before being created
    $reply_data = apply_filters('bbp_new_reply_pre_insert', array('post_author' => $reply_author, 'post_title' => $reply_title, 'post_content' => $reply_content, 'post_parent' => $topic_id, 'post_status' => $post_status, 'post_type' => bbp_get_reply_post_type(), 'comment_status' => 'closed', 'menu_order' => (int) (bbp_get_topic_reply_count($topic_id) + 1)));
    // Insert reply
    $reply_id = wp_insert_post($reply_data);
    /** No Errors *************************************************************/
    // Check for missing reply_id or error
    if (!empty($reply_id) && !is_wp_error($reply_id)) {
        /** Topic Tags ********************************************************/
        // Just in time manipulation of reply terms before being edited
        $terms = apply_filters('bbp_new_reply_pre_set_terms', $terms, $topic_id, $reply_id);
        // Insert terms
        $terms = wp_set_post_terms($topic_id, $terms, bbp_get_topic_tag_tax_id(), false);
        // Term error
        if (is_wp_error($terms)) {
            bbp_add_error('bbp_reply_tags', __('<strong>ERROR</strong>: There was a problem adding the tags to the topic.', 'bbpress'));
        }
        /** Trash Check *******************************************************/
        // If this reply starts as trash, add it to pre_trashed_replies
        // for the topic, so it is properly restored.
        if (bbp_is_topic_trash($topic_id) || $reply_data['post_status'] == bbp_get_trash_status_id()) {
            // Trash the reply
            wp_trash_post($reply_id);
            // Get pre_trashed_replies for topic
            $pre_trashed_replies = get_post_meta($topic_id, '_bbp_pre_trashed_replies', true);
            // Add this reply to the end of the existing replies
            $pre_trashed_replies[] = $reply_id;
            // Update the pre_trashed_reply post meta
            update_post_meta($topic_id, '_bbp_pre_trashed_replies', $pre_trashed_replies);
        }
        /** Spam Check ********************************************************/
        // If reply or topic are spam, officially spam this reply
        if (bbp_is_topic_spam($topic_id) || $reply_data['post_status'] == bbp_get_spam_status_id()) {
            add_post_meta($reply_id, '_bbp_spam_meta_status', bbp_get_public_status_id());
        }
        /** Update counts, etc... *********************************************/
        do_action('bbp_new_reply', $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author);
        /** Additional Actions (After Save) ***********************************/
        do_action('bbp_new_reply_post_extras', $reply_id);
        /** Redirect **********************************************************/
        // Redirect to
        $redirect_to = !empty($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : '';
        // Get the reply URL
        $reply_url = bbp_get_reply_url($reply_id, $redirect_to);
        // Allow to be filtered
        $reply_url = apply_filters('bbp_new_reply_redirect_to', $reply_url, $redirect_to, $reply_id);
        /** Successful Save ***************************************************/
        // Redirect back to new reply
        wp_safe_redirect($reply_url);
        // For good measure
        exit;
        /** Errors ****************************************************************/
    } else {
        $append_error = is_wp_error($reply_id) && $reply_id->get_error_message() ? $reply_id->get_error_message() . ' ' : '';
        bbp_add_error('bbp_reply_error', __('<strong>ERROR</strong>: The following problem(s) have been found with your reply:' . $append_error . 'Please try again.', 'bbpress'));
    }
}
/**
 * Handles the front end reply submission
 *
 * @since bbPress (r2574)
 *
 * @param string $action The requested action to compare this function to
 * @uses bbp_add_error() To add an error message
 * @uses bbp_verify_nonce_request() To verify the nonce and check the request
 * @uses bbp_is_anonymous() To check if an anonymous post is being made
 * @uses current_user_can() To check if the current user can publish replies
 * @uses bbp_get_current_user_id() To get the current user id
 * @uses bbp_filter_anonymous_post_data() To filter anonymous data
 * @uses bbp_set_current_anonymous_user_data() To set the anonymous user
 *                                                cookies
 * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
 * @uses remove_filter() To remove kses filters if needed
 * @uses esc_attr() For sanitization
 * @uses bbp_check_for_flood() To check for flooding
 * @uses bbp_check_for_duplicate() To check for duplicates
 * @uses apply_filters() Calls 'bbp_new_reply_pre_title' with the title
 * @uses apply_filters() Calls 'bbp_new_reply_pre_content' with the content
 * @uses bbp_get_reply_post_type() To get the reply post type
 * @uses wp_set_post_terms() To set the topic tags
 * @uses wp_insert_post() To insert the reply
 * @uses do_action() Calls 'bbp_new_reply' with the reply id, topic id, forum
 *                    id, anonymous data, reply author, edit (false), and
 *                    the reply to id
 * @uses bbp_get_reply_url() To get the paginated url to the reply
 * @uses wp_safe_redirect() To redirect to the reply url
 * @uses bbPress::errors::get_error_message() To get the {@link WP_Error} error
 *                                              message
 */
function bbp_new_reply_handler($action = '')
{
    // Bail if action is not bbp-new-reply
    if ('bbp-new-reply' !== $action) {
        return;
    }
    // Nonce check
    if (!bbp_verify_nonce_request('bbp-new-reply')) {
        bbp_add_error('bbp_new_reply_nonce', __('<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress'));
        return;
    }
    // Define local variable(s)
    $topic_id = $forum_id = $reply_author = $anonymous_data = $reply_to = 0;
    $reply_title = $reply_content = $terms = '';
    /** Reply Author **********************************************************/
    // User is anonymous
    if (bbp_is_anonymous()) {
        // Filter anonymous data
        $anonymous_data = bbp_filter_anonymous_post_data();
        // Anonymous data checks out, so set cookies, etc...
        if (!empty($anonymous_data) && is_array($anonymous_data)) {
            bbp_set_current_anonymous_user_data($anonymous_data);
        }
        // User is logged in
    } else {
        // User cannot create replies
        if (!current_user_can('publish_replies')) {
            bbp_add_error('bbp_reply_permissions', __('<strong>ERROR</strong>: You do not have permission to reply.', 'bbpress'));
        }
        // Reply author is current user
        $reply_author = bbp_get_current_user_id();
    }
    /** Topic ID **************************************************************/
    // Topic id was not passed
    if (empty($_POST['bbp_topic_id'])) {
        bbp_add_error('bbp_reply_topic_id', __('<strong>ERROR</strong>: Topic ID is missing.', 'bbpress'));
        // Topic id is not a number
    } elseif (!is_numeric($_POST['bbp_topic_id'])) {
        bbp_add_error('bbp_reply_topic_id', __('<strong>ERROR</strong>: Topic ID must be a number.', 'bbpress'));
        // Topic id might be valid
    } else {
        // Get the topic id
        $posted_topic_id = intval($_POST['bbp_topic_id']);
        // Topic id is a negative number
        if (0 > $posted_topic_id) {
            bbp_add_error('bbp_reply_topic_id', __('<strong>ERROR</strong>: Topic ID cannot be a negative number.', 'bbpress'));
            // Topic does not exist
        } elseif (!bbp_get_topic($posted_topic_id)) {
            bbp_add_error('bbp_reply_topic_id', __('<strong>ERROR</strong>: Topic does not exist.', 'bbpress'));
            // Use the POST'ed topic id
        } else {
            $topic_id = $posted_topic_id;
        }
    }
    /** Forum ID **************************************************************/
    // Try to use the forum id of the topic
    if (!isset($_POST['bbp_forum_id']) && !empty($topic_id)) {
        $forum_id = bbp_get_topic_forum_id($topic_id);
        // Error check the POST'ed forum id
    } elseif (isset($_POST['bbp_forum_id'])) {
        // Empty Forum id was passed
        if (empty($_POST['bbp_forum_id'])) {
            bbp_add_error('bbp_reply_forum_id', __('<strong>ERROR</strong>: Forum ID is missing.', 'bbpress'));
            // Forum id is not a number
        } elseif (!is_numeric($_POST['bbp_forum_id'])) {
            bbp_add_error('bbp_reply_forum_id', __('<strong>ERROR</strong>: Forum ID must be a number.', 'bbpress'));
            // Forum id might be valid
        } else {
            // Get the forum id
            $posted_forum_id = intval($_POST['bbp_forum_id']);
            // Forum id is empty
            if (0 === $posted_forum_id) {
                bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum ID is missing.', 'bbpress'));
                // Forum id is a negative number
            } elseif (0 > $posted_forum_id) {
                bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum ID cannot be a negative number.', 'bbpress'));
                // Forum does not exist
            } elseif (!bbp_get_forum($posted_forum_id)) {
                bbp_add_error('bbp_topic_forum_id', __('<strong>ERROR</strong>: Forum does not exist.', 'bbpress'));
                // Use the POST'ed forum id
            } else {
                $forum_id = $posted_forum_id;
            }
        }
    }
    // Forum exists
    if (!empty($forum_id)) {
        // Forum is a category
        if (bbp_is_forum_category($forum_id)) {
            bbp_add_error('bbp_new_reply_forum_category', __('<strong>ERROR</strong>: This forum is a category. No replies can be created in this forum.', 'bbpress'));
            // Forum is not a category
        } else {
            // Forum is closed and user cannot access
            if (bbp_is_forum_closed($forum_id) && !current_user_can('edit_forum', $forum_id)) {
                bbp_add_error('bbp_new_reply_forum_closed', __('<strong>ERROR</strong>: This forum has been closed to new replies.', 'bbpress'));
            }
            // Forum is private and user cannot access
            if (bbp_is_forum_private($forum_id)) {
                if (!current_user_can('read_private_forums')) {
                    bbp_add_error('bbp_new_reply_forum_private', __('<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new replies in it.', 'bbpress'));
                }
                // Forum is hidden and user cannot access
            } elseif (bbp_is_forum_hidden($forum_id)) {
                if (!current_user_can('read_hidden_forums')) {
                    bbp_add_error('bbp_new_reply_forum_hidden', __('<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new replies in it.', 'bbpress'));
                }
            }
        }
    }
    /** Unfiltered HTML *******************************************************/
    // Remove kses filters from title and content for capable users and if the nonce is verified
    if (current_user_can('unfiltered_html') && !empty($_POST['_bbp_unfiltered_html_reply']) && wp_create_nonce('bbp-unfiltered-html-reply_' . $topic_id) === $_POST['_bbp_unfiltered_html_reply']) {
        remove_filter('bbp_new_reply_pre_title', 'wp_filter_kses');
        remove_filter('bbp_new_reply_pre_content', 'bbp_encode_bad', 10);
        remove_filter('bbp_new_reply_pre_content', 'bbp_filter_kses', 30);
    }
    /** Reply Title ***********************************************************/
    if (!empty($_POST['bbp_reply_title'])) {
        $reply_title = esc_attr(strip_tags($_POST['bbp_reply_title']));
    }
    // Filter and sanitize
    $reply_title = apply_filters('bbp_new_reply_pre_title', $reply_title);
    /** Reply Content *********************************************************/
    if (!empty($_POST['bbp_reply_content'])) {
        $reply_content = $_POST['bbp_reply_content'];
    }
    // Filter and sanitize
    $reply_content = apply_filters('bbp_new_reply_pre_content', $reply_content);
    // No reply content
    if (empty($reply_content)) {
        bbp_add_error('bbp_reply_content', __('<strong>ERROR</strong>: Your reply cannot be empty.', 'bbpress'));
    }
    /** Reply Flooding ********************************************************/
    if (!bbp_check_for_flood($anonymous_data, $reply_author)) {
        bbp_add_error('bbp_reply_flood', __('<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress'));
    }
    /** Reply Duplicate *******************************************************/
    if (!bbp_check_for_duplicate(array('post_type' => bbp_get_reply_post_type(), 'post_author' => $reply_author, 'post_content' => $reply_content, 'post_parent' => $topic_id, 'anonymous_data' => $anonymous_data))) {
        bbp_add_error('bbp_reply_duplicate', __('<strong>ERROR</strong>: Duplicate reply detected; it looks as though you&#8217;ve already said that!', 'bbpress'));
    }
    /** Reply Blacklist *******************************************************/
    if (!bbp_check_for_blacklist($anonymous_data, $reply_author, $reply_title, $reply_content)) {
        bbp_add_error('bbp_reply_blacklist', __('<strong>ERROR</strong>: Your reply cannot be created at this time.', 'bbpress'));
    }
    /** Reply Status **********************************************************/
    // Maybe put into moderation
    if (!bbp_check_for_moderation($anonymous_data, $reply_author, $reply_title, $reply_content)) {
        $reply_status = bbp_get_pending_status_id();
        // Default
    } else {
        $reply_status = bbp_get_public_status_id();
    }
    /** Reply To **************************************************************/
    // Handle Reply To of the reply; $_REQUEST for non-JS submissions
    if (isset($_REQUEST['bbp_reply_to'])) {
        $reply_to = bbp_validate_reply_to($_REQUEST['bbp_reply_to']);
    }
    /** Topic Closed **********************************************************/
    // If topic is closed, moderators can still reply
    if (bbp_is_topic_closed($topic_id) && !current_user_can('moderate')) {
        bbp_add_error('bbp_reply_topic_closed', __('<strong>ERROR</strong>: Topic is closed.', 'bbpress'));
    }
    /** Topic Tags ************************************************************/
    // Either replace terms
    if (bbp_allow_topic_tags() && current_user_can('assign_topic_tags') && !empty($_POST['bbp_topic_tags'])) {
        $terms = esc_attr(strip_tags($_POST['bbp_topic_tags']));
        // ...or remove them.
    } elseif (isset($_POST['bbp_topic_tags'])) {
        $terms = '';
        // Existing terms
    } else {
        $terms = bbp_get_topic_tag_names($topic_id);
    }
    /** Additional Actions (Before Save) **************************************/
    do_action('bbp_new_reply_pre_extras', $topic_id, $forum_id);
    // Bail if errors
    if (bbp_has_errors()) {
        return;
    }
    /** No Errors *************************************************************/
    // Add the content of the form to $reply_data as an array
    // Just in time manipulation of reply data before being created
    $reply_data = apply_filters('bbp_new_reply_pre_insert', array('post_author' => $reply_author, 'post_title' => $reply_title, 'post_content' => $reply_content, 'post_status' => $reply_status, 'post_parent' => $topic_id, 'post_type' => bbp_get_reply_post_type(), 'comment_status' => 'closed', 'menu_order' => bbp_get_topic_reply_count($topic_id, false) + 1));
    // Insert reply
    $reply_id = wp_insert_post($reply_data);
    /** No Errors *************************************************************/
    // Check for missing reply_id or error
    if (!empty($reply_id) && !is_wp_error($reply_id)) {
        /** Topic Tags ********************************************************/
        // Just in time manipulation of reply terms before being edited
        $terms = apply_filters('bbp_new_reply_pre_set_terms', $terms, $topic_id, $reply_id);
        // Insert terms
        $terms = wp_set_post_terms($topic_id, $terms, bbp_get_topic_tag_tax_id(), false);
        // Term error
        if (is_wp_error($terms)) {
            bbp_add_error('bbp_reply_tags', __('<strong>ERROR</strong>: There was a problem adding the tags to the topic.', 'bbpress'));
        }
        /** Trash Check *******************************************************/
        // If this reply starts as trash, add it to pre_trashed_replies
        // for the topic, so it is properly restored.
        if (bbp_is_topic_trash($topic_id) || $reply_data['post_status'] === bbp_get_trash_status_id()) {
            // Trash the reply
            wp_trash_post($reply_id);
            // Only add to pre-trashed array if topic is trashed
            if (bbp_is_topic_trash($topic_id)) {
                // Get pre_trashed_replies for topic
                $pre_trashed_replies = get_post_meta($topic_id, '_bbp_pre_trashed_replies', true);
                // Add this reply to the end of the existing replies
                $pre_trashed_replies[] = $reply_id;
                // Update the pre_trashed_reply post meta
                update_post_meta($topic_id, '_bbp_pre_trashed_replies', $pre_trashed_replies);
            }
            /** Spam Check ********************************************************/
            // If reply or topic are spam, officially spam this reply
        } elseif (bbp_is_topic_spam($topic_id) || $reply_data['post_status'] === bbp_get_spam_status_id()) {
            add_post_meta($reply_id, '_bbp_spam_meta_status', bbp_get_public_status_id());
            // Only add to pre-spammed array if topic is spam
            if (bbp_is_topic_spam($topic_id)) {
                // Get pre_spammed_replies for topic
                $pre_spammed_replies = get_post_meta($topic_id, '_bbp_pre_spammed_replies', true);
                // Add this reply to the end of the existing replies
                $pre_spammed_replies[] = $reply_id;
                // Update the pre_spammed_replies post meta
                update_post_meta($topic_id, '_bbp_pre_spammed_replies', $pre_spammed_replies);
            }
        }
        /** Update counts, etc... *********************************************/
        do_action('bbp_new_reply', $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author, false, $reply_to);
        /** Additional Actions (After Save) ***********************************/
        do_action('bbp_new_reply_post_extras', $reply_id);
        /** Redirect **********************************************************/
        // Redirect to
        $redirect_to = bbp_get_redirect_to();
        // Get the reply URL
        $reply_url = bbp_get_reply_url($reply_id, $redirect_to);
        // Allow to be filtered
        $reply_url = apply_filters('bbp_new_reply_redirect_to', $reply_url, $redirect_to, $reply_id);
        /** Successful Save ***************************************************/
        // Redirect back to new reply
        wp_safe_redirect($reply_url);
        // For good measure
        exit;
        /** Errors ****************************************************************/
    } else {
        $append_error = is_wp_error($reply_id) && $reply_id->get_error_message() ? $reply_id->get_error_message() . ' ' : '';
        bbp_add_error('bbp_reply_error', __('<strong>ERROR</strong>: The following problem(s) have been found with your reply:' . $append_error . 'Please try again.', 'bbpress'));
    }
}
 /**
  * Post new topic by email handler.
  *
  * For bbPress, the logic in this method is the same as {@link bbp_new_topic_handler()}.
  * It's duplicated because bbPress doesn't utilize hooks for verifying topics.
  *
  * @todo No fancy support for topic tags, subscriptions yet. Will probably need shortcodes.
  *
  * @param array $data {
  *     An array of arguments.
  *
  *     @type array $headers Email headers.
  *     @type string $content The email body content.
  *     @type string $subject The email subject line.
  *     @type int $user_id The user ID who sent the email.
  *     @type bool $is_html Whether the email content is HTML or not.
  *     @type int $i The email message number.
  * }
  * @param array $params Parsed paramaters from the email address querystring.
  *   See {@link BP_Reply_By_Email_Parser::get_parameters()}.
  * @return array|object Array of the parsed item on success. WP_Error object
  *  on failure.
  */
 private function post_new_topic($data, $params)
 {
     //private function post_new_topic( $connection, $i, $headers, $params, $body, $topic_author ) {
     /** SETUP DATA ***************************************************/
     $i = $data['i'];
     $topic_author = $data['user_id'];
     $forum_id = $params[$this->forum_id_param];
     /* current email is a bbPress new topic, let's proceed! */
     // let RBE know that we're in the process of rendering a bbP new topic
     // BuddyPress group new topic
     if (!empty($params[$this->item_id_param])) {
         bp_rbe_log('Message #' . $i . ': this is a bbPress group forum new topic');
         // bbPress
     } else {
         bp_rbe_log('Message #' . $i . ': this is a bbPress new topic');
     }
     // other variables
     $anonymous_data = 0;
     /** GROUP PERMISSIONS ********************************************/
     // posting from a BP group
     if (!empty($params[$this->item_id_param])) {
         global $bp;
         // set group ID and cache it in global for later use
         // $bp->rbe->temp->group_id gets passed to the set_group_id() method later on
         $group_id = $bp->rbe->temp->group_id = $params[$this->item_id_param];
         // get all group member data for the user in one swoop!
         $group_member_data = bp_rbe_get_group_member_info($topic_author, $group_id);
         // user is not a member of the group anymore
         if (empty($group_member_data)) {
             //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'user_not_group_member' );
             return new WP_Error('user_not_group_member', '', $data);
         }
         // user is banned from group
         if ((int) $group_member_data->is_banned == 1) {
             //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'user_banned_from_group' );
             return new WP_Error('user_banned_from_group', '', $data);
         }
         // override groups_get_current_group() with our cached group ID
         add_filter('groups_get_current_group', array($this, 'set_group_id'));
         // temporarily add some GES filters here
         add_filter('bp_ass_activity_notification_subject', 'wp_specialchars_decode');
         add_filter('bp_ass_activity_notification_content', 'wp_specialchars_decode');
     }
     /** TOPIC / FORUM PERMISSIONS ************************************/
     // Allow member to pass default cap checks.
     // The reason why we keep the user_can() checks below is b/c bbPress
     // plugins may disable cap access for a specific user if they have hooked into
     // the 'bbp_map_meta_caps' filter.
     add_filter('bbp_map_meta_caps', array($this, 'map_forum_meta_caps'), 5, 4);
     // User cannot create topics
     if (!user_can($topic_author, 'publish_topics')) {
         //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_topic_permissions' );
         return new WP_Error('bbp_topic_permissions', '', $data);
     }
     // Forum is a category
     if (bbp_is_forum_category($forum_id)) {
         //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_edit_topic_forum_category' );
         //bbp_add_error( 'bbp_edit_topic_forum_category', __( '<strong>ERROR</strong>: This forum is a category. No topics can be created in this forum.', 'bbpress' ) );
         return new WP_Error('bbp_edit_topic_forum_category', '', $data);
         // Forum is not a category
     } else {
         // Forum is closed and user cannot access
         if (bbp_is_forum_closed($forum_id) && !user_can($topic_author, 'edit_forum')) {
             //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_edit_topic_forum_closed' );
             //bbp_add_error( 'bbp_edit_topic_forum_closed', __( '<strong>ERROR</strong>: This forum has been closed to new topics.', 'bbpress' ) );
             return new WP_Error('bbp_edit_topic_forum_closed', '', $data);
         }
         // Forum is private and user cannot access
         if (bbp_is_forum_private($forum_id)) {
             if (!user_can($topic_author, 'read_private_forums')) {
                 //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_edit_topic_forum_private' );
                 //bbp_add_error( 'bbp_edit_topic_forum_private', __( '<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new topics in it.', 'bbpress' ) );
                 return new WP_Error('bbp_edit_topic_forum_private', '', $data);
             }
         }
         // Forum is hidden and user cannot access
         if (bbp_is_forum_hidden($forum_id)) {
             if (!user_can($topic_author, 'read_hidden_forums')) {
                 //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_edit_topic_forum_hidden' );
                 //bbp_add_error( 'bbp_edit_topic_forum_hidden', __( '<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new topics in it.', 'bbpress' ) );
                 return new WP_Error('bbp_edit_topic_forum_hidden', '', $data);
             }
         }
     }
     /** UNFILTERED HTML **********************************************/
     // Remove wp_filter_kses filters from title and content for capable users
     if (user_can($topic_author, 'unfiltered_html')) {
         remove_filter('bbp_new_topic_pre_title', 'wp_filter_kses');
         remove_filter('bbp_new_topic_pre_content', 'wp_filter_kses');
     }
     /** TOPIC DATA ***************************************************/
     $topic_content = $data['content'];
     $topic_title = $data['subject'];
     bp_rbe_log('Message #' . $i . ': body contents - ' . $topic_content);
     bp_rbe_log('Subject - ' . $topic_title);
     if (empty($topic_content) || empty($topic_title)) {
         //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_new_forum_topic_empty' );
         return new WP_Error('bbp_new_forum_topic_empty', '', $data);
     }
     // Filter and sanitize
     $topic_title = apply_filters('bbp_new_topic_pre_title', $topic_title);
     $topic_content = apply_filters('bbp_new_topic_pre_content', $topic_content);
     /** Topic Tags ****************************************************/
     /* TODO
     		if ( bbp_allow_topic_tags() ) {
     
     			// Escape tag input
     			$terms = esc_attr( strip_tags( $_POST['bbp_topic_tags'] ) );
     
     			// Explode by comma
     			if ( strstr( $terms, ',' ) ) {
     				$terms = explode( ',', $terms );
     			}
     
     			// Add topic tag ID as main key
     			$terms = array( bbp_get_topic_tag_tax_id() => $terms );
     		}
     		*/
     /** TOPIC MODERATION *********************************************/
     // Post Flooding
     if (!bbp_check_for_flood($anonymous_data, $topic_author)) {
         //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_topic_flood' );
         //bbp_add_error( 'bbp_reply_flood', __( '<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress' ) );
         return new WP_Error('bbp_topic_flood', '', $data);
     }
     // Topic Duplicate
     if (!bbp_check_for_duplicate(array('post_type' => bbp_get_topic_post_type(), 'post_author' => $topic_author, 'post_content' => $topic_content, 'anonymous_data' => $anonymous_data))) {
         //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_topic_duplicate' );
         return new WP_Error('bbp_topic_duplicate', '', $data);
     }
     // Topic Blacklist
     if (!bbp_check_for_blacklist($anonymous_data, $topic_author, $topic_title, $topic_content)) {
         //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_topic_blacklist' );
         return new WP_Error('bbp_topic_blacklist', '', $data);
     }
     // Topic Status
     // Maybe put into moderation
     if (!bbp_check_for_moderation($anonymous_data, $topic_author, $topic_title, $topic_content)) {
         $topic_status = bbp_get_pending_status_id();
         // Default
     } else {
         $topic_status = bbp_get_public_status_id();
     }
     /** POSTING TIME! ************************************************/
     // bbP hook before save
     do_action('bbp_new_topic_pre_extras', $forum_id);
     // Setup reply data
     $topic_data = apply_filters('bbp_new_topic_pre_insert', array('post_author' => $topic_author, 'post_title' => $topic_title, 'post_content' => $topic_content, 'post_status' => $topic_status, 'post_parent' => $forum_id, 'post_type' => bbp_get_topic_post_type(), 'comment_status' => 'closed'));
     // Insert topic
     $topic_id = wp_insert_post($topic_data);
     // Topic posted!
     if (!is_wp_error($topic_id)) {
         // more internal logging
         bp_rbe_log('Message #' . $i . ': bbPress topic successfully posted!');
         // Problem posting
     } else {
         //do_action( 'bp_rbe_imap_no_match', $connection, $i, $headers, 'bbp_topic_error' );
         return new WP_Error('bbp_topic_error', '', $data);
     }
     /** AFTER POSTING ************************************************/
     // stuff that needs to happen after a bbP topic is posted occurs here... bbP
     // should preferably do the following at the 'bbp_new_reply' hook, until then
     // do what bbP does inline.
     // Trash Check ////////////////////////////////////////////////////
     // If the forum is trash, or the topic_status is switched to
     // trash, trash it properly
     if (get_post_field('post_status', $forum_id) == bbp_get_trash_status_id() || $topic_data['post_status'] == bbp_get_trash_status_id()) {
         // Trash the reply
         wp_trash_post($topic_id);
     }
     // Spam Check /////////////////////////////////////////////////////
     // If reply or topic are spam, officially spam this reply
     if ($topic_data['post_status'] == bbp_get_spam_status_id()) {
         add_post_meta($topic_id, '_bbp_spam_meta_status', bbp_get_public_status_id());
     }
     // Reply By Email /////////////////////////////////////////////////
     // Add a RBE marker to the post's meta
     // Could potentially show that post was made via email on the frontend
     add_post_meta($topic_id, 'bp_rbe', 1);
     /** POST HOOKS ***************************************************/
     // RBE Custom Hooks ///////////////////////////////////////////////
     // change activity action
     add_filter('bbp_before_record_activity_parse_args', array($this, 'change_activity_action'));
     // add RBE's special activity hook
     add_action('bp_activity_after_save', array($this, 'activity_rbe_hook'));
     // bbPress Topic Hooks ////////////////////////////////////////////
     do_action('bbp_new_topic', $topic_id, $forum_id, $anonymous_data, $topic_author);
     do_action('bbp_new_topic_post_extras', $topic_id);
     return array('bbp_topic_id' => $topic_id);
 }