__construct();
}
/**
* The main bbPress loader
*
* @since bbPress (r2464)
*
* @uses bbPress::_setup_globals() Setup the globals needed
* @uses bbPress::_includes() Include the required files
* @uses bbPress::_setup_actions() Setup the hooks and actions
*/
function __construct() {
$this->_setup_globals();
$this->_includes();
$this->_setup_actions();
}
/**
* Component global variables
*
* @since bbPress (r2626)
* @access private
*
* @uses plugin_dir_path() To generate bbPress plugin path
* @uses plugin_dir_url() To generate bbPress plugin url
* @uses apply_filters() Calls various filters
*/
function _setup_globals() {
/** Paths *************************************************************/
// bbPress root directory
$this->file = __FILE__;
$this->plugin_dir = plugin_dir_path( $this->file );
$this->plugin_url = plugin_dir_url ( $this->file );
// Themes
$this->themes_dir = WP_PLUGIN_DIR . '/' . basename( dirname( __FILE__ ) ) . '/bbp-themes';
$this->themes_url = $this->plugin_url . 'bbp-themes';
// Languages
$this->lang_dir = $this->plugin_dir . 'bbp-languages';
/** Identifiers *******************************************************/
// Post type identifiers
$this->forum_post_type = apply_filters( 'bbp_forum_post_type', 'forum' );
$this->topic_post_type = apply_filters( 'bbp_topic_post_type', 'topic' );
$this->reply_post_type = apply_filters( 'bbp_reply_post_type', 'reply' );
$this->topic_tag_id = apply_filters( 'bbp_topic_tag_id', 'topic-tag' );
// Status identifiers
$this->spam_status_id = apply_filters( 'bbp_spam_post_status', 'spam' );
$this->closed_status_id = apply_filters( 'bbp_closed_post_status', 'closed' );
$this->orphan_status_id = apply_filters( 'bbp_orphan_post_status', 'orphan' );
$this->hidden_status_id = apply_filters( 'bbp_hidden_post_status', 'hidden' );
$this->trash_status_id = 'trash';
/** Slugs *************************************************************/
// Root forum slug
$this->root_slug = apply_filters( 'bbp_root_slug', get_option( '_bbp_root_slug', 'forums' ) );
$this->topic_archive_slug = apply_filters( 'bbp_topic_archive_slug', get_option( '_bbp_topic_archive_slug', 'topics' ) );
// Should we include the root slug in front of component slugs
$prefix = !empty( $this->root_slug ) && get_option( '_bbp_include_root', true ) ? trailingslashit( $this->root_slug ) : '';
// Component slugs
$this->forum_slug = apply_filters( 'bbp_forum_slug', $prefix . get_option( '_bbp_forum_slug', 'forum' ) );
$this->topic_slug = apply_filters( 'bbp_topic_slug', $prefix . get_option( '_bbp_topic_slug', 'topic' ) );
$this->reply_slug = apply_filters( 'bbp_reply_slug', $prefix . get_option( '_bbp_reply_slug', 'reply' ) );
// Taxonomy slugs
$this->topic_tag_slug = apply_filters( 'bbp_topic_tag_slug', $prefix . get_option( '_bbp_topic_tag_slug', 'tag' ) );
/** Other Slugs *******************************************************/
$this->user_slug = apply_filters( 'bbp_user_slug', $prefix . get_option( '_bbp_user_slug', 'user' ) );
$this->view_slug = apply_filters( 'bbp_view_slug', $prefix . get_option( '_bbp_view_slug', 'view' ) );
/** Misc **************************************************************/
// Errors
$this->errors = new WP_Error();
// Views
$this->views = array();
// Tab Index
$this->tab_index = apply_filters( 'bbp_default_tab_index', 100 );
/** Cache *************************************************************/
// Add bbPress to global cache groups
wp_cache_add_global_groups( 'bbpress' );
}
/**
* Include required files
*
* @since bbPress (r2626)
* @access private
*
* @uses is_admin() If in WordPress admin, load additional file
*/
function _includes() {
/** Individual files **************************************************/
$files = array( 'loader', 'options', 'caps', 'hooks', 'classes', 'widgets', 'shortcodes', 'compatibility' );
// Load the files
foreach ( $files as $file )
require( $this->plugin_dir . '/bbp-includes/bbp-core-' . $file . '.php' );
/** Components ********************************************************/
$components = array( 'general', 'forum', 'topic', 'reply', 'user' );
// Load the function and template files
foreach ( $components as $file ) {
require( $this->plugin_dir . '/bbp-includes/bbp-' . $file . '-functions.php' );
require( $this->plugin_dir . '/bbp-includes/bbp-' . $file . '-template.php' );
}
/** Admin *************************************************************/
// Quick admin check and load if needed
if ( is_admin() )
require( $this->plugin_dir . '/bbp-admin/bbp-admin.php' );
}
/**
* Setup the default hooks and actions
*
* @since bbPress (r2644)
* @access private
*
* @uses register_activation_hook() To register the activation hook
* @uses register_deactivation_hook() To register the deactivation hook
* @uses add_action() To add various actions
*/
function _setup_actions() {
// Register bbPress activation/deactivation sequences
register_activation_hook ( $this->file, 'bbp_activation' );
register_deactivation_hook( $this->file, 'bbp_deactivation' );
// Setup the currently logged in user
add_action( 'bbp_setup_current_user', array( $this, 'setup_current_user' ), 10 );
// Register content types
add_action( 'bbp_register_post_types', array( $this, 'register_post_types' ), 10 );
// Register post statuses
add_action( 'bbp_register_post_statuses', array( $this, 'register_post_statuses' ), 10 );
// Register taxonomies
add_action( 'bbp_register_taxonomies', array( $this, 'register_taxonomies' ), 10 );
// Register the views
add_action( 'bbp_register_views', array( $this, 'register_views' ), 10 );
// Register the theme directory
add_action( 'bbp_register_theme_directory', array( $this, 'register_theme_directory' ), 10 );
// Load textdomain
add_action( 'bbp_load_textdomain', array( $this, 'register_textdomain' ), 10 );
// Add the %bbp_user% rewrite tag
add_action( 'bbp_add_rewrite_tags', array( $this, 'add_rewrite_tags' ), 10 );
// Generate rewrite rules
add_action( 'bbp_generate_rewrite_rules', array( $this, 'generate_rewrite_rules' ), 10 );
// Check theme compatability
add_action( 'bbp_setup_theme_compat', array( $this, 'theme_compat' ), 10 );
}
/**
* Register Textdomain
*
* Load the translation file for current language. Checks the languages
* folder inside the bbPress plugin first, and then the default WordPress
* languages folder.
*
* Note that custom translation files inside the bbPress plugin folder
* will be removed on bbPress updates. If you're creating custom
* translation files, please use the global language folder.
*
* @since bbPress (r2596)
*
* @uses apply_filters() Calls 'bbpress_locale' with the
* {@link get_locale()} value
* @uses load_textdomain() To load the textdomain
* @return bool True on success, false on failure
*/
function register_textdomain() {
// Allow locale to be filtered
$locale = apply_filters( 'bbpress_locale', get_locale() );
// Get mo file name
$mofile = sprintf( 'bbpress-%s.mo', $locale );
// Setup paths to current locale file
$mofile_local = $this->lang_dir . '/' . $mofile;
$mofile_global = WP_LANG_DIR . '/bbpress/' . $mofile;
// Look in local /wp-content/plugins/bbpress/bbp-languages/ folder
if ( file_exists( $mofile_local ) )
return load_textdomain( 'bbpress', $mofile_local );
// Look in global /wp-content/languages/ folder
elseif ( file_exists( $mofile_global ) )
return load_textdomain( 'bbpress', $mofile_global );
// Nothing found
return false;
}
/**
* Sets up the bbPress theme directory to use in WordPress
*
* @since bbPress (r2507)
*
* @uses register_theme_directory() To register the theme directory
* @return bool True on success, false on failure
*/
function register_theme_directory() {
return register_theme_directory( $this->themes_dir );
}
/**
* Setup the post types for forums, topics and replies
*
* @todo messages
*
* @since bbPress (r2597)
*
* @uses register_post_type() To register the post types
* @uses apply_filters() Calls various filters to modify the arguments
* sent to register_post_type()
*/
function register_post_types() {
/** FORUMS ************************************************************/
// Forum labels
$forum['labels'] = array(
'name' => __( 'Forums', 'bbpress' ),
'singular_name' => __( 'Forum', 'bbpress' ),
'add_new' => __( 'New Forum', 'bbpress' ),
'add_new_item' => __( 'Create New Forum', 'bbpress' ),
'edit' => __( 'Edit', 'bbpress' ),
'edit_item' => __( 'Edit Forum', 'bbpress' ),
'new_item' => __( 'New Forum', 'bbpress' ),
'view' => __( 'View Forum', 'bbpress' ),
'view_item' => __( 'View Forum', 'bbpress' ),
'search_items' => __( 'Search Forums', 'bbpress' ),
'not_found' => __( 'No forums found', 'bbpress' ),
'not_found_in_trash' => __( 'No forums found in Trash', 'bbpress' ),
'parent_item_colon' => __( 'Parent Forum:', 'bbpress' )
);
// Forum rewrite
$forum['rewrite'] = array(
'slug' => $this->forum_slug,
'with_front' => false
);
// Forum supports
$forum['supports'] = array(
'title',
'editor',
'revisions'
);
// Forum filter
$bbp_cpt['forum'] = apply_filters( 'bbp_register_forum_post_type', array(
'labels' => $forum['labels'],
'rewrite' => $forum['rewrite'],
'supports' => $forum['supports'],
'description' => __( 'bbPress Forums', 'bbpress' ),
'capabilities' => bbp_get_forum_caps(),
'capability_type' => 'forum',
'menu_position' => 56,
'has_archive' => !empty( $this->root_slug ) ? $this->root_slug : false,
'show_in_nav_menus' => true,
'public' => true,
'show_ui' => true,
'can_export' => true,
'hierarchical' => true,
'query_var' => true,
'menu_icon' => ''
) );
// Register Forum content type
register_post_type( $this->forum_post_type, $bbp_cpt['forum'] );
/** TOPICS ************************************************************/
// Topic labels
$topic['labels'] = array(
'name' => __( 'Topics', 'bbpress' ),
'singular_name' => __( 'Topic', 'bbpress' ),
'add_new' => __( 'New Topic', 'bbpress' ),
'add_new_item' => __( 'Create New Topic', 'bbpress' ),
'edit' => __( 'Edit', 'bbpress' ),
'edit_item' => __( 'Edit Topic', 'bbpress' ),
'new_item' => __( 'New Topic', 'bbpress' ),
'view' => __( 'View Topic', 'bbpress' ),
'view_item' => __( 'View Topic', 'bbpress' ),
'search_items' => __( 'Search Topics', 'bbpress' ),
'not_found' => __( 'No topics found', 'bbpress' ),
'not_found_in_trash' => __( 'No topics found in Trash', 'bbpress' ),
'parent_item_colon' => __( 'Forum:', 'bbpress' )
);
// Topic rewrite
$topic['rewrite'] = array(
'slug' => $this->topic_slug,
'with_front' => false
);
// Topic supports
$topic['supports'] = array(
'title',
'editor',
'revisions'
);
// Topic Filter
$bbp_cpt['topic'] = apply_filters( 'bbp_register_topic_post_type', array(
'labels' => $topic['labels'],
'rewrite' => $topic['rewrite'],
'supports' => $topic['supports'],
'description' => __( 'bbPress Topics', 'bbpress' ),
'capabilities' => bbp_get_topic_caps(),
'capability_type' => 'topic',
'menu_position' => 57,
'has_archive' => get_page_by_path( $this->topic_archive_slug ) ? false : $this->topic_archive_slug,
'show_in_nav_menus' => false,
'public' => true,
'show_ui' => true,
'can_export' => true,
'hierarchical' => false,
'query_var' => true,
'menu_icon' => ''
) );
// Register Topic content type
register_post_type( $this->topic_post_type, $bbp_cpt['topic'] );
/** REPLIES ***********************************************************/
// Reply labels
$reply['labels'] = array(
'name' => __( 'Replies', 'bbpress' ),
'singular_name' => __( 'Reply', 'bbpress' ),
'add_new' => __( 'New Reply', 'bbpress' ),
'add_new_item' => __( 'Create New Reply', 'bbpress' ),
'edit' => __( 'Edit', 'bbpress' ),
'edit_item' => __( 'Edit Reply', 'bbpress' ),
'new_item' => __( 'New Reply', 'bbpress' ),
'view' => __( 'View Reply', 'bbpress' ),
'view_item' => __( 'View Reply', 'bbpress' ),
'search_items' => __( 'Search Replies', 'bbpress' ),
'not_found' => __( 'No replies found', 'bbpress' ),
'not_found_in_trash' => __( 'No replies found in Trash', 'bbpress' ),
'parent_item_colon' => __( 'Topic:', 'bbpress' )
);
// Reply rewrite
$reply['rewrite'] = array(
'slug' => $this->reply_slug,
'with_front' => false
);
// Reply supports
$reply['supports'] = array(
'title',
'editor',
'revisions'
);
// Reply filter
$bbp_cpt['reply'] = apply_filters( 'bbp_register_reply_post_type', array(
'labels' => $reply['labels'],
'rewrite' => $reply['rewrite'],
'supports' => $reply['supports'],
'description' => __( 'bbPress Replies', 'bbpress' ),
'capabilities' => bbp_get_reply_caps(),
'capability_type' => 'reply',
'menu_position' => 58,
'has_archive' => false,
'show_in_nav_menus' => false,
'public' => true,
'show_ui' => true,
'can_export' => true,
'hierarchical' => false,
'query_var' => true,
'menu_icon' => ''
) );
// Register reply content type
register_post_type( $this->reply_post_type, $bbp_cpt['reply'] );
}
/**
* Register the post statuses
*
* @since bbPress (r2727)
*
* @uses register_post_status() To register post statuses
* @uses $wp_post_statuses To modify trash and private statuses
* @uses current_user_can() To check if the current user is capable &
* modify $wp_post_statuses accordingly
*/
function register_post_statuses() {
global $wp_post_statuses;
// Closed
$status = apply_filters( 'bbp_register_closed_post_status', array(
'label' => _x( 'Closed', 'post', 'bbpress' ),
'label_count' => _nx_noop( 'Closed (%s)', 'Closed (%s)', 'bbpress' ),
'public' => true,
'show_in_admin_all' => true
) );
register_post_status( $this->closed_status_id, $status );
// Spam
$status = apply_filters( 'bbp_register_spam_post_status', array(
'label' => _x( 'Spam', 'post', 'bbpress' ),
'label_count' => _nx_noop( 'Spam (%s)', 'Spam (%s)', 'bbpress' ),
'protected' => true,
'exclude_from_search' => true,
'show_in_admin_status_list' => true,
'show_in_admin_all_list' => false
) );
register_post_status( $this->spam_status_id, $status );
// Orphan
$status = apply_filters( 'bbp_register_orphan_post_status', array(
'label' => _x( 'Orphan', 'post', 'bbpress' ),
'label_count' => _nx_noop( 'Orphan (%s)', 'Orphans (%s)', 'bbpress' ),
'protected' => true,
'exclude_from_search' => true,
'show_in_admin_status_list' => true,
'show_in_admin_all_list' => false
) );
register_post_status( $this->orphan_status_id, $status );
// Hidden
$status = apply_filters( 'bbp_register_hidden_post_status', array(
'label' => _x( 'Hidden', 'post', 'bbpress' ),
'label_count' => _nx_noop( 'Hidden (%s)', 'Hidden (%s)', 'bbpress' ),
'protected' => true,
'exclude_from_search' => true,
'show_in_admin_status_list' => true,
'show_in_admin_all_list' => true
) );
register_post_status( $this->hidden_status_id, $status );
/**
* Trash fix
*
* We need to remove the internal arg and change that to
* protected so that the users with 'view_trash' cap can view
* single trashed topics/replies in the front-end as wp_query
* doesn't allow any hack for the trashed topics to be viewed.
*/
if ( !empty( $wp_post_statuses['trash'] ) && current_user_can( 'view_trash' ) ) {
$wp_post_statuses['trash']->internal = false; // changed to protected
$wp_post_statuses['trash']->protected = true;
}
}
/**
* Register the topic tag taxonomy
*
* @since bbPress (r2464)
*
* @uses register_taxonomy() To register the taxonomy
*/
function register_taxonomies() {
// Topic tag labels
$topic_tag['labels'] = array(
'name' => __( 'Topic Tags', 'bbpress' ),
'singular_name' => __( 'Topic Tag', 'bbpress' ),
'search_items' => __( 'Search Tags', 'bbpress' ),
'popular_items' => __( 'Popular Tags', 'bbpress' ),
'all_items' => __( 'All Tags', 'bbpress' ),
'edit_item' => __( 'Edit Tag', 'bbpress' ),
'update_item' => __( 'Update Tag', 'bbpress' ),
'add_new_item' => __( 'Add New Tag', 'bbpress' ),
'new_item_name' => __( 'New Tag Name', 'bbpress' )
);
// Topic tag rewrite
$topic_tag['rewrite'] = array(
'slug' => $this->topic_tag_slug,
'with_front' => false
);
// Topic tag filter
$bbp_tt = apply_filters( 'bbp_register_topic_taxonomy', array(
'labels' => $topic_tag['labels'],
'rewrite' => $topic_tag['rewrite'],
'capabilities' => bbp_get_topic_tag_caps(),
'update_count_callback' => '_update_post_term_count',
'query_var' => true,
'show_tagcloud' => true,
'hierarchical' => false,
'public' => true,
'show_ui' => true
) );
// Register the topic tag taxonomy
register_taxonomy(
$this->topic_tag_id, // The topic tag id
$this->topic_post_type, // The topic post type
$bbp_tt
);
}
/**
* Register the bbPress views
*
* @since bbPress (r2789)
*
* @uses bbp_register_view() To register the views
*/
function register_views() {
// Topics with no replies
$no_replies = apply_filters( 'bbp_register_view_no_replies', array(
'meta_key' => '_bbp_reply_count',
'meta_value' => 1,
'meta_compare' => '<',
'orderby' => ''
) );
bbp_register_view( 'no-replies', __( 'Topics with no replies', 'bbpress' ), $no_replies );
}
/**
* Setup the currently logged-in user
*
* Do not to call this prematurely, I.E. before the 'init' action has
* started. This function is naturally hooked into 'init' to ensure proper
* execution. get_currentuserinfo() is used to check for XMLRPC_REQUEST to
* avoid xmlrpc errors.
*
* @since bbPress (r2697)
*
* @uses get_currentuserinfo()
* @global WP_User Current user object
*/
function setup_current_user() {
global $current_user;
if ( !isset( $current_user ) )
$current_user = get_currentuserinfo();
// Set the current user in the bbPress global
$this->current_user = $current_user;
}
/**
* Add the bbPress-specific rewrite tags
*
* @since bbPress (r2753)
*
* @uses add_rewrite_tag() To add the rewrite tags
*/
function add_rewrite_tags() {
// User Profile tag
add_rewrite_tag( '%bbp_user%', '([^/]+)' );
// View Page tag
add_rewrite_tag( '%bbp_view%', '([^/]+)' );
// Edit Page tag
add_rewrite_tag( '%edit%', '([1]{1,})' );
}
/**
* Register bbPress-specific rewrite rules
*
* @since bbPress (r2688)
*
* @param WP_Rewrite $wp_rewrite bbPress-sepecific rules are appended in
* $wp_rewrite->rules
*/
function generate_rewrite_rules( $wp_rewrite ) {
// New rules to merge with existing
$bbp_rules = array(
// Edit Topic/Reply
$this->topic_slug . '/([^/]+)/edit/?$' => 'index.php?' . $this->topic_post_type . '=' . $wp_rewrite->preg_index( 1 ) . '&edit=1',
$this->reply_slug . '/([^/]+)/edit/?$' => 'index.php?' . $this->reply_post_type . '=' . $wp_rewrite->preg_index( 1 ) . '&edit=1',
// Profile Page
$this->user_slug . '/([^/]+)/page/?([0-9]{1,})/?$' => 'index.php?bbp_user=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
$this->user_slug . '/([^/]+)/?$' => 'index.php?bbp_user=' . $wp_rewrite->preg_index( 1 ),
$this->user_slug . '/([^/]+)/edit/?$' => 'index.php?bbp_user=' . $wp_rewrite->preg_index( 1 ) . '&edit=1',
// @todo - favorites feeds
//$this->user_slug . '/([^/]+)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?bbp_user=' . $wp_rewrite->preg_index( 1 ) . '&feed=' . $wp_rewrite->preg_index( 2 ),
//$this->user_slug . '/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?bbp_user=' . $wp_rewrite->preg_index( 1 ) . '&feed=' . $wp_rewrite->preg_index( 2 ),
// @todo - view feeds
//$this->view_slug . '/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?bbp_view=' . $wp_rewrite->preg_index( 1 ) . '&feed=' . $wp_rewrite->preg_index( 2 ),
// View Page
$this->view_slug . '/([^/]+)/page/?([0-9]{1,})/?$' => 'index.php?bbp_view=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
$this->view_slug . '/([^/]+)/?$' => 'index.php?bbp_view=' . $wp_rewrite->preg_index( 1 )
);
// Merge bbPress rules with existing
$wp_rewrite->rules = array_merge( $bbp_rules, $wp_rewrite->rules );
// Return merged rules
return $wp_rewrite;
}
/**
* If not using a bbPress compatable theme, enqueue some basic styling and js
*
* @since bbPress (r3029)
*
* @global bbPress $bbp
* @uses bbp_set_theme_compat() 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 theme_compat() {
global $bbp;
// Check if current theme supports bbPress
if ( !current_theme_supports( 'bbpress' ) ) {
// Set the compat_theme global for help with loading template parts
bbp_set_theme_compat( $bbp->themes_dir . '/bbp-twentyten' );
/** Default CSS ***************************************************/
// Do not enqueue CSS in admin
if ( !is_admin() ) {
// Right to left
if ( is_rtl() ) {
wp_enqueue_style( 'bbpress-style', $bbp->themes_url . '/bbp-twentyten/css/bbpress-rtl.css' );
// Left to right
} else {
wp_enqueue_style( 'bbpress-style', $bbp->themes_url . '/bbp-twentyten/css/bbpress.css' );
}
}
}
}
}
// "And now here's something we hope you'll really like!"
$bbp = new bbPress();
endif; // class_exists check
/**
* Runs on bbPress activation
*
* @since bbPress (r2509)
*
* @uses register_uninstall_hook() To register our own uninstall hook
* @uses do_action() Calls 'bbp_activation' hook
*/
function bbp_activation() {
register_uninstall_hook( __FILE__, 'bbp_uninstall' );
do_action( 'bbp_activation' );
}
/**
* Runs on bbPress deactivation
*
* @since bbPress (r2509)
*
* @uses do_action() Calls 'bbp_deactivation' hook
*/
function bbp_deactivation() {
do_action( 'bbp_deactivation' );
}
/**
* Runs when uninstalling bbPress
*
* @since bbPress (r2509)
*
* @uses do_action() Calls 'bbp_uninstall' hook
*/
function bbp_uninstall() {
do_action( 'bbp_uninstall' );
}
?>