theme_compat->theme ) && !current_theme_supports( 'bbpress' ) ) {
if ( empty( $theme ) ) {
$theme = new BBP_Theme_Compat();
$theme->name = 'bbPress (Twenty Ten)';
$theme->version = '20110912';
$theme->dir = $bbp->themes_dir . '/bbp-twentyten';
$theme->url = $bbp->themes_url . '/bbp-twentyten';
}
// Set the theme compat globals for help with loading template parts
$bbp->theme_compat->theme = $theme;
}
}
/**
* If not using a bbPress compatable theme, enqueue some basic styling and js
*
* @since bbPress (r3029)
*
* @uses bbp_set_compat_theme_dir() Set the compatable theme to bbp-twentyten
* @uses current_theme_supports() Check bbPress theme support
* @uses wp_enqueue_style() Enqueue the bbp-twentyten default CSS
* @uses wp_enqueue_script() Enqueue the bbp-twentyten default topic JS
*/
function bbp_theme_compat_enqueue_css() {
// Check if current theme supports bbPress
if ( !current_theme_supports( 'bbpress' ) ) {
// Version of CSS
$version = bbp_get_theme_compat_version();
// Right to left
if ( is_rtl() ) {
wp_enqueue_style( 'bbpress-style', bbp_get_theme_compat_url() . '/css/bbpress-rtl.css', '', $version, 'screen' );
// Left to right
} else {
wp_enqueue_style( 'bbpress-style', bbp_get_theme_compat_url() . '/css/bbpress.css', '', $version, 'screen' );
}
}
}
/**
* Adds bbPress theme support to any active WordPress theme
*
* This function is really cool because it's responsible for managing the
* theme compatability layer when the current theme does not support bbPress.
* It uses the current_theme_supports() WordPress function to see if 'bbpress'
* is explicitly supported. If not, it will directly load the requested template
* part using load_template(). If so, it proceeds with using get_template_part()
* as per normal, and no one is the wiser.
*
* @since bbPress (r3032)
*
* @param string $slug
* @param string $name Optional. Default null
* @uses current_theme_supports()
* @uses load_template()
* @uses get_template_part()
*/
function bbp_get_template_part( $slug, $name = null ) {
// Current theme does not support bbPress, so we need to do some heavy
// lifting to see if a bbPress template is needed in the current context
if ( !current_theme_supports( 'bbpress' ) )
load_template( bbp_get_theme_compat_dir() . '/' . $slug . '-' . $name . '.php', false );
// Current theme supports bbPress to proceed as usual
else
get_template_part( $slug, $name );
}
/**
* 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)
*
* @global bbPress $bbp
* @uses apply_filters()
* @return string
*/
function bbp_get_theme_compat_name() {
global $bbp;
return apply_filters( 'bbp_get_theme_compat_name', $bbp->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)
*
* @global bbPress $bbp
* @uses apply_filters()
* @return string
*/
function bbp_get_theme_compat_version() {
global $bbp;
return apply_filters( 'bbp_get_theme_compat_version', $bbp->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)
*
* @global bbPress $bbp
* @uses apply_filters()
* @return string
*/
function bbp_get_theme_compat_dir() {
global $bbp;
return apply_filters( 'bbp_get_theme_compat_dir', $bbp->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)
*
* @global bbPress $bbp
* @uses apply_filters()
* @return string
*/
function bbp_get_theme_compat_url() {
global $bbp;
return apply_filters( 'bbp_get_theme_compat_url', $bbp->theme_compat->theme->url );
}
/**
* Gets true/false if page is currently inside theme compatibility
*
* @since bbPress (r3265)
*
* @global bbPress $bbp
*
* @return bool
*/
function bbp_is_theme_compat_active() {
global $bbp;
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)
*
* @global bbPress $bbp
*
* @param bool $set
*
* @return bool
*/
function bbp_set_theme_compat_active( $set = true ) {
global $bbp;
$bbp->theme_compat->active = $set;
return (bool) $bbp->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)
*
* @global $bbp;
*/
function bbp_set_theme_compat_templates( $templates = array() ) {
global $bbp;
$bbp->theme_compat->templates = $templates;
return $bbp->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)
*
* @global $bbp;
*/
function bbp_set_theme_compat_template( $template = '' ) {
global $bbp;
$bbp->theme_compat->template = $template;
return $bbp->theme_compat->template;
}
/**
* 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;
// Why would you ever want to do this otherwise?
if ( current_theme_supports( 'bbpress' ) )
wp_die( __( 'Hands off, partner!', 'bbpress' ) );
// Default for current post
if ( isset( $wp_query->post ) ) {
$defaults = array(
'ID' => get_the_ID(),
'post_title' => get_the_title(),
'post_author' => get_the_author_meta('ID'),
'post_date' => get_the_date(),
'post_content' => get_the_content(),
'post_type' => get_post_type(),
'post_status' => get_post_status(),
'post_name' => !empty( $wp_query->post->post_name ) ? $wp_query->post->post_name : '',
'comment_status' => comments_open(),
'is_404' => false,
'is_page' => false,
'is_single' => false,
'is_archive' => false,
'is_tax' => false,
);
// Empty defaults
} else {
$defaults = array(
'ID' => 0,
'post_title' => '',
'post_author' => 0,
'post_date' => 0,
'post_content' => '',
'post_type' => 'page',
'post_status' => bbp_get_public_status_id(),
'post_name' => '',
'comment_status' => 'closed',
'is_404' => false,
'is_page' => false,
'is_single' => false,
'is_archive' => false,
'is_tax' => false,
);
}
$dummy = wp_parse_args( $args, $defaults );
// Clear out the post related globals
unset( $wp_query->posts );
unset( $wp_query->post );
unset( $post );
// Setup the dummy post object
$wp_query->post->ID = $dummy['ID'];
$wp_query->post->post_title = $dummy['post_title'];
$wp_query->post->post_author = $dummy['post_author'];
$wp_query->post->post_date = $dummy['post_date'];
$wp_query->post->post_content = $dummy['post_content'];
$wp_query->post->post_type = $dummy['post_type'];
$wp_query->post->post_status = $dummy['post_status'];
$wp_query->post->post_name = $dummy['post_name'];
$wp_query->post->comment_status = $dummy['comment_status'];
// 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'];
// If we are resetting a post, we are in theme compat
bbp_set_theme_compat_active();
}
/** Templates *****************************************************************/
/**
* Get the user profile template
*
* @since bbPress (r3311)
*
* @uses bbp_get_displayed_user_id()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_single_user_template() {
$displayed = bbp_get_displayed_user_id();
$templates = array(
// Single User ID
'single-user-' . $displayed . '.php',
'bbpress/single-user-' . $displayed . '.php',
'forums/single-user-' . $displayed . '.php',
// Single User
'single-user.php',
'bbpress/single-user.php',
'forums/single-user.php',
// User
'user.php',
'bbpress/user.php',
'forums/user.php',
);
$templates = apply_filters( 'bbp_get_profile_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the user profile edit template
*
* @since bbPress (r3311)
*
* @uses $displayed
* @uses apply_filters()
*
* @return array
*/
function bbp_get_single_user_edit_template() {
$displayed = bbp_get_displayed_user_id();
$templates = array(
// Single User Edit ID
'single-user-edit-' . $displayed . '.php',
'bbpress/single-user-edit-' . $displayed . '.php',
'forums/single-user-edit-' . $displayed . '.php',
// Single User Edit
'single-user-edit.php',
'bbpress/single-user-edit.php',
'forums/single-user-edit.php',
// User Edit
'user-edit.php',
'bbpress/user-edit.php',
'forums/user-edit.php',
// User
'forums/user.php',
'bbpress/user.php',
'user.php',
);
$templates = apply_filters( 'bbp_get_profile_edit_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the view template
*
* @since bbPress (r3311)
*
* @uses bbp_get_view_id()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_single_view_template() {
$view_id = bbp_get_view_id();
$templates = array(
// Single View ID
'single-view-' . $view_id . '.php',
'bbpress/single-view-' . $view_id . '.php',
'forums/single-view-' . $view_id . '.php',
// View ID
'view-' . $view_id . '.php',
'bbpress/view-' . $view_id . '.php',
'forums/view-' . $view_id . '.php',
// Single View
'single-view.php',
'bbpress/single-view.php',
'forums/single-view.php',
// View
'view.php',
'bbpress/view.php',
'forums/view.php',
);
$templates = apply_filters( 'bbp_get_single_view_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the topic edit template
*
* @since bbPress (r3311)
*
* @uses bbp_get_topic_post_type()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_topic_edit_template() {
$post_type = bbp_get_topic_post_type();
$templates = array(
// Single Topic Edit
'single-' . $post_type . '-edit.php',
'bbpress/single-' . $post_type . '-edit.php',
'forums/single-' . $post_type . '-edit.php',
// Single Action Edit Topic
'single-action-edit-' . $post_type . '.php',
'bbpress/single-action-edit-' . $post_type . '.php',
'forums/single-action-edit-' . $post_type . '.php',
// Single Action Edit
'single-action-edit.php',
'bbpress/single-action-edit.php',
'forums/single-action-edit.php',
// Action Edit
'action-edit.php',
'bbpress/action-edit.php',
'forums/action-edit.php',
// Single Topic
'single-' . $post_type . '.php',
'forums/single-' . $post_type . '.php',
'bbpress/single-' . $post_type . '.php',
);
$templates = apply_filters( 'bbp_get_topic_edit_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the topic split template
*
* @since bbPress (r3311)
*
* @uses bbp_get_topic_post_type()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_topic_split_template() {
$post_type = bbp_get_topic_post_type();
$templates = array(
// Topic Split
'single-' . $post_type . '-split.php',
'bbpress/single-' . $post_type . '-split.php',
'forums/single-' . $post_type . '-split.php',
// Action Split
'single-action-split-merge.php',
'bbpress/single-action-split-merge.php',
'forums/single-action-split-merge.php',
// Action Split
'action-split-merge.php',
'bbpress/action-split-merge.php',
'forums/action-split-merge.php'
);
$templates = apply_filters( 'bbp_get_topic_split_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the topic merge template
*
* @since bbPress (r3311)
*
* @uses bbp_get_topic_post_type()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_topic_merge_template() {
$post_type = bbp_get_topic_post_type();
$templates = array(
// Topic Merge
'single-' . $post_type . '-merge.php',
'bbpress/single-' . $post_type . '-merge.php',
'forums/single-' . $post_type . '-merge.php',
// Action Merge
'single-action-split-merge.php',
'bbpress/single-action-split-merge.php',
'forums/single-action-split-merge.php',
// Action Merge
'action-split-merge.php',
'bbpress/action-split-merge.php',
'forums/action-split-merge.php'
);
$templates = apply_filters( 'bbp_get_topic_merge_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the reply edit template
*
* @since bbPress (r3311)
*
* @uses bbp_get_reply_post_type()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_reply_edit_template() {
$post_type = bbp_get_reply_post_type();
$templates = array(
// Single Reply Edit
'single-' . $post_type . '-edit.php',
'bbpress/single-' . $post_type . '-edit.php',
'forums/single-' . $post_type . '-edit.php',
// Single Action Edit Reply
'single-action-edit-' . $post_type . '.php',
'bbpress/single-action-edit-' . $post_type . '.php',
'forums/single-action-edit-' . $post_type . '.php',
// Single Action Edit
'single-action-edit.php',
'bbpress/single-action-edit.php',
'forums/single-action-edit.php',
// Action Edit
'action-edit.php',
'bbpress/action-edit.php',
'forums/action-edit.php',
// Single Reply
'single-' . $post_type . '.php',
'forums/single-' . $post_type . '.php',
'bbpress/single-' . $post_type . '.php',
);
$templates = apply_filters( 'bbp_get_reply_edit_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the topic template
*
* @since bbPress (r3311)
*
* @uses bbp_get_topic_tag_tax_id()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_topic_tag_template() {
$tt_id = bbp_get_topic_tag_tax_id();
$templates = array(
// Single Topic Tag
'taxonomy-' . $tt_id . '.php',
'forums/taxonomy-' . $tt_id . '.php',
'bbpress/taxonomy-' . $tt_id . '.php',
);
$templates = apply_filters( 'bbp_get_topic_tag_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the topic edit template
*
* @since bbPress (r3311)
*
* @uses bbp_get_topic_tag_tax_id()
* @uses apply_filters()
*
* @return array
*/
function bbp_get_topic_tag_edit_template() {
$tt_id = bbp_get_topic_tag_tax_id();
$templates = array(
// Single Topic Tag Edit
'taxonomy-' . $tt_id . '-edit.php',
'bbpress/taxonomy-' . $tt_id . '-edit.php',
'forums/taxonomy-' . $tt_id . '-edit.php',
// Single Topic Tag
'taxonomy-' . $tt_id . '.php',
'forums/taxonomy-' . $tt_id . '.php',
'bbpress/taxonomy-' . $tt_id . '.php',
);
$templates = apply_filters( 'bbp_get_topic_tag_edit_template', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Get the files to fallback on to use for theme compatibility
*
* @since bbPress (r3311)
*
* @uses apply_filters()
* @uses bbp_set_theme_compat_templates();
*
* @return type
*/
function bbp_get_theme_compat_templates() {
$templates = array(
'bbpress.php',
'forum.php',
'page.php',
'single.php',
'index.php'
);
$templates = apply_filters( 'bbp_get_theme_compat_templates', $templates );
$templates = bbp_set_theme_compat_templates( $templates );
$template = locate_template( $templates, false, false );
$template = bbp_set_theme_compat_template( $template );
return $template;
}
/**
* Possibly intercept the template being loaded
*
* Listens to the 'template_include' filter and waits for a bbPress post_type
* to appear. If the current theme does not explicitly support bbPress, it
* intercepts the page template and uses one served from the bbPress compatable
* theme, set in the $bbp->theme_compat global. If the current theme does
* support bbPress, we'll explore the template hierarchy and try to locate one.
*
* @since bbPress (r3032)
*
* @param string $template
*
* @uses current_theme_supports() To check if theme supports bbPress
* @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_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
*
* @return string The path to the template file that is being used
*/
function bbp_template_include_theme_supports( $template = '' ) {
// Current theme supports bbPress
if ( current_theme_supports( 'bbpress' ) ) {
// Viewing a user
if ( bbp_is_single_user() && ( $new_template = bbp_get_single_user_template() ) ) :
// Editing a user
elseif ( bbp_is_single_user_edit() && ( $new_template = bbp_get_single_user_edit_template() ) ) :
// Single View
elseif ( bbp_is_single_view() && ( $new_template = bbp_get_single_view_template() ) ) :
// Topic merge
elseif ( bbp_is_topic_merge() && ( $new_template = bbp_get_topic_merge_template() ) ) :
// Topic split
elseif ( bbp_is_topic_split() && ( $new_template = bbp_get_topic_split_template() ) ) :
// Topic edit
elseif ( bbp_is_topic_edit() && ( $new_template = bbp_get_topic_edit_template() ) ) :
// Editing a reply
elseif ( bbp_is_reply_edit() && ( $new_template = bbp_get_reply_edit_template() ) ) :
// Viewing a topic tag
elseif ( bbp_is_topic_tag() && ( $new_template = bbp_get_topic_tag_template() ) ) :
// Editing a topic tag
elseif ( bbp_is_topic_tag_edit() && ( $new_template = bbp_get_topic_tag_edit_template() ) ) :
endif;
// Custom template file exists
$template = !empty( $new_template ) ? $new_template : $template;
}
return apply_filters( 'bbp_template_include_theme_supports', $template );
}
/**
* In this next bit, either the current theme does not support bbPress, or
* the theme author has incorrectly used add_theme_support( 'bbpress' )
* and we are going to help them out by silently filling in the blanks.
*/
function bbp_template_include_theme_compat( $template = '' ) {
global $bbp;
if ( !current_theme_supports( 'bbpress' ) || ( !empty( $bbp->theme_compat->templates ) && empty( $bbp->theme_compat->template ) ) ) {
/** Users *************************************************************/
if ( bbp_is_single_user() || bbp_is_single_user_edit() ) {
// Reset post
bbp_theme_compat_reset_post( array(
'post_title' => esc_attr( bbp_get_displayed_user_field( 'display_name' ) )
) );
/** 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
) );
/** 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
) );
// Single topic
} elseif ( bbp_is_topic_edit() || bbp_is_topic_split() || bbp_is_topic_merge() ) {
// 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
) );
/** 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()
) );
// Single reply
} elseif ( bbp_is_reply_edit() ) {
// 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()
) );
/** 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()
) );
/** Topic Tags ********************************************************/
} elseif ( bbp_is_topic_tag_edit() ) {
// 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(
'post_title' => sprintf( __( 'Topic Tag: %s', 'bbpress' ), '' . bbp_get_topic_tag_name() . '' )
) );
} elseif ( 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(
'post_title' => sprintf( __( 'Topic Tag: %s', 'bbpress' ), '' . bbp_get_topic_tag_name() . '' )
) );
/** Single Forums/Topics/Replies **************************************/
} elseif ( bbp_is_custom_post_type() ) {
bbp_set_theme_compat_active();
}
/**
* 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.
*
* We default to using page.php, since it's most likely to exist and
* should be coded to work without superfluous elements and logic, like
* prev/next navigation, comments, date/time, etc... You can hook into
* the 'bbp_template_include' filter to override page.php.
*/
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)
*
* @global bbPress $bbp
* @global WP_Query $post
* @param string $content
* @return type
*/
function bbp_replace_the_content( $content = '' ) {
// Current theme does not support bbPress, so we need to do some heavy
// lifting to see if a bbPress template is needed in the current context
if ( !current_theme_supports( 'bbpress' ) ) {
// Use the $post global to check it's post_type
global $bbp;
// Define local variable(s)
$new_content = '';
// Remove the filter that was added in bbp_template_include()
remove_filter( 'the_content', 'bbp_replace_the_content' );
// Bail if shortcodes are unset somehow
if ( empty( $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() ) {
ob_start();
bbp_get_template_part( 'bbpress/content', 'single-user' );
$new_content = ob_get_contents();
ob_end_clean();
// Profile Edit
} elseif ( bbp_is_single_user_edit() ) {
ob_start();
bbp_get_template_part( 'bbpress/content', 'single-user-edit' );
$new_content = ob_get_contents();
ob_end_clean();
/** Forums ************************************************************/
// Forum archive
} elseif ( bbp_is_forum_archive() ) {
// Page exists where this archive should be
if ( $page = bbp_get_page_by_path( $bbp->root_slug ) ) {
// Start output buffer
ob_start();
// Restore previously unset filters
bbp_restore_all_filters( 'the_content' );
// Grab the content of this page
$new_content = do_shortcode( apply_filters( 'the_content', get_post_field( 'post_content', $page->ID ) ) );
// Clean up the buffer
ob_end_clean();
// No page so show the archive
} else {
$new_content = $bbp->shortcodes->display_forum_index();
}
/** Topics ************************************************************/
// Topic archive
} elseif ( bbp_is_topic_archive() ) {
// Page exists where this archive should be
if ( $page = bbp_get_page_by_path( $bbp->topic_archive_slug ) ) {
// Start output buffer
ob_start();
// Restore previously unset filters
bbp_restore_all_filters( 'the_content' );
// Grab the content of this page
$new_content = do_shortcode( apply_filters( 'the_content', get_post_field( 'post_content', $page->ID ) ) );
// Clean up the buffer
ob_end_clean();
// No page so show the archive
} else {
$new_content = $bbp->shortcodes->display_topic_index();
}
// Single topic
} elseif ( bbp_is_topic_edit() ) {
// Split
if ( bbp_is_topic_split() ) {
ob_start();
bbp_get_template_part( 'bbpress/form', 'topic-split' );
$new_content = ob_get_contents();
ob_end_clean();
// Merge
} elseif ( bbp_is_topic_merge() ) {
ob_start();
bbp_get_template_part( 'bbpress/form', 'topic-merge' );
$new_content = ob_get_contents();
ob_end_clean();
// Edit
} else {
$new_content = $bbp->shortcodes->display_topic_form();
}
/** 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();
/** Views *************************************************************/
} elseif ( bbp_is_single_view() ) {
$new_content = $bbp->shortcodes->display_view( array( 'id' => get_query_var( 'bbp_view' ) ) );
/** Topic Tags ********************************************************/
} elseif ( get_query_var( 'bbp_topic_tag' ) ) {
// Edit topic tag
if ( bbp_is_topic_tag_edit() ) {
$new_content = $bbp->shortcodes->display_topic_tag_form();
// Show topics of tag
} else {
$new_content = $bbp->shortcodes->display_topics_of_tag( array( 'id' => bbp_get_topic_tag_id() ) );
}
/** Forums/Topics/Replies *********************************************/
} else {
// Check the post_type
switch ( get_post_type() ) {
// Single Forum
case bbp_get_forum_post_type() :
$new_content = $bbp->shortcodes->display_forum( array( 'id' => get_the_ID() ) );
break;
// Single Topic
case bbp_get_topic_post_type() :
$new_content = $bbp->shortcodes->display_topic( array( 'id' => get_the_ID() ) );
break;
// Single Reply
case bbp_get_reply_post_type() :
break;
}
}
// 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 );
/**
* Supplemental hack to prevent stubborn comments_template() output.
*
* By this time we can safely assume that everything we needed from
* the {$post} global has been rendered into the buffer, so we're
* going to empty it and {$withcomments} for good measure. This has
* the added benefit of preventing an incorrect "Edit" link on the
* bottom of most popular page templates, at the cost of rendering
* these globals useless for the remaining page output without using
* wp_reset_postdata() to get that data back.
*
* @see comments_template() For why we're doing this :)
* @see wp_reset_postdata() If you need to get $post back
*
* Note: If a theme uses custom code to output comments, it's
* possible all of this dancing around is for not.
*
* Note: If you need to keep these globals around for any special
* reason, we've provided a failsafe hook to bypass this you
* can put in your plugin or theme below ---v
*
* apply_filters( 'bbp_spill_the_beans', '__return_true' );
*/
if ( !apply_filters( 'bbp_spill_the_beans', false ) ) {
// Setup the chopping block
global $post, $withcomments;
// Empty out globals that aren't being used in this loop anymore
$withcomments = $post = false;
}
}
}
// 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 replies...
} elseif ( bbp_is_single_forum() ) {
$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;
}
/**
* Sets the 404 status.
*
* Used primarily with topics/replies inside hidden forums.
*
* @since bbPress (r3051)
*
* @global WP_Query $wp_query
* @uses WP_Query::set_404()
*/
function bbp_set_404() {
global $wp_query;
if ( ! isset( $wp_query ) ) {
_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );
return false;
}
$wp_query->set_404();
}
/**
* Used to guess if page exists at requested path
*
* @since bbPress (r3304)
*
* @uses get_option() To see if pretty permalinks are enabled
* @uses get_page_by_path() To see if page exists at path
*
* @param string $path
* @return mixed False if no page, Page object if true
*/
function bbp_get_page_by_path( $path = '' ) {
// Default to false
$retval = false;
// Path is not empty
if ( !empty( $path ) ) {
// Pretty permalinks are on so path might exist
if ( get_option( 'permalink_structure' ) ) {
$retval = get_page_by_path( $path );
}
}
return apply_filters( 'bbp_get_page_by_path', $retval, $path );
}
/** 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 bbPress $bbp
* @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 $bbp, $wp_filter, $merged_filters;
// 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 bbPress $bbp
* @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 $bbp, $wp_filter, $merged_filters;
// 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;
}
/**
* Add checks for view page, user page, user edit, topic edit and reply edit
* pages.
*
* If it's a user page, WP_Query::bbp_is_single_user is set to true.
* If it's a user edit page, WP_Query::bbp_is_single_user_edit is set to true
* and the the 'wp-admin/includes/user.php' file is included.
* In addition, on user/user edit pages, WP_Query::home is set to false & query
* vars 'bbp_user_id' with the displayed user id and 'author_name' with the
* displayed user's nicename are added.
*
* If it's a topic edit, WP_Query::bbp_is_topic_edit is set to true and
* similarly, if it's a reply edit, WP_Query::bbp_is_reply_edit is set to true.
*
* If it's a view page, WP_Query::bbp_is_view is set to true
*
* @since bbPress (r2688)
*
* @global bbPress $bbp
* #global WP_Query $wp_query
*
* @uses get_query_var() To get {@link WP_Query} query var
* @uses is_email() To check if the string is an email
* @uses get_user_by() To try to get the user by email and nicename
* @uses WP_User to get the user data
* @uses WP_Query::set_404() To set a 404 status
* @uses current_user_can() To check if the current user can edit the user
* @uses apply_filters() Calls 'enable_edit_any_user_configuration' with true
* @uses wp_die() To die
* @uses bbp_is_query_name() Check if query name is 'bbp_widget'
* @uses bbp_get_view_query_args() To get the view query args
* @uses bbp_get_topic_post_type() To get the topic post type
* @uses bbp_get_reply_post_type() To get the reply post type
* @uses is_multisite() To check if it's a multisite
* @uses remove_action() To remove the auto save post revision action
*/
function bbp_pre_get_posts( $posts_query ) {
global $bbp, $wp_the_query;
// Bail if $posts_query is not the main loop
if ( $posts_query != $wp_the_query )
return;
// Bail if filters are suppressed on this query
if ( true == $posts_query->get( 'suppress_filters' ) )
return;
// Bail if in admin
if ( is_admin() )
return;
// Get query variables
$bbp_user = $posts_query->get( $bbp->user_id );
$bbp_view = $posts_query->get( $bbp->view_id );
$is_edit = $posts_query->get( $bbp->edit_id );
// It is a user page - We'll also check if it is user edit
if ( !empty( $bbp_user ) ) {
// Not a user_id so try email and slug
if ( !is_numeric( $bbp_user ) ) {
// Email was passed
if ( is_email( $bbp_user ) ) {
$bbp_user = get_user_by( 'email', $bbp_user );
// Try nicename
} else {
$bbp_user = get_user_by( 'slug', $bbp_user );
}
// If we were successful, set to ID
if ( is_object( $bbp_user ) ) {
$bbp_user = $bbp_user->ID;
}
}
// Create new user
$user = new WP_User( $bbp_user );
// Bail if no user
if ( !isset( $user ) || empty( $user ) || empty( $user->ID ) ) {
$posts_query->set_404();
return;
}
/** User Exists *******************************************************/
// View or edit?
if ( !empty( $is_edit ) ) {
// We are editing a profile
$posts_query->bbp_is_single_user_edit = true;
// Load the core WordPress contact methods
if ( !function_exists( '_wp_get_user_contactmethods' ) ) {
include_once( ABSPATH . 'wp-includes/registration.php' );
}
// Load the edit_user functions
if ( !function_exists( 'edit_user' ) ) {
require_once( ABSPATH . 'wp-admin/includes/user.php' );
}
// We are viewing a profile
} else {
$posts_query->bbp_is_single_user = true;
}
// Make sure 404 is not set
$posts_query->is_404 = false;
// Correct is_home variable
$posts_query->is_home = false;
// Set bbp_user_id for future reference
$posts_query->set( 'bbp_user_id', $user->ID );
// Set author_name as current user's nicename to get correct posts
if ( !bbp_is_query_name( 'bbp_widget' ) ) {
$posts_query->set( 'author_name', $user->user_nicename );
}
// Set the displayed user global to this user
$bbp->displayed_user = $user;
// View Page
} elseif ( !empty( $bbp_view ) ) {
// Check if the view exists by checking if there are query args are set
$view_args = bbp_get_view_query_args( $bbp_view );
// Bail if view args is false (view isn't registered)
if ( false === $view_args ) {
$posts_query->set_404();
return;
}
// Correct is_home variable
$posts_query->is_home = false;
// We are in a custom topic view
$posts_query->bbp_is_view = true;
// Topic/Reply Edit Page
} elseif ( !empty( $is_edit ) ) {
// We are editing a topic
if ( $posts_query->get( 'post_type' ) == bbp_get_topic_post_type() ) {
$posts_query->bbp_is_topic_edit = true;
// We are editing a reply
} elseif ( $posts_query->get( 'post_type' ) == bbp_get_reply_post_type() ) {
$posts_query->bbp_is_reply_edit = true;
// We are editing a topic tag
} elseif ( bbp_is_topic_tag() ) {
$posts_query->bbp_is_topic_tag_edit = true;
}
// We save post revisions on our own
remove_action( 'pre_post_update', 'wp_save_post_revision' );
// Check forum status and exclude single forums the user cannot see
} elseif ( bbp_get_forum_post_type() == $posts_query->get( 'post_type' ) ) {
// Define local variable
$status = array();
// All users can see published forums
$status[] = bbp_get_public_status_id();
// Add bbp_get_private_status_id() if user is capable
if ( current_user_can( 'read_private_forums' ) ) {
$status[] = bbp_get_private_status_id();
}
// Add bbp_get_hidden_status_id() if user is capable
if ( current_user_can( 'read_hidden_forums' ) ) {
$status[] = bbp_get_hidden_status_id();
}
// Implode and add the statuses
$posts_query->set( 'post_status', implode( ',', $status ) );
// Topic tag page
} elseif ( bbp_is_topic_tag() ) {
$posts_query->set( 'bbp_topic_tag', get_query_var( 'term' ) );
$posts_query->set( 'post_type', bbp_get_topic_post_type() );
$posts_query->set( 'posts_per_page', bbp_get_topics_per_page() );
}
}
?>