Skip to:
Content

bbPress.org

Changeset 5271


Ignore:
Timestamp:
02/10/2014 11:22:21 PM (9 years ago)
Author:
johnjamesjacoby
Message:

Gruntify bbPress trunk (part 2):

  • Move bbPress core files into /src
  • Move tests into /tests/phpunit/
  • Move phpunit.xml into trunk root
  • Introduce Grunt and Travis configuration files
  • Introduce stub bbpress.php to help activate bbPress for existing trunk checkouts
  • See #2542.
Location:
trunk
Files:
219 added
7 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:ignore set to
      .jshintrc
      .travis.yml
  • trunk/bbpress.php

    r5256 r5271  
    2626if ( !defined( 'ABSPATH' ) ) exit;
    2727
    28 if ( !class_exists( 'bbPress' ) ) :
    29 /**
    30  * Main bbPress Class
    31  *
    32  * "How doth the little busy bee, improve each shining hour..."
    33  *
    34  * @since bbPress (r2464)
    35  */
    36 final class bbPress {
    37 
    38     /** Magic *****************************************************************/
    39 
    40     /**
    41      * bbPress uses many variables, several of which can be filtered to
    42      * customize the way it operates. Most of these variables are stored in a
    43      * private array that gets updated with the help of PHP magic methods.
    44      *
    45      * This is a precautionary measure, to avoid potential errors produced by
    46      * unanticipated direct manipulation of bbPress's run-time data.
    47      *
    48      * @see bbPress::setup_globals()
    49      * @var array
    50      */
    51     private $data;
    52 
    53     /** Not Magic *************************************************************/
    54 
    55     /**
    56      * @var mixed False when not logged in; WP_User object when logged in
    57      */
    58     public $current_user = false;
    59 
    60     /**
    61      * @var obj Add-ons append to this (Akismet, BuddyPress, etc...)
    62      */
    63     public $extend;
    64 
    65     /**
    66      * @var array Topic views
    67      */
    68     public $views        = array();
    69 
    70     /**
    71      * @var array Overloads get_option()
    72      */
    73     public $options      = array();
    74 
    75     /**
    76      * @var array Overloads get_user_meta()
    77      */
    78     public $user_options = array();
    79 
    80     /** Singleton *************************************************************/
    81 
    82     /**
    83      * Main bbPress Instance
    84      *
    85      * bbPress is fun
    86      * Please load it only one time
    87      * For this, we thank you
    88      *
    89      * Insures that only one instance of bbPress exists in memory at any one
    90      * time. Also prevents needing to define globals all over the place.
    91      *
    92      * @since bbPress (r3757)
    93      * @staticvar object $instance
    94      * @uses bbPress::setup_globals() Setup the globals needed
    95      * @uses bbPress::includes() Include the required files
    96      * @uses bbPress::setup_actions() Setup the hooks and actions
    97      * @see bbpress()
    98      * @return The one true bbPress
    99      */
    100     public static function instance() {
    101 
    102         // Store the instance locally to avoid private static replication
    103         static $instance = null;
    104 
    105         // Only run these methods if they haven't been ran previously
    106         if ( null === $instance ) {
    107             $instance = new bbPress;
    108             $instance->setup_globals();
    109             $instance->includes();
    110             $instance->setup_actions();
    111         }
    112 
    113         // Always return the instance
    114         return $instance;
    115     }
    116 
    117     /** Magic Methods *********************************************************/
    118 
    119     /**
    120      * A dummy constructor to prevent bbPress from being loaded more than once.
    121      *
    122      * @since bbPress (r2464)
    123      * @see bbPress::instance()
    124      * @see bbpress();
    125      */
    126     private function __construct() { /* Do nothing here */ }
    127 
    128     /**
    129      * A dummy magic method to prevent bbPress from being cloned
    130      *
    131      * @since bbPress (r2464)
    132      */
    133     public function __clone() { _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'bbpress' ), '2.1' ); }
    134 
    135     /**
    136      * A dummy magic method to prevent bbPress from being unserialized
    137      *
    138      * @since bbPress (r2464)
    139      */
    140     public function __wakeup() { _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'bbpress' ), '2.1' ); }
    141 
    142     /**
    143      * Magic method for checking the existence of a certain custom field
    144      *
    145      * @since bbPress (r3951)
    146      */
    147     public function __isset( $key ) { return isset( $this->data[$key] ); }
    148 
    149     /**
    150      * Magic method for getting bbPress variables
    151      *
    152      * @since bbPress (r3951)
    153      */
    154     public function __get( $key ) { return isset( $this->data[$key] ) ? $this->data[$key] : null; }
    155 
    156     /**
    157      * Magic method for setting bbPress variables
    158      *
    159      * @since bbPress (r3951)
    160      */
    161     public function __set( $key, $value ) { $this->data[$key] = $value; }
    162 
    163     /**
    164      * Magic method for unsetting bbPress variables
    165      *
    166      * @since bbPress (r4628)
    167      */
    168     public function __unset( $key ) { if ( isset( $this->data[$key] ) ) unset( $this->data[$key] ); }
    169 
    170     /**
    171      * Magic method to prevent notices and errors from invalid method calls
    172      *
    173      * @since bbPress (r4252)
    174      */
    175     public function __call( $name = '', $args = array() ) { unset( $name, $args ); return null; }
    176 
    177     /** Private Methods *******************************************************/
    178 
    179     /**
    180      * Set some smart defaults to class variables. Allow some of them to be
    181      * filtered to allow for early overriding.
    182      *
    183      * @since bbPress (r2626)
    184      * @access private
    185      * @uses plugin_dir_path() To generate bbPress plugin path
    186      * @uses plugin_dir_url() To generate bbPress plugin url
    187      * @uses apply_filters() Calls various filters
    188      */
    189     private function setup_globals() {
    190 
    191         /** Versions **********************************************************/
    192 
    193         $this->version    = '2.6-alpha-5235';
    194         $this->db_version = '250';
    195 
    196         /** Paths *************************************************************/
    197 
    198         // Setup some base path and URL information
    199         $this->file       = __FILE__;
    200         $this->basename   = apply_filters( 'bbp_plugin_basenname', plugin_basename( $this->file ) );
    201         $this->plugin_dir = apply_filters( 'bbp_plugin_dir_path',  plugin_dir_path( $this->file ) );
    202         $this->plugin_url = apply_filters( 'bbp_plugin_dir_url',   plugin_dir_url ( $this->file ) );
    203 
    204         // Includes
    205         $this->includes_dir = apply_filters( 'bbp_includes_dir', trailingslashit( $this->plugin_dir . 'includes'  ) );
    206         $this->includes_url = apply_filters( 'bbp_includes_url', trailingslashit( $this->plugin_url . 'includes'  ) );
    207 
    208         // Languages
    209         $this->lang_dir     = apply_filters( 'bbp_lang_dir',     trailingslashit( $this->plugin_dir . 'languages' ) );
    210 
    211         // Templates
    212         $this->themes_dir   = apply_filters( 'bbp_themes_dir',   trailingslashit( $this->plugin_dir . 'templates' ) );
    213         $this->themes_url   = apply_filters( 'bbp_themes_url',   trailingslashit( $this->plugin_url . 'templates' ) );
    214 
    215         /** Identifiers *******************************************************/
    216 
    217         // Post type identifiers
    218         $this->forum_post_type   = apply_filters( 'bbp_forum_post_type',  'forum'     );
    219         $this->topic_post_type   = apply_filters( 'bbp_topic_post_type',  'topic'     );
    220         $this->reply_post_type   = apply_filters( 'bbp_reply_post_type',  'reply'     );
    221         $this->topic_tag_tax_id  = apply_filters( 'bbp_topic_tag_tax_id', 'topic-tag' );
    222 
    223         // Status identifiers
    224         $this->spam_status_id    = apply_filters( 'bbp_spam_post_status',    'spam'    );
    225         $this->closed_status_id  = apply_filters( 'bbp_closed_post_status',  'closed'  );
    226         $this->orphan_status_id  = apply_filters( 'bbp_orphan_post_status',  'orphan'  );
    227         $this->public_status_id  = apply_filters( 'bbp_public_post_status',  'publish' );
    228         $this->pending_status_id = apply_filters( 'bbp_pending_post_status', 'pending' );
    229         $this->private_status_id = apply_filters( 'bbp_private_post_status', 'private' );
    230         $this->hidden_status_id  = apply_filters( 'bbp_hidden_post_status',  'hidden'  );
    231         $this->trash_status_id   = apply_filters( 'bbp_trash_post_status',   'trash'   );
    232 
    233         // Other identifiers
    234         $this->user_id           = apply_filters( 'bbp_user_id',   'bbp_user'   );
    235         $this->tops_id           = apply_filters( 'bbp_tops_id',   'bbp_tops'   );
    236         $this->reps_id           = apply_filters( 'bbp_reps_id',   'bbp_reps'   );
    237         $this->favs_id           = apply_filters( 'bbp_favs_id',   'bbp_favs'   );
    238         $this->subs_id           = apply_filters( 'bbp_subs_id',   'bbp_subs'   );
    239         $this->view_id           = apply_filters( 'bbp_view_id',   'bbp_view'   );
    240         $this->edit_id           = apply_filters( 'bbp_edit_id',   'edit'       );
    241         $this->paged_id          = apply_filters( 'bbp_paged_id',  'paged'      );
    242         $this->search_id         = apply_filters( 'bbp_search_id', 'bbp_search' );
    243 
    244         /** Queries ***********************************************************/
    245 
    246         $this->current_view_id      = 0; // Current view id
    247         $this->current_forum_id     = 0; // Current forum id
    248         $this->current_topic_id     = 0; // Current topic id
    249         $this->current_reply_id     = 0; // Current reply id
    250         $this->current_topic_tag_id = 0; // Current topic tag id
    251 
    252         $this->forum_query    = new WP_Query(); // Main forum query
    253         $this->topic_query    = new WP_Query(); // Main topic query
    254         $this->reply_query    = new WP_Query(); // Main reply query
    255         $this->search_query   = new WP_Query(); // Main search query
    256 
    257         /** Theme Compat ******************************************************/
    258 
    259         $this->theme_compat   = new stdClass(); // Base theme compatibility class
    260         $this->filters        = new stdClass(); // Used when adding/removing filters
    261 
    262         /** Users *************************************************************/
    263 
    264         $this->current_user   = new WP_User(); // Currently logged in user
    265         $this->displayed_user = new WP_User(); // Currently displayed user
    266 
    267         /** Misc **************************************************************/
    268 
    269         $this->domain         = 'bbpress';      // Unique identifier for retrieving translated strings
    270         $this->extend         = new stdClass(); // Plugins add data here
    271         $this->errors         = new WP_Error(); // Feedback
    272         $this->tab_index      = apply_filters( 'bbp_default_tab_index', 100 );
    273     }
    274 
    275     /**
    276      * Include required files
    277      *
    278      * @since bbPress (r2626)
    279      * @access private
    280      * @uses is_admin() If in WordPress admin, load additional file
    281      */
    282     private function includes() {
    283 
    284         /** Core **************************************************************/
    285 
    286         require( $this->includes_dir . 'core/sub-actions.php'        );
    287         require( $this->includes_dir . 'core/functions.php'          );
    288         require( $this->includes_dir . 'core/cache.php'              );
    289         require( $this->includes_dir . 'core/options.php'            );
    290         require( $this->includes_dir . 'core/capabilities.php'       );
    291         require( $this->includes_dir . 'core/update.php'             );
    292         require( $this->includes_dir . 'core/template-functions.php' );
    293         require( $this->includes_dir . 'core/template-loader.php'    );
    294         require( $this->includes_dir . 'core/theme-compat.php'       );
    295 
    296         /** Components ********************************************************/
    297 
    298         // Common
    299         require( $this->includes_dir . 'common/ajax.php'          );
    300         require( $this->includes_dir . 'common/classes.php'       );
    301         require( $this->includes_dir . 'common/functions.php'     );
    302         require( $this->includes_dir . 'common/formatting.php'    );
    303         require( $this->includes_dir . 'common/template.php'      );
    304         require( $this->includes_dir . 'common/widgets.php'       );
    305         require( $this->includes_dir . 'common/shortcodes.php'    );
    306 
    307         // Forums
    308         require( $this->includes_dir . 'forums/capabilities.php'  );
    309         require( $this->includes_dir . 'forums/functions.php'     );
    310         require( $this->includes_dir . 'forums/template.php'      );
    311 
    312         // Topics
    313         require( $this->includes_dir . 'topics/capabilities.php'  );
    314         require( $this->includes_dir . 'topics/functions.php'     );
    315         require( $this->includes_dir . 'topics/template.php'      );
    316 
    317         // Replies
    318         require( $this->includes_dir . 'replies/capabilities.php' );
    319         require( $this->includes_dir . 'replies/functions.php'    );
    320         require( $this->includes_dir . 'replies/template.php'     );
    321 
    322         // Search
    323         require( $this->includes_dir . 'search/functions.php'     );
    324         require( $this->includes_dir . 'search/template.php'      );
    325 
    326         // Users
    327         require( $this->includes_dir . 'users/capabilities.php'   );
    328         require( $this->includes_dir . 'users/functions.php'      );
    329         require( $this->includes_dir . 'users/template.php'       );
    330         require( $this->includes_dir . 'users/options.php'        );
    331 
    332         /** Hooks *************************************************************/
    333 
    334         require( $this->includes_dir . 'core/extend.php'  );
    335         require( $this->includes_dir . 'core/actions.php' );
    336         require( $this->includes_dir . 'core/filters.php' );
    337 
    338         /** Admin *************************************************************/
    339 
    340         // Quick admin check and load if needed
    341         if ( is_admin() ) {
    342             require( $this->includes_dir . 'admin/admin.php'   );
    343             require( $this->includes_dir . 'admin/actions.php' );
    344         }
    345     }
    346 
    347     /**
    348      * Setup the default hooks and actions
    349      *
    350      * @since bbPress (r2644)
    351      * @access private
    352      * @uses add_action() To add various actions
    353      */
    354     private function setup_actions() {
    355 
    356         // Add actions to plugin activation and deactivation hooks
    357         add_action( 'activate_'   . $this->basename, 'bbp_activation'   );
    358         add_action( 'deactivate_' . $this->basename, 'bbp_deactivation' );
    359 
    360         // If bbPress is being deactivated, do not add any actions
    361         if ( bbp_is_deactivation( $this->basename ) ) {
    362             return;
    363         }
    364 
    365         // Array of bbPress core actions
    366         $actions = array(
    367             'setup_theme',              // Setup the default theme compat
    368             'setup_current_user',       // Setup currently logged in user
    369             'register_post_types',      // Register post types (forum|topic|reply)
    370             'register_post_statuses',   // Register post statuses (closed|spam|orphan|hidden)
    371             'register_taxonomies',      // Register taxonomies (topic-tag)
    372             'register_shortcodes',      // Register shortcodes (bbp-login)
    373             'register_views',           // Register the views (no-replies)
    374             'register_theme_packages',  // Register bundled theme packages (bbp-theme-compat/bbp-themes)
    375             'load_textdomain',          // Load textdomain (bbpress)
    376             'add_rewrite_tags',         // Add rewrite tags (view|user|edit|search)
    377             'add_rewrite_rules',        // Generate rewrite rules (view|edit|paged|search)
    378             'add_permastructs'          // Add permalink structures (view|user|search)
    379         );
    380 
    381         // Add the actions
    382         foreach ( $actions as $class_action ) {
    383             add_action( 'bbp_' . $class_action, array( $this, $class_action ), 5 );
    384         }
    385 
    386         // All bbPress actions are setup (includes bbp-core-hooks.php)
    387         do_action_ref_array( 'bbp_after_setup_actions', array( &$this ) );
    388     }
    389 
    390     /** Public Methods ********************************************************/
    391 
    392     /**
    393      * Register bundled theme packages
    394      *
    395      * Note that since we currently have complete control over bbp-themes and
    396      * the bbp-theme-compat folders, it's fine to hardcode these here. If at a
    397      * later date we need to automate this, and API will need to be built.
    398      *
    399      * @since bbPress (r3829)
    400      */
    401     public function register_theme_packages() {
    402 
    403         // Register the default theme compatibility package
    404         bbp_register_theme_package( array(
    405             'id'      => 'default',
    406             'name'    => __( 'bbPress Default', 'bbpress' ),
    407             'version' => bbp_get_version(),
    408             'dir'     => trailingslashit( $this->themes_dir . 'default' ),
    409             'url'     => trailingslashit( $this->themes_url . 'default' )
    410         ) );
    411 
    412         // Register the basic theme stack. This is really dope.
    413         bbp_register_template_stack( 'get_stylesheet_directory', 10 );
    414         bbp_register_template_stack( 'get_template_directory',   12 );
    415         bbp_register_template_stack( 'bbp_get_theme_compat_dir', 14 );
    416     }
    417 
    418     /**
    419      * Setup the default bbPress theme compatibility location.
    420      *
    421      * @since bbPress (r3778)
    422      */
    423     public function setup_theme() {
    424 
    425         // Bail if something already has this under control
    426         if ( ! empty( $this->theme_compat->theme ) )
    427             return;
    428 
    429         // Setup the theme package to use for compatibility
    430         bbp_setup_theme_compat( bbp_get_theme_package_id() );
    431     }
    432 
    433     /**
    434      * Load the translation file for current language. Checks the deprecated
    435      * languages folder inside the bbPress plugin first, and then the default
    436      * WordPress languages folder.
    437      *
    438      * Note that custom translation files inside the bbPress plugin folder
    439      * will be removed on bbPress updates. If you're creating custom
    440      * translation files, please use the global language folder.
    441      *
    442      * @since bbPress (r2596)
    443      *
    444      * @uses apply_filters() Calls 'plugin_locale' with {@link get_locale()} value
    445      * @uses load_textdomain() To load the textdomain
    446      */
    447     public function load_textdomain() {
    448 
    449         // Traditional WordPress plugin locale filter
    450         $locale        = apply_filters( 'plugin_locale', get_locale(), $this->domain );
    451         $mofile        = sprintf( '%1$s-%2$s.mo', $this->domain, $locale );
    452 
    453         // Setup paths to current locale file
    454         $mofile_local  = $this->lang_dir . $mofile;
    455         $mofile_global = WP_LANG_DIR . '/bbpress/' . $mofile;
    456 
    457         // Look in global /wp-content/languages/bbpress folder
    458         load_textdomain( $this->domain, $mofile_global );
    459 
    460         // Look in local /wp-content/plugins/bbpress/bbp-languages/ folder
    461         load_textdomain( $this->domain, $mofile_local );
    462 
    463         // Look in global /wp-content/languages/plugins/
    464         load_plugin_textdomain( $this->domain );
    465     }
    466 
    467     /**
    468      * Setup the post types for forums, topics and replies
    469      *
    470      * @since bbPress (r2597)
    471      * @uses register_post_type() To register the post types
    472      * @uses apply_filters() Calls various filters to modify the arguments
    473      *                        sent to register_post_type()
    474      */
    475     public static function register_post_types() {
    476 
    477         /** Forums ************************************************************/
    478 
    479         // Register Forum content type
    480         register_post_type(
    481             bbp_get_forum_post_type(),
    482             apply_filters( 'bbp_register_forum_post_type', array(
    483                 'labels'              => bbp_get_forum_post_type_labels(),
    484                 'rewrite'             => bbp_get_forum_post_type_rewrite(),
    485                 'supports'            => bbp_get_forum_post_type_supports(),
    486                 'description'         => __( 'bbPress Forums', 'bbpress' ),
    487                 'capabilities'        => bbp_get_forum_caps(),
    488                 'capability_type'     => array( 'forum', 'forums' ),
    489                 'menu_position'       => 555555,
    490                 'has_archive'         => bbp_get_root_slug(),
    491                 'exclude_from_search' => true,
    492                 'show_in_nav_menus'   => true,
    493                 'public'              => true,
    494                 'show_ui'             => current_user_can( 'bbp_forums_admin' ),
    495                 'can_export'          => true,
    496                 'hierarchical'        => true,
    497                 'query_var'           => true,
    498                 'menu_icon'           => ''
    499             ) )
    500         );
    501 
    502         /** Topics ************************************************************/
    503 
    504         // Register Topic content type
    505         register_post_type(
    506             bbp_get_topic_post_type(),
    507             apply_filters( 'bbp_register_topic_post_type', array(
    508                 'labels'              => bbp_get_topic_post_type_labels(),
    509                 'rewrite'             => bbp_get_topic_post_type_rewrite(),
    510                 'supports'            => bbp_get_topic_post_type_supports(),
    511                 'description'         => __( 'bbPress Topics', 'bbpress' ),
    512                 'capabilities'        => bbp_get_topic_caps(),
    513                 'capability_type'     => array( 'topic', 'topics' ),
    514                 'menu_position'       => 555555,
    515                 'has_archive'         => ( 'forums' === bbp_show_on_root() ) ? bbp_get_topic_archive_slug() : false,
    516                 'exclude_from_search' => true,
    517                 'show_in_nav_menus'   => false,
    518                 'public'              => true,
    519                 'show_ui'             => current_user_can( 'bbp_topics_admin' ),
    520                 'can_export'          => true,
    521                 'hierarchical'        => false,
    522                 'query_var'           => true,
    523                 'menu_icon'           => ''
    524             )
    525         ) );
    526 
    527         /** Replies ***********************************************************/
    528 
    529         // Register reply content type
    530         register_post_type(
    531             bbp_get_reply_post_type(),
    532             apply_filters( 'bbp_register_reply_post_type', array(
    533                 'labels'              => bbp_get_reply_post_type_labels(),
    534                 'rewrite'             => bbp_get_reply_post_type_rewrite(),
    535                 'supports'            => bbp_get_reply_post_type_supports(),
    536                 'description'         => __( 'bbPress Replies', 'bbpress' ),
    537                 'capabilities'        => bbp_get_reply_caps(),
    538                 'capability_type'     => array( 'reply', 'replies' ),
    539                 'menu_position'       => 555555,
    540                 'exclude_from_search' => true,
    541                 'has_archive'         => false,
    542                 'show_in_nav_menus'   => false,
    543                 'public'              => true,
    544                 'show_ui'             => current_user_can( 'bbp_replies_admin' ),
    545                 'can_export'          => true,
    546                 'hierarchical'        => false,
    547                 'query_var'           => true,
    548                 'menu_icon'           => ''
    549             ) )
    550         );
    551     }
    552 
    553     /**
    554      * Register the post statuses used by bbPress
    555      *
    556      * We do some manipulation of the 'trash' status so trashed topics and
    557      * replies can be viewed from within the theme.
    558      *
    559      * @since bbPress (r2727)
    560      * @uses register_post_status() To register post statuses
    561      * @uses $wp_post_statuses To modify trash and private statuses
    562      * @uses current_user_can() To check if the current user is capable &
    563      *                           modify $wp_post_statuses accordingly
    564      */
    565     public static function register_post_statuses() {
    566 
    567         // Closed
    568         register_post_status(
    569             bbp_get_closed_status_id(),
    570             apply_filters( 'bbp_register_closed_post_status', array(
    571                 'label'             => _x( 'Closed', 'post', 'bbpress' ),
    572                 'label_count'       => _nx_noop( 'Closed <span class="count">(%s)</span>', 'Closed <span class="count">(%s)</span>', 'post', 'bbpress' ),
    573                 'public'            => true,
    574                 'show_in_admin_all' => true
    575             ) )
    576         );
    577 
    578         // Spam
    579         register_post_status(
    580             bbp_get_spam_status_id(),
    581             apply_filters( 'bbp_register_spam_post_status', array(
    582                 'label'                     => _x( 'Spam', 'post', 'bbpress' ),
    583                 'label_count'               => _nx_noop( 'Spam <span class="count">(%s)</span>', 'Spam <span class="count">(%s)</span>', 'post', 'bbpress' ),
    584                 'protected'                 => true,
    585                 'exclude_from_search'       => true,
    586                 'show_in_admin_status_list' => true,
    587                 'show_in_admin_all_list'    => false
    588             ) )
    589          );
    590 
    591         // Orphan
    592         register_post_status(
    593             bbp_get_orphan_status_id(),
    594             apply_filters( 'bbp_register_orphan_post_status', array(
    595                 'label'                     => _x( 'Orphan', 'post', 'bbpress' ),
    596                 'label_count'               => _nx_noop( 'Orphan <span class="count">(%s)</span>', 'Orphans <span class="count">(%s)</span>', 'post', 'bbpress' ),
    597                 'protected'                 => true,
    598                 'exclude_from_search'       => true,
    599                 'show_in_admin_status_list' => true,
    600                 'show_in_admin_all_list'    => false
    601             ) )
    602         );
    603 
    604         // Hidden
    605         register_post_status(
    606             bbp_get_hidden_status_id(),
    607             apply_filters( 'bbp_register_hidden_post_status', array(
    608                 'label'                     => _x( 'Hidden', 'post', 'bbpress' ),
    609                 'label_count'               => _nx_noop( 'Hidden <span class="count">(%s)</span>', 'Hidden <span class="count">(%s)</span>', 'post', 'bbpress' ),
    610                 'private'                   => true,
    611                 'exclude_from_search'       => true,
    612                 'show_in_admin_status_list' => true,
    613                 'show_in_admin_all_list'    => true
    614             ) )
    615         );
    616 
    617         /**
    618          * Trash fix
    619          *
    620          * We need to remove the internal arg and change that to
    621          * protected so that the users with 'view_trash' cap can view
    622          * single trashed topics/replies in the front-end as wp_query
    623          * doesn't allow any hack for the trashed topics to be viewed.
    624          */
    625         global $wp_post_statuses;
    626 
    627         if ( !empty( $wp_post_statuses['trash'] ) ) {
    628 
    629             // User can view trash so set internal to false
    630             if ( current_user_can( 'view_trash' ) ) {
    631                 $wp_post_statuses['trash']->internal  = false;
    632                 $wp_post_statuses['trash']->protected = true;
    633 
    634             // User cannot view trash so set internal to true
    635             } else {
    636                 $wp_post_statuses['trash']->internal = true;
    637             }
    638         }
    639     }
    640 
    641     /**
    642      * Register the topic tag taxonomy
    643      *
    644      * @since bbPress (r2464)
    645      * @uses register_taxonomy() To register the taxonomy
    646      */
    647     public static function register_taxonomies() {
    648 
    649         // Register the topic-tag taxonomy
    650         register_taxonomy(
    651             bbp_get_topic_tag_tax_id(),
    652             bbp_get_topic_post_type(),
    653             apply_filters( 'bbp_register_topic_taxonomy', array(
    654                 'labels'                => bbp_get_topic_tag_tax_labels(),
    655                 'rewrite'               => bbp_get_topic_tag_tax_rewrite(),
    656                 'capabilities'          => bbp_get_topic_tag_caps(),
    657                 'update_count_callback' => '_update_post_term_count',
    658                 'query_var'             => true,
    659                 'show_tagcloud'         => true,
    660                 'hierarchical'          => false,
    661                 'show_in_nav_menus'     => false,
    662                 'public'                => true,
    663                 'show_ui'               => bbp_allow_topic_tags() && current_user_can( 'bbp_topic_tags_admin' )
    664             )
    665         ) );
    666     }
    667 
    668     /**
    669      * Register the bbPress views
    670      *
    671      * @since bbPress (r2789)
    672      * @uses bbp_register_view() To register the views
    673      */
    674     public static function register_views() {
    675 
    676         // Popular topics
    677         bbp_register_view(
    678             'popular',
    679             __( 'Most popular topics', 'bbpress' ),
    680             apply_filters( 'bbp_register_view_popular', array(
    681                 'meta_key'      => '_bbp_reply_count',
    682                 'max_num_pages' => 1,
    683                 'orderby'       => 'meta_value_num',
    684                 'show_stickies' => false
    685             )
    686         ) );
    687 
    688         // Topics with no replies
    689         bbp_register_view(
    690             'no-replies',
    691             __( 'Topics with no replies', 'bbpress' ),
    692             apply_filters( 'bbp_register_view_no_replies', array(
    693                 'meta_key'      => '_bbp_reply_count',
    694                 'meta_value'    => 1,
    695                 'meta_compare'  => '<',
    696                 'orderby'       => '',
    697                 'show_stickies' => false
    698             )
    699         ) );
    700     }
    701 
    702     /**
    703      * Register the bbPress shortcodes
    704      *
    705      * @since bbPress (r3031)
    706      *
    707      * @uses BBP_Shortcodes
    708      */
    709     public function register_shortcodes() {
    710         $this->shortcodes = new BBP_Shortcodes();
    711     }
    712 
    713     /**
    714      * Setup the currently logged-in user
    715      *
    716      * Do not to call this prematurely, I.E. before the 'init' action has
    717      * started. This function is naturally hooked into 'init' to ensure proper
    718      * execution. get_currentuserinfo() is used to check for XMLRPC_REQUEST to
    719      * avoid xmlrpc errors.
    720      *
    721      * @since bbPress (r2697)
    722      * @uses wp_get_current_user()
    723      */
    724     public function setup_current_user() {
    725         $this->current_user = wp_get_current_user();
    726     }
    727 
    728     /** Custom Rewrite Rules **************************************************/
    729 
    730     /**
    731      * Add the bbPress-specific rewrite tags
    732      *
    733      * @since bbPress (r2753)
    734      * @uses add_rewrite_tag() To add the rewrite tags
    735      */
    736     public static function add_rewrite_tags() {
    737         add_rewrite_tag( '%' . bbp_get_view_rewrite_id()               . '%', '([^/]+)'   ); // View Page tag
    738         add_rewrite_tag( '%' . bbp_get_edit_rewrite_id()               . '%', '([1]{1,})' ); // Edit Page tag
    739         add_rewrite_tag( '%' . bbp_get_search_rewrite_id()             . '%', '([^/]+)'   ); // Search Results tag
    740         add_rewrite_tag( '%' . bbp_get_user_rewrite_id()               . '%', '([^/]+)'   ); // User Profile tag
    741         add_rewrite_tag( '%' . bbp_get_user_favorites_rewrite_id()     . '%', '([1]{1,})' ); // User Favorites tag
    742         add_rewrite_tag( '%' . bbp_get_user_subscriptions_rewrite_id() . '%', '([1]{1,})' ); // User Subscriptions tag
    743         add_rewrite_tag( '%' . bbp_get_user_topics_rewrite_id()        . '%', '([1]{1,})' ); // User Topics Tag
    744         add_rewrite_tag( '%' . bbp_get_user_replies_rewrite_id()       . '%', '([1]{1,})' ); // User Replies Tag
    745     }
    746 
    747     /**
    748      * Add bbPress-specific rewrite rules for uri's that are not
    749      * setup for us by way of custom post types or taxonomies. This includes:
    750      * - Front-end editing
    751      * - Topic views
    752      * - User profiles
    753      *
    754      * @since bbPress (r2688)
    755      * @todo Extract into an API
    756      */
    757     public static function add_rewrite_rules() {
    758 
    759         /** Setup *************************************************************/
    760 
    761         // Add rules to top or bottom?
    762         $priority           = 'top';
    763 
    764         // Single Slugs
    765         $forum_slug         = bbp_get_forum_slug();
    766         $topic_slug         = bbp_get_topic_slug();
    767         $reply_slug         = bbp_get_reply_slug();
    768         $ttag_slug          = bbp_get_topic_tag_tax_slug();
    769 
    770         // Archive Slugs
    771         $user_slug          = bbp_get_user_slug();
    772         $view_slug          = bbp_get_view_slug();
    773         $search_slug        = bbp_get_search_slug();
    774         $topic_archive_slug = bbp_get_topic_archive_slug();
    775         $reply_archive_slug = bbp_get_reply_archive_slug();
    776 
    777         // Tertiary Slugs
    778         $feed_slug          = 'feed';
    779         $edit_slug          = 'edit';
    780         $paged_slug         = bbp_get_paged_slug();
    781         $user_favs_slug     = bbp_get_user_favorites_slug();
    782         $user_subs_slug     = bbp_get_user_subscriptions_slug();
    783 
    784         // Unique rewrite ID's
    785         $feed_id            = 'feed';
    786         $edit_id            = bbp_get_edit_rewrite_id();
    787         $view_id            = bbp_get_view_rewrite_id();
    788         $paged_id           = bbp_get_paged_rewrite_id();
    789         $search_id          = bbp_get_search_rewrite_id();
    790         $user_id            = bbp_get_user_rewrite_id();
    791         $user_favs_id       = bbp_get_user_favorites_rewrite_id();
    792         $user_subs_id       = bbp_get_user_subscriptions_rewrite_id();
    793         $user_tops_id       = bbp_get_user_topics_rewrite_id();
    794         $user_reps_id       = bbp_get_user_replies_rewrite_id();
    795 
    796         // Rewrite rule matches used repeatedly below
    797         $root_rule    = '/([^/]+)/?$';
    798         $feed_rule    = '/([^/]+)/' . $feed_slug  . '/?$';
    799         $edit_rule    = '/([^/]+)/' . $edit_slug  . '/?$';
    800         $paged_rule   = '/([^/]+)/' . $paged_slug . '/?([0-9]{1,})/?$';
    801 
    802         // Search rules (without slug check)
    803         $search_root_rule  = '/?$';
    804         $search_paged_rule = '/' . $paged_slug . '/?([0-9]{1,})/?$';
    805 
    806         /** Add ***************************************************************/
    807 
    808         // User profile rules
    809         $tops_rule       = '/([^/]+)/' . $topic_archive_slug . '/?$';
    810         $reps_rule       = '/([^/]+)/' . $reply_archive_slug . '/?$';
    811         $favs_rule       = '/([^/]+)/' . $user_favs_slug     . '/?$';
    812         $subs_rule       = '/([^/]+)/' . $user_subs_slug     . '/?$';
    813         $tops_paged_rule = '/([^/]+)/' . $topic_archive_slug . '/' . $paged_slug . '/?([0-9]{1,})/?$';
    814         $reps_paged_rule = '/([^/]+)/' . $reply_archive_slug . '/' . $paged_slug . '/?([0-9]{1,})/?$';
    815         $favs_paged_rule = '/([^/]+)/' . $user_favs_slug     . '/' . $paged_slug . '/?([0-9]{1,})/?$';
    816         $subs_paged_rule = '/([^/]+)/' . $user_subs_slug     . '/' . $paged_slug . '/?([0-9]{1,})/?$';
    817 
    818         // Edit Forum|Topic|Reply|Topic-tag
    819         add_rewrite_rule( $forum_slug . $edit_rule, 'index.php?' . bbp_get_forum_post_type()  . '=$matches[1]&' . $edit_id . '=1', $priority );
    820         add_rewrite_rule( $topic_slug . $edit_rule, 'index.php?' . bbp_get_topic_post_type()  . '=$matches[1]&' . $edit_id . '=1', $priority );
    821         add_rewrite_rule( $reply_slug . $edit_rule, 'index.php?' . bbp_get_reply_post_type()  . '=$matches[1]&' . $edit_id . '=1', $priority );
    822         add_rewrite_rule( $ttag_slug  . $edit_rule, 'index.php?' . bbp_get_topic_tag_tax_id() . '=$matches[1]&' . $edit_id . '=1', $priority );
    823 
    824         // User Pagination|Edit|View
    825         add_rewrite_rule( $user_slug . $tops_paged_rule, 'index.php?' . $user_id  . '=$matches[1]&' . $user_tops_id . '=1&' . $paged_id . '=$matches[2]', $priority );
    826         add_rewrite_rule( $user_slug . $reps_paged_rule, 'index.php?' . $user_id  . '=$matches[1]&' . $user_reps_id . '=1&' . $paged_id . '=$matches[2]', $priority );
    827         add_rewrite_rule( $user_slug . $favs_paged_rule, 'index.php?' . $user_id  . '=$matches[1]&' . $user_favs_id . '=1&' . $paged_id . '=$matches[2]', $priority );
    828         add_rewrite_rule( $user_slug . $subs_paged_rule, 'index.php?' . $user_id  . '=$matches[1]&' . $user_subs_id . '=1&' . $paged_id . '=$matches[2]', $priority );
    829         add_rewrite_rule( $user_slug . $tops_rule,       'index.php?' . $user_id  . '=$matches[1]&' . $user_tops_id . '=1',                               $priority );
    830         add_rewrite_rule( $user_slug . $reps_rule,       'index.php?' . $user_id  . '=$matches[1]&' . $user_reps_id . '=1',                               $priority );
    831         add_rewrite_rule( $user_slug . $favs_rule,       'index.php?' . $user_id  . '=$matches[1]&' . $user_favs_id . '=1',                               $priority );
    832         add_rewrite_rule( $user_slug . $subs_rule,       'index.php?' . $user_id  . '=$matches[1]&' . $user_subs_id . '=1',                               $priority );
    833         add_rewrite_rule( $user_slug . $edit_rule,       'index.php?' . $user_id  . '=$matches[1]&' . $edit_id      . '=1',                               $priority );
    834         add_rewrite_rule( $user_slug . $root_rule,       'index.php?' . $user_id  . '=$matches[1]',                                                       $priority );
    835 
    836         // Topic-View Pagination|Feed|View
    837         add_rewrite_rule( $view_slug . $paged_rule, 'index.php?' . $view_id . '=$matches[1]&' . $paged_id . '=$matches[2]', $priority );
    838         add_rewrite_rule( $view_slug . $feed_rule,  'index.php?' . $view_id . '=$matches[1]&' . $feed_id  . '=$matches[2]', $priority );
    839         add_rewrite_rule( $view_slug . $root_rule,  'index.php?' . $view_id . '=$matches[1]',                               $priority );
    840 
    841         // Search All
    842         add_rewrite_rule( $search_slug . $search_paged_rule, 'index.php?' . $paged_id .'=$matches[1]', $priority );
    843         add_rewrite_rule( $search_slug . $search_root_rule,  'index.php?' . $search_id,                $priority );
    844     }
    845 
    846     /**
    847      * Add permalink structures for new archive-style destinations.
    848      *
    849      * - Users
    850      * - Topic Views
    851      * - Search
    852      *
    853      * @since bbPress (r4930)
    854      */
    855     public static function add_permastructs() {
    856 
    857         // Get unique ID's
    858         $user_id     = bbp_get_user_rewrite_id();
    859         $view_id     = bbp_get_view_rewrite_id();
    860         $search_id   = bbp_get_search_rewrite_id();
    861 
    862         // Get root slugs
    863         $user_slug   = bbp_get_user_slug();
    864         $view_slug   = bbp_get_view_slug();
    865         $search_slug = bbp_get_search_slug();
    866 
    867         // User Permastruct
    868         add_permastruct( $user_id, $user_slug . '/%' . $user_id . '%', array(
    869             'with_front'  => false,
    870             'ep_mask'     => EP_NONE,
    871             'paged'       => false,
    872             'feed'        => false,
    873             'forcomments' => false,
    874             'walk_dirs'   => true,
    875             'endpoints'   => false,
    876         ) );
    877 
    878         // Topic View Permastruct
    879         add_permastruct( $view_id, $view_slug . '/%' . $view_id . '%', array(
    880             'with_front'  => false,
    881             'ep_mask'     => EP_NONE,
    882             'paged'       => false,
    883             'feed'        => false,
    884             'forcomments' => false,
    885             'walk_dirs'   => true,
    886             'endpoints'   => false,
    887         ) );
    888 
    889         // Search Permastruct
    890         add_permastruct( $user_id, $search_slug . '/%' . $search_id . '%', array(
    891             'with_front'  => false,
    892             'ep_mask'     => EP_NONE,
    893             'paged'       => true,
    894             'feed'        => false,
    895             'forcomments' => false,
    896             'walk_dirs'   => true,
    897             'endpoints'   => false,
    898         ) );
    899     }
    900 }
    901 
    902 /**
    903  * The main function responsible for returning the one true bbPress Instance
    904  * to functions everywhere.
    905  *
    906  * Use this function like you would a global variable, except without needing
    907  * to declare the global.
    908  *
    909  * Example: <?php $bbp = bbpress(); ?>
    910  *
    911  * @return The one true bbPress Instance
    912  */
    913 function bbpress() {
    914     return bbPress::instance();
    915 }
    916 
    917 /**
    918  * Hook bbPress early onto the 'plugins_loaded' action.
    919  *
    920  * This gives all other plugins the chance to load before bbPress, to get their
    921  * actions, filters, and overrides setup without bbPress being in the way.
    922  */
    923 if ( defined( 'BBPRESS_LATE_LOAD' ) ) {
    924     add_action( 'plugins_loaded', 'bbpress', (int) BBPRESS_LATE_LOAD );
    925 
    926 // "And now here's something we hope you'll really like!"
    927 } else {
    928     bbpress();
    929 }
    930 
    931 endif; // class_exists check
     28// Include bbPress
     29include( __DIR__ . '/src/bbpress.php' );
Note: See TracChangeset for help on using the changeset viewer.