Changeset 5271
- Timestamp:
- 02/10/2014 11:22:21 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 219 added
- 7 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property
svn:ignore
set to
.jshintrc
.travis.yml
-
Property
svn:ignore
set to
-
trunk/bbpress.php
r5256 r5271 26 26 if ( !defined( 'ABSPATH' ) ) exit; 27 27 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 29 include( __DIR__ . '/src/bbpress.php' );
Note: See TracChangeset
for help on using the changeset viewer.