web/wp-content/plugins/bbpress/includes/core/theme-compat.php
changeset 196 5e8dcbe22c24
child 204 09a1c134465b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/theme-compat.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1024 @@
+<?php
+
+/**
+ * bbPress Core Theme Compatibility
+ *
+ * @package bbPress
+ * @subpackage ThemeCompatibility
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Theme Compat **************************************************************/
+
+/**
+ * What follows is an attempt at intercepting the natural page load process
+ * to replace the_content() with the appropriate bbPress content.
+ *
+ * To do this, bbPress does several direct manipulations of global variables
+ * and forces them to do what they are not supposed to be doing.
+ *
+ * Don't try anything you're about to witness here, at home. Ever.
+ */
+
+/** Base Class ****************************************************************/
+
+/**
+ * Theme Compatibility base class
+ *
+ * This is only intended to be extended, and is included here as a basic guide
+ * for future Theme Packs to use. @link BBP_Twenty_Ten is a good example of
+ * extending this class, as is @link bbp_setup_theme_compat()
+ *
+ * @since bbPress (r3506)
+ */
+class BBP_Theme_Compat {
+
+	/**
+	 * Should be like:
+	 *
+	 * array(
+	 *     'id'      => ID of the theme (should be unique)
+	 *     'name'    => Name of the theme (should match style.css)
+	 *     'version' => Theme version for cache busting scripts and styling
+	 *     'dir'     => Path to theme
+	 *     'url'     => URL to theme
+	 * );
+	 * @var array 
+	 */
+	private $_data = array();
+
+	/**
+	 * Pass the $properties to the object on creation.
+	 *
+	 * @since bbPress (r3926)
+	 * @param array $properties
+	 */
+    public function __construct( Array $properties = array() ) {
+		$this->_data = $properties;
+	}
+
+	/**
+	 * Set a theme's property.
+	 *
+	 * @since bbPress (r3926)
+	 * @param string $property
+	 * @param mixed $value
+	 * @return mixed
+	 */
+	public function __set( $property, $value ) {
+		return $this->_data[$property] = $value;
+	}
+
+	/**
+	 * Get a theme's property.
+	 *
+	 * @since bbPress (r3926)
+	 * @param string $property
+	 * @param mixed $value
+	 * @return mixed
+	 */
+	public function __get( $property ) {
+		return array_key_exists( $property, $this->_data ) ? $this->_data[$property] : '';
+	}
+}
+
+/** Functions *****************************************************************/
+
+/**
+ * Setup the default theme compat theme
+ *
+ * @since bbPress (r3311)
+ * @param BBP_Theme_Compat $theme
+ */
+function bbp_setup_theme_compat( $theme = '' ) {
+	$bbp = bbpress();
+
+	// Make sure theme package is available, set to default if not
+	if ( ! isset( $bbp->theme_compat->packages[$theme] ) || ! is_a( $bbp->theme_compat->packages[$theme], 'BBP_Theme_Compat' ) ) {
+		$theme = 'default';
+	}
+
+	// Set the active theme compat theme
+	$bbp->theme_compat->theme = $bbp->theme_compat->packages[$theme];
+}
+
+/**
+ * Gets the name of the bbPress compatable theme used, in the event the
+ * currently active WordPress theme does not explicitly support bbPress.
+ * This can be filtered or set manually. Tricky theme authors can override the
+ * default and include their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3506)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_id() {
+	return apply_filters( 'bbp_get_theme_compat_id', bbpress()->theme_compat->theme->id );
+}
+
+/**
+ * Gets the name of the bbPress compatable theme used, in the event the
+ * currently active WordPress theme does not explicitly support bbPress.
+ * This can be filtered or set manually. Tricky theme authors can override the
+ * default and include their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3506)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_name() {
+	return apply_filters( 'bbp_get_theme_compat_name', bbpress()->theme_compat->theme->name );
+}
+
+/**
+ * Gets the version of the bbPress compatable theme used, in the event the
+ * currently active WordPress theme does not explicitly support bbPress.
+ * This can be filtered or set manually. Tricky theme authors can override the
+ * default and include their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3506)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_version() {
+	return apply_filters( 'bbp_get_theme_compat_version', bbpress()->theme_compat->theme->version );
+}
+
+/**
+ * Gets the bbPress compatable theme used in the event the currently active
+ * WordPress theme does not explicitly support bbPress. This can be filtered,
+ * or set manually. Tricky theme authors can override the default and include
+ * their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3032)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_dir() {
+	return apply_filters( 'bbp_get_theme_compat_dir', bbpress()->theme_compat->theme->dir );
+}
+
+/**
+ * Gets the bbPress compatable theme used in the event the currently active
+ * WordPress theme does not explicitly support bbPress. This can be filtered,
+ * or set manually. Tricky theme authors can override the default and include
+ * their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3032)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_url() {
+	return apply_filters( 'bbp_get_theme_compat_url', bbpress()->theme_compat->theme->url );
+}
+
+/**
+ * Gets true/false if page is currently inside theme compatibility
+ *
+ * @since bbPress (r3265)
+ * @return bool
+ */
+function bbp_is_theme_compat_active() {
+	$bbp = bbpress();
+
+	if ( empty( $bbp->theme_compat->active ) )
+		return false;
+
+	return $bbp->theme_compat->active;
+}
+
+/**
+ * Sets true/false if page is currently inside theme compatibility
+ *
+ * @since bbPress (r3265)
+ * @param bool $set
+ * @return bool
+ */
+function bbp_set_theme_compat_active( $set = true ) {
+	bbpress()->theme_compat->active = $set;
+
+	return (bool) bbpress()->theme_compat->active;
+}
+
+/**
+ * Set the theme compat templates global
+ *
+ * Stash possible template files for the current query. Useful if plugins want
+ * to override them, or see what files are being scanned for inclusion.
+ *
+ * @since bbPress (r3311)
+ */
+function bbp_set_theme_compat_templates( $templates = array() ) {
+	bbpress()->theme_compat->templates = $templates;
+
+	return bbpress()->theme_compat->templates;
+}
+
+/**
+ * Set the theme compat template global
+ *
+ * Stash the template file for the current query. Useful if plugins want
+ * to override it, or see what file is being included.
+ *
+ * @since bbPress (r3311)
+ */
+function bbp_set_theme_compat_template( $template = '' ) {
+	bbpress()->theme_compat->template = $template;
+
+	return bbpress()->theme_compat->template;
+}
+
+/**
+ * Set the theme compat original_template global
+ *
+ * Stash the original template file for the current query. Useful for checking
+ * if bbPress was able to find a more appropriate template.
+ *
+ * @since bbPress (r3926)
+ */
+function bbp_set_theme_compat_original_template( $template = '' ) {
+	bbpress()->theme_compat->original_template = $template;
+
+	return bbpress()->theme_compat->original_template;
+}
+
+/**
+ * Set the theme compat original_template global
+ *
+ * Stash the original template file for the current query. Useful for checking
+ * if bbPress was able to find a more appropriate template.
+ *
+ * @since bbPress (r3926)
+ */
+function bbp_is_theme_compat_original_template( $template = '' ) {
+	$bbp = bbpress();
+
+	if ( empty( $bbp->theme_compat->original_template ) )
+		return false;
+
+	return (bool) ( $bbp->theme_compat->original_template == $template );
+}
+
+/**
+ * Register a new bbPress theme package to the active theme packages array
+ *
+ * @since bbPress (r3829)
+ * @param array $theme
+ */
+function bbp_register_theme_package( $theme = array(), $override = true ) {
+
+	// Create new BBP_Theme_Compat object from the $theme array
+	if ( is_array( $theme ) )
+		$theme = new BBP_Theme_Compat( $theme );
+
+	// Bail if $theme isn't a proper object
+	if ( ! is_a( $theme, 'BBP_Theme_Compat' ) )
+		return;
+
+	// Load up bbPress
+	$bbp = bbpress();
+
+	// Only override if the flag is set and not previously registered
+	if ( empty( $bbp->theme_compat->packages[$theme->id] ) || ( true === $override ) ) {
+		$bbp->theme_compat->packages[$theme->id] = $theme;
+	}
+}
+/**
+ * This fun little function fills up some WordPress globals with dummy data to
+ * stop your average page template from complaining about it missing.
+ *
+ * @since bbPress (r3108)
+ * @global WP_Query $wp_query
+ * @global object $post
+ * @param array $args
+ */
+function bbp_theme_compat_reset_post( $args = array() ) {
+	global $wp_query, $post;
+
+	// Default arguments
+	$defaults = array(
+		'ID'                    => -9999,
+		'post_status'           => bbp_get_public_status_id(),
+		'post_author'           => 0,
+		'post_parent'           => 0,
+		'post_type'             => 'page',
+		'post_date'             => 0,
+		'post_date_gmt'         => 0,
+		'post_modified'         => 0,
+		'post_modified_gmt'     => 0,
+		'post_content'          => '',
+		'post_title'            => '',
+		'post_excerpt'          => '',
+		'post_content_filtered' => '',
+		'post_mime_type'        => '',
+		'post_password'         => '',
+		'post_name'             => '',
+		'guid'                  => '',
+		'menu_order'            => 0,
+		'pinged'                => '',
+		'to_ping'               => '',
+		'ping_status'           => '',
+		'comment_status'        => 'closed',
+		'comment_count'         => 0,
+
+		'is_404'          => false,
+		'is_page'         => false,
+		'is_single'       => false,
+		'is_archive'      => false,
+		'is_tax'          => false,
+	);
+
+	// Switch defaults if post is set
+	if ( isset( $wp_query->post ) ) {		  
+		$defaults = array(
+			'ID'                    => $wp_query->post->ID,
+			'post_status'           => $wp_query->post->post_status,
+			'post_author'           => $wp_query->post->post_author,
+			'post_parent'           => $wp_query->post->post_parent,
+			'post_type'             => $wp_query->post->post_type,
+			'post_date'             => $wp_query->post->post_date,
+			'post_date_gmt'         => $wp_query->post->post_date_gmt,
+			'post_modified'         => $wp_query->post->post_modified,
+			'post_modified_gmt'     => $wp_query->post->post_modified_gmt,
+			'post_content'          => $wp_query->post->post_content,
+			'post_title'            => $wp_query->post->post_title,
+			'post_excerpt'          => $wp_query->post->post_excerpt,
+			'post_content_filtered' => $wp_query->post->post_content_filtered,
+			'post_mime_type'        => $wp_query->post->post_mime_type,
+			'post_password'         => $wp_query->post->post_password,
+			'post_name'             => $wp_query->post->post_name,
+			'guid'                  => $wp_query->post->guid,
+			'menu_order'            => $wp_query->post->menu_order,
+			'pinged'                => $wp_query->post->pinged,
+			'to_ping'               => $wp_query->post->to_ping,
+			'ping_status'           => $wp_query->post->ping_status,
+			'comment_status'        => $wp_query->post->comment_status,
+			'comment_count'         => $wp_query->post->comment_count,
+
+			'is_404'          => false,
+			'is_page'         => false,
+			'is_single'       => false,
+			'is_archive'      => false,
+			'is_tax'          => false,
+		);
+	}
+	$dummy = bbp_parse_args( $args, $defaults, 'theme_compat_reset_post' );
+
+	// Clear out the post related globals
+	unset( $wp_query->posts );
+	unset( $wp_query->post  );
+	unset( $post            );
+
+	// Setup the dummy post object
+	$wp_query->post                        = new stdClass; 
+	$wp_query->post->ID                    = $dummy['ID'];
+	$wp_query->post->post_status           = $dummy['post_status'];
+	$wp_query->post->post_author           = $dummy['post_author'];
+	$wp_query->post->post_parent           = $dummy['post_parent'];
+	$wp_query->post->post_type             = $dummy['post_type'];
+	$wp_query->post->post_date             = $dummy['post_date'];
+	$wp_query->post->post_date_gmt         = $dummy['post_date_gmt'];
+	$wp_query->post->post_modified         = $dummy['post_modified'];
+	$wp_query->post->post_modified_gmt     = $dummy['post_modified_gmt'];
+	$wp_query->post->post_content          = $dummy['post_content'];
+	$wp_query->post->post_title            = $dummy['post_title'];
+	$wp_query->post->post_excerpt          = $dummy['post_excerpt'];
+	$wp_query->post->post_content_filtered = $dummy['post_content_filtered'];
+	$wp_query->post->post_mime_type        = $dummy['post_mime_type'];
+	$wp_query->post->post_password         = $dummy['post_password'];
+	$wp_query->post->post_name             = $dummy['post_name'];
+	$wp_query->post->guid                  = $dummy['guid'];
+	$wp_query->post->menu_order            = $dummy['menu_order'];
+	$wp_query->post->pinged                = $dummy['pinged'];
+	$wp_query->post->to_ping               = $dummy['to_ping'];
+	$wp_query->post->ping_status           = $dummy['ping_status'];
+	$wp_query->post->comment_status        = $dummy['comment_status'];
+	$wp_query->post->comment_count         = $dummy['comment_count'];
+
+	// Set the $post global
+	$post = $wp_query->post;
+
+	// Setup the dummy post loop
+	$wp_query->posts[0] = $wp_query->post;
+
+	// Prevent comments form from appearing
+	$wp_query->post_count = 1;
+	$wp_query->is_404     = $dummy['is_404'];
+	$wp_query->is_page    = $dummy['is_page'];
+	$wp_query->is_single  = $dummy['is_single'];
+	$wp_query->is_archive = $dummy['is_archive'];
+	$wp_query->is_tax     = $dummy['is_tax'];
+
+	/**
+	 * Force the header back to 200 status if not a deliberate 404
+	 *
+	 * @see http://bbpress.trac.wordpress.org/ticket/1973
+	 */
+	if ( ! $wp_query->is_404() )
+		status_header( 200 );
+
+	// If we are resetting a post, we are in theme compat
+	bbp_set_theme_compat_active();
+}
+
+/**
+ * Reset main query vars and filter 'the_content' to output a bbPress
+ * template part as needed.
+ *
+ * @since bbPress (r3032)
+ * @param string $template
+ * @uses bbp_is_single_user() To check if page is single user
+ * @uses bbp_get_single_user_template() To get user template
+ * @uses bbp_is_single_user_edit() To check if page is single user edit
+ * @uses bbp_get_single_user_edit_template() To get user edit template
+ * @uses bbp_is_single_view() To check if page is single view
+ * @uses bbp_get_single_view_template() To get view template
+ * @uses bbp_is_forum_edit() To check if page is forum edit
+ * @uses bbp_get_forum_edit_template() To get forum edit template
+ * @uses bbp_is_topic_merge() To check if page is topic merge
+ * @uses bbp_get_topic_merge_template() To get topic merge template
+ * @uses bbp_is_topic_split() To check if page is topic split
+ * @uses bbp_get_topic_split_template() To get topic split template
+ * @uses bbp_is_topic_edit() To check if page is topic edit
+ * @uses bbp_get_topic_edit_template() To get topic edit template
+ * @uses bbp_is_reply_edit() To check if page is reply edit
+ * @uses bbp_get_reply_edit_template() To get reply edit template
+ * @uses bbp_set_theme_compat_template() To set the global theme compat template
+ */
+function bbp_template_include_theme_compat( $template = '' ) {
+
+	// Bail if the template already matches a bbPress template. This includes
+	// archive-* and single-* WordPress post_type matches (allowing
+	// themes to use the expected format) as well as all bbPress-specific
+	// template files for users, topics, forums, etc...
+	if ( !empty( bbpress()->theme_compat->bbpress_template ) )
+		return $template;
+
+	/** Users *************************************************************/
+
+	if ( bbp_is_single_user_edit() || bbp_is_single_user() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => '',
+			'post_title'     => esc_attr( bbp_get_displayed_user_field( 'display_name' ) ),
+			'post_status'    => bbp_get_public_status_id(),
+			'is_archive'     => false,
+			'comment_status' => 'closed'
+		) );
+
+	/** Forums ************************************************************/
+
+	// Forum archive
+	} elseif ( bbp_is_forum_archive() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => bbp_get_forum_archive_title(),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => bbp_get_forum_post_type(),
+			'post_status'    => bbp_get_public_status_id(),
+			'is_archive'     => true,
+			'comment_status' => 'closed'
+		) );
+
+	// Single Forum
+	} elseif ( bbp_is_forum_edit() || bbp_is_single_forum() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => bbp_get_forum_id(),
+			'post_title'     => bbp_get_forum_title(),
+			'post_author'    => bbp_get_forum_author_id(),
+			'post_date'      => 0,
+			'post_content'   => get_post_field( 'post_content', bbp_get_forum_id() ),
+			'post_type'      => bbp_get_forum_post_type(),
+			'post_status'    => bbp_get_forum_visibility(),
+			'is_single'      => true,
+			'comment_status' => 'closed'
+		) );
+
+	/** Topics ************************************************************/
+
+	// Topic archive
+	} elseif ( bbp_is_topic_archive() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => bbp_get_topic_archive_title(),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => bbp_get_topic_post_type(),
+			'post_status'    => bbp_get_public_status_id(),
+			'is_archive'     => true,
+			'comment_status' => 'closed'
+		) );
+
+	// Single Topic
+	} elseif ( bbp_is_topic_edit() || bbp_is_single_topic() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => bbp_get_topic_id(),
+			'post_title'     => bbp_get_topic_title(),
+			'post_author'    => bbp_get_topic_author_id(),
+			'post_date'      => 0,
+			'post_content'   => get_post_field( 'post_content', bbp_get_topic_id() ),
+			'post_type'      => bbp_get_topic_post_type(),
+			'post_status'    => bbp_get_topic_status(),
+			'is_single'      => true,
+			'comment_status' => 'closed'
+		) );
+
+	/** Replies ***********************************************************/
+
+	// Reply archive
+	} elseif ( is_post_type_archive( bbp_get_reply_post_type() ) ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => __( 'Replies', 'bbpress' ),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => bbp_get_reply_post_type(),
+			'post_status'    => bbp_get_public_status_id(),
+			'comment_status' => 'closed'
+		) );
+
+	// Single Reply
+	} elseif ( bbp_is_reply_edit() || bbp_is_single_reply() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => bbp_get_reply_id(),
+			'post_title'     => bbp_get_reply_title(),
+			'post_author'    => bbp_get_reply_author_id(),
+			'post_date'      => 0,
+			'post_content'   => get_post_field( 'post_content', bbp_get_reply_id() ),
+			'post_type'      => bbp_get_reply_post_type(),
+			'post_status'    => bbp_get_reply_status(),
+			'comment_status' => 'closed'
+		) );
+
+	/** Views *************************************************************/
+
+	} elseif ( bbp_is_single_view() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => bbp_get_view_title(),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => '',
+			'post_status'    => bbp_get_public_status_id(),
+			'comment_status' => 'closed'
+		) );
+
+	/** Topic Tags ********************************************************/
+
+	// Topic Tag Edit
+	} elseif ( bbp_is_topic_tag_edit() || bbp_is_topic_tag() ) {
+
+		// Stash the current term in a new var
+		set_query_var( 'bbp_topic_tag', get_query_var( 'term' ) );
+
+		// Reset the post with our new title
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => '',
+			'post_title'     => sprintf( __( 'Topic Tag: %s', 'bbpress' ), '<span>' . bbp_get_topic_tag_name() . '</span>' ),
+			'post_status'    => bbp_get_public_status_id(),
+			'comment_status' => 'closed'
+		) );
+	}
+
+	/**
+	 * If we are relying on bbPress's built in theme compatibility to load
+	 * the proper content, we need to intercept the_content, replace the
+	 * output, and display ours instead.
+	 *
+	 * To do this, we first remove all filters from 'the_content' and hook
+	 * our own function into it, which runs a series of checks to determine
+	 * the context, and then uses the built in shortcodes to output the
+	 * correct results from inside an output buffer.
+	 *
+	 * Uses bbp_get_theme_compat_templates() to provide fall-backs that
+	 * should be coded without superfluous mark-up and logic (prev/next
+	 * navigation, comments, date/time, etc...)
+	 * 
+	 * Hook into the 'bbp_get_bbpress_template' to override the array of
+	 * possible templates, or 'bbp_bbpress_template' to override the result.
+	 */
+	if ( bbp_is_theme_compat_active() ) {
+
+		// Remove all filters from the_content
+		bbp_remove_all_filters( 'the_content' );
+
+		// Add a filter on the_content late, which we will later remove
+		add_filter( 'the_content', 'bbp_replace_the_content' );
+
+		// Find the appropriate template file
+		$template = bbp_get_theme_compat_templates();
+	}
+
+	return apply_filters( 'bbp_template_include_theme_compat', $template );
+}
+
+/**
+ * Replaces the_content() if the post_type being displayed is one that would
+ * normally be handled by bbPress, but proper single page templates do not
+ * exist in the currently active theme.
+ *
+ * @since bbPress (r3034)
+ * @param string $content
+ * @return type
+ */
+function bbp_replace_the_content( $content = '' ) {
+
+	// Bail if not inside the main query loop
+	if ( ! in_the_loop() || ! is_main_query() )
+		return $content;
+
+	$bbp = bbpress();
+
+	// Define local variable(s)
+	$new_content = '';
+
+	// Bail if shortcodes are unset somehow
+	if ( !is_a( $bbp->shortcodes, 'BBP_Shortcodes' ) )
+		return $content;
+
+	// Use shortcode API to display forums/topics/replies because they are
+	// already output buffered and ready to fit inside the_content
+
+	/** Users *************************************************************/
+
+	// Profile View
+	if ( bbp_is_single_user_edit() || bbp_is_single_user() ) {
+		ob_start();
+
+		bbp_get_template_part( 'content', 'single-user' );
+
+		$new_content = ob_get_contents();
+
+		ob_end_clean();
+
+	/** Forums ************************************************************/
+
+	// Forum archive
+	} elseif ( bbp_is_forum_archive() ) {
+
+		// Page exists where this archive should be
+		$page = bbp_get_page_by_path( bbp_get_root_slug() );
+		if ( !empty( $page ) ) {
+
+			// Restore previously unset filters
+			bbp_restore_all_filters( 'the_content' );
+
+			// Remove 'bbp_replace_the_content' filter to prevent infinite loops
+			remove_filter( 'the_content', 'bbp_replace_the_content' );
+
+			// Start output buffer
+			ob_start();
+
+			// Grab the content of this page
+			$new_content = apply_filters( 'the_content', $page->post_content );
+
+			// Clean up the buffer
+			ob_end_clean();
+
+			// Add 'bbp_replace_the_content' filter back (@see $this::start())
+			add_filter( 'the_content', 'bbp_replace_the_content' );
+
+		// No page so show the archive
+		} else {
+			$new_content = $bbp->shortcodes->display_forum_index();
+		}
+
+	// Forum Edit
+	} elseif ( bbp_is_forum_edit() ) {
+		$new_content = $bbp->shortcodes->display_forum_form();
+
+	// Single Forum
+	} elseif ( bbp_is_single_forum() ) {
+		$new_content = $bbp->shortcodes->display_forum( array( 'id' => get_the_ID() ) );
+
+	/** Topics ************************************************************/
+
+	// Topic archive
+	} elseif ( bbp_is_topic_archive() ) {
+
+		// Page exists where this archive should be
+		$page = bbp_get_page_by_path( bbp_get_topic_archive_slug() );
+		if ( !empty( $page ) ) {
+
+			// Restore previously unset filters
+			bbp_restore_all_filters( 'the_content' );
+
+			// Remove 'bbp_replace_the_content' filter to prevent infinite loops
+			remove_filter( 'the_content', 'bbp_replace_the_content' );
+
+			// Start output buffer
+			ob_start();
+
+			// Grab the content of this page
+			$new_content = apply_filters( 'the_content', $page->post_content );
+
+			// Clean up the buffer
+			ob_end_clean();
+
+			// Add 'bbp_replace_the_content' filter back (@see $this::start())
+			add_filter( 'the_content', 'bbp_replace_the_content' );
+
+		// No page so show the archive
+		} else {
+			$new_content = $bbp->shortcodes->display_topic_index();
+		}
+
+	// Topic Edit
+	} elseif ( bbp_is_topic_edit() ) {
+
+		// Split
+		if ( bbp_is_topic_split() ) {
+			ob_start();
+
+			bbp_get_template_part( 'form', 'topic-split' );
+
+			$new_content = ob_get_contents();
+
+			ob_end_clean();
+
+		// Merge
+		} elseif ( bbp_is_topic_merge() ) {
+			ob_start();
+
+			bbp_get_template_part( 'form', 'topic-merge' );
+
+			$new_content = ob_get_contents();
+
+			ob_end_clean();
+
+		// Edit
+		} else {
+			$new_content = $bbp->shortcodes->display_topic_form();
+		}
+
+	// Single Topic
+	} elseif ( bbp_is_single_topic() ) {
+		$new_content = $bbp->shortcodes->display_topic( array( 'id' => get_the_ID() ) );
+
+	/** Replies ***********************************************************/
+
+	// Reply archive
+	} elseif ( is_post_type_archive( bbp_get_reply_post_type() ) ) {
+		//$new_content = $bbp->shortcodes->display_reply_index();
+
+	// Reply Edit
+	} elseif ( bbp_is_reply_edit() ) {
+		$new_content = $bbp->shortcodes->display_reply_form();
+
+	// Single Reply
+	} elseif ( bbp_is_single_reply() ) {
+		$new_content = $bbp->shortcodes->display_reply( array( 'id' => get_the_ID() ) );
+
+	/** Views *************************************************************/
+
+	} elseif ( bbp_is_single_view() ) {
+		$new_content = $bbp->shortcodes->display_view( array( 'id' => get_query_var( 'bbp_view' ) ) );
+
+	/** Topic Tags ********************************************************/
+
+	// Show topics of tag
+	} elseif ( bbp_is_topic_tag() ) {
+		$new_content = $bbp->shortcodes->display_topics_of_tag( array( 'id' => bbp_get_topic_tag_id() ) );
+
+	// Edit topic tag
+	} elseif ( bbp_is_topic_tag_edit() ) {
+		$new_content = $bbp->shortcodes->display_topic_tag_form();
+	}
+
+	// Juggle the content around and try to prevent unsightly comments
+	if ( !empty( $new_content ) && ( $new_content != $content ) ) {
+
+		// Set the content to be the new content
+		$content = apply_filters( 'bbp_replace_the_content', $new_content, $content );
+
+		// Clean up after ourselves
+		unset( $new_content );
+
+		// Reset the $post global
+		wp_reset_postdata();
+	}
+
+	// Return possibly hi-jacked content
+	return $content;
+}
+
+/** Helpers *******************************************************************/
+
+/**
+ * Remove the canonical redirect to allow pretty pagination
+ *
+ * @since bbPress (r2628)
+ * @param string $redirect_url Redirect url
+ * @uses WP_Rewrite::using_permalinks() To check if the blog is using permalinks
+ * @uses bbp_get_paged() To get the current page number
+ * @uses bbp_is_single_topic() To check if it's a topic page
+ * @uses bbp_is_single_forum() To check if it's a forum page
+ * @return bool|string False if it's a topic/forum and their first page,
+ *                      otherwise the redirect url
+ */
+function bbp_redirect_canonical( $redirect_url ) {
+	global $wp_rewrite;
+
+	// Canonical is for the beautiful
+	if ( $wp_rewrite->using_permalinks() ) {
+
+		// If viewing beyond page 1 of several
+		if ( 1 < bbp_get_paged() ) {
+
+			// Only on single topics...
+			if ( bbp_is_single_topic() ) {
+				$redirect_url = false;
+
+			// ...and single forums...
+			} elseif ( bbp_is_single_forum() ) {
+				$redirect_url = false;
+
+			// ...and single replies...
+			} elseif ( bbp_is_single_reply() ) {
+				$redirect_url = false;
+
+			// ...and any single anything else...
+			//
+			// @todo - Find a more accurate way to disable paged canonicals for
+			//          paged shortcode usage within other posts.
+			} elseif ( is_page() || is_singular() ) {
+				$redirect_url = false;
+			}
+
+		// If editing a topic
+		} elseif ( bbp_is_topic_edit() ) {
+			$redirect_url = false;
+
+		// If editing a reply
+		} elseif ( bbp_is_reply_edit() ) {
+			$redirect_url = false;
+		}
+	}
+
+	return $redirect_url;
+}
+
+/** Filters *******************************************************************/
+
+/**
+ * Removes all filters from a WordPress filter, and stashes them in the $bbp
+ * global in the event they need to be restored later.
+ *
+ * @since bbPress (r3251)
+ * @global WP_filter $wp_filter
+ * @global array $merged_filters
+ * @param string $tag
+ * @param int $priority
+ * @return bool
+ */
+function bbp_remove_all_filters( $tag, $priority = false ) {
+	global $wp_filter, $merged_filters;
+
+	$bbp = bbpress();
+
+	// Filters exist
+	if ( isset( $wp_filter[$tag] ) ) {
+
+		// Filters exist in this priority
+		if ( !empty( $priority ) && isset( $wp_filter[$tag][$priority] ) ) {
+
+			// Store filters in a backup
+			$bbp->filters->wp_filter[$tag][$priority] = $wp_filter[$tag][$priority];
+
+			// Unset the filters
+			unset( $wp_filter[$tag][$priority] );
+
+		// Priority is empty
+		} else {
+
+			// Store filters in a backup
+			$bbp->filters->wp_filter[$tag] = $wp_filter[$tag];
+
+			// Unset the filters
+			unset( $wp_filter[$tag] );
+		}
+	}
+
+	// Check merged filters
+	if ( isset( $merged_filters[$tag] ) ) {
+
+		// Store filters in a backup
+		$bbp->filters->merged_filters[$tag] = $merged_filters[$tag];
+
+		// Unset the filters
+		unset( $merged_filters[$tag] );
+	}
+
+	return true;
+}
+
+/**
+ * Restores filters from the $bbp global that were removed using
+ * bbp_remove_all_filters()
+ *
+ * @since bbPress (r3251)
+ * @global WP_filter $wp_filter
+ * @global array $merged_filters
+ * @param string $tag
+ * @param int $priority
+ * @return bool
+ */
+function bbp_restore_all_filters( $tag, $priority = false ) {
+	global $wp_filter, $merged_filters;
+
+	$bbp = bbpress();
+
+	// Filters exist
+	if ( isset( $bbp->filters->wp_filter[$tag] ) ) {
+
+		// Filters exist in this priority
+		if ( !empty( $priority ) && isset( $bbp->filters->wp_filter[$tag][$priority] ) ) {
+
+			// Store filters in a backup
+			$wp_filter[$tag][$priority] = $bbp->filters->wp_filter[$tag][$priority];
+
+			// Unset the filters
+			unset( $bbp->filters->wp_filter[$tag][$priority] );
+
+		// Priority is empty
+		} else {
+
+			// Store filters in a backup
+			$wp_filter[$tag] = $bbp->filters->wp_filter[$tag];
+
+			// Unset the filters
+			unset( $bbp->filters->wp_filter[$tag] );
+		}
+	}
+
+	// Check merged filters
+	if ( isset( $bbp->filters->merged_filters[$tag] ) ) {
+
+		// Store filters in a backup
+		$merged_filters[$tag] = $bbp->filters->merged_filters[$tag];
+
+		// Unset the filters
+		unset( $bbp->filters->merged_filters[$tag] );
+	}
+
+	return true;
+}
+
+/**
+ * Force comments_status to 'closed' for bbPress post types
+ *
+ * @since bbPress (r3589)
+ * @param bool $open True if open, false if closed
+ * @param int $post_id ID of the post to check
+ * @return bool True if open, false if closed
+ */
+function bbp_force_comment_status( $open, $post_id = 0 ) {
+
+	// Get the post type of the post ID
+	$post_type = get_post_type( $post_id );
+
+	// Default return value is what is passed in $open
+	$retval = $open;
+
+	// Only force for bbPress post types
+	switch ( $post_type ) {
+		case bbp_get_forum_post_type() :
+		case bbp_get_topic_post_type() :
+		case bbp_get_reply_post_type() :
+			$retval = false;
+			break;
+	}
+
+	// Allow override of the override
+	return apply_filters( 'bbp_force_comment_status', $retval, $open, $post_id, $post_type );
+}