[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Main BuddyPress Class. 4 * 5 * @package BuddyPress 6 * @subpackage Main 7 * @since 1.6.0 8 */ 9 10 // Exit if accessed directly. 11 defined( 'ABSPATH' ) || exit; 12 13 /** 14 * Main BuddyPress Class. 15 * 16 * Tap tap tap... Is this thing on? 17 * 18 * @since 1.6.0 19 */ 20 class BuddyPress { 21 22 /** Magic *****************************************************************/ 23 24 /** 25 * BuddyPress uses many variables, most of which can be filtered to 26 * customize the way that it works. To prevent unauthorized access, 27 * these variables are stored in a private array that is magically 28 * updated using PHP 5.2+ methods. This is to prevent third party 29 * plugins from tampering with essential information indirectly, which 30 * would cause issues later. 31 * 32 * @see BuddyPress::setup_globals() 33 * @var array 34 */ 35 private $data; 36 37 /** Not Magic *************************************************************/ 38 39 /** 40 * Primary BuddyPress navigation. 41 * 42 * @var array Primary BuddyPress navigation. 43 */ 44 public $bp_nav = array(); 45 46 /** 47 * Options for the BuddyPress navigation. 48 * 49 * @var array Secondary BuddyPress navigation to $bp_nav. 50 */ 51 public $bp_options_nav = array(); 52 53 /** 54 * Unfiltered URI. 55 * 56 * @see bp_core_set_uri_globals() 57 * @var array The unfiltered URI broken down into chunks. 58 */ 59 public $unfiltered_uri = array(); 60 61 /** 62 * Canonical stack. 63 * 64 * @see bp_redirect_canonical() 65 * @see bp_core_new_nav_item() 66 * @var array The canonical URI stack. 67 */ 68 public $canonical_stack = array(); 69 70 /** 71 * Current action variables. 72 * 73 * @var array Additional navigation elements (supplemental). 74 */ 75 public $action_variables = array(); 76 77 /** 78 * Current member type. 79 * 80 * @var string Current member directory type. 81 */ 82 public $current_member_type = ''; 83 84 /** 85 * BuddyPress required components. 86 * 87 * @var array Required components (core, members). 88 */ 89 public $required_components = array(); 90 91 /** 92 * BuddyPress loaded components. 93 * 94 * @var array Additional active components. 95 */ 96 public $loaded_components = array(); 97 98 /** 99 * BuddyPress active components. 100 * 101 * @var array Active components. 102 */ 103 public $active_components = array(); 104 105 /** 106 * Whether autoload is in use. 107 * 108 * @since 2.5.0 109 * 110 * @var bool 111 */ 112 public $do_autoload = true; 113 114 /** Option Overload *******************************************************/ 115 116 /** 117 * BuddyPress options. 118 * 119 * @var array Optional Overloads default options retrieved from get_option(). 120 */ 121 public $options = array(); 122 123 /** Singleton *************************************************************/ 124 125 /** 126 * Main BuddyPress Instance. 127 * 128 * BuddyPress is great. 129 * Please load it only one time. 130 * For this, we thank you. 131 * 132 * Insures that only one instance of BuddyPress exists in memory at any 133 * one time. Also prevents needing to define globals all over the place. 134 * 135 * @since 1.7.0 136 * 137 * @static object $instance 138 * @see buddypress() 139 * 140 * @return BuddyPress|null The one true BuddyPress. 141 */ 142 public static function instance() { 143 144 // Store the instance locally to avoid private static replication. 145 static $instance = null; 146 147 // Only run these methods if they haven't been run previously. 148 if ( null === $instance ) { 149 $instance = new BuddyPress(); 150 $instance->constants(); 151 $instance->setup_globals(); 152 $instance->legacy_constants(); 153 $instance->includes(); 154 $instance->setup_actions(); 155 } 156 157 // Always return the instance. 158 return $instance; 159 160 // The last metroid is in captivity. The galaxy is at peace. 161 } 162 163 /** Magic Methods *********************************************************/ 164 165 /** 166 * A dummy constructor to prevent BuddyPress from being loaded more than once. 167 * 168 * @since 1.7.0 169 * 170 * @see BuddyPress::instance() 171 * @see buddypress() 172 */ 173 private function __construct() { 174 /* Do nothing here */ 175 } 176 177 /** 178 * A dummy magic method to prevent BuddyPress from being cloned. 179 * 180 * @since 1.7.0 181 */ 182 public function __clone() { 183 _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'buddypress' ), '1.7' ); 184 } 185 186 /** 187 * A dummy magic method to prevent BuddyPress from being unserialized. 188 * 189 * @since 1.7.0 190 */ 191 public function __wakeup() { 192 _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'buddypress' ), '1.7' ); 193 } 194 195 /** 196 * Magic method for checking the existence of a certain custom field. 197 * 198 * @since 1.7.0 199 * 200 * @param string $key Key to check the set status for. 201 * 202 * @return bool 203 */ 204 public function __isset( $key ) { 205 return isset( $this->data[ $key ] ); 206 } 207 208 /** 209 * Magic method for getting BuddyPress variables. 210 * 211 * @since 1.7.0 212 * 213 * @param string $key Key to return the value for. 214 * 215 * @return mixed 216 */ 217 public function __get( $key ) { 218 return isset( $this->data[ $key ] ) ? $this->data[ $key ] : null; 219 } 220 221 /** 222 * Magic method for setting BuddyPress variables. 223 * 224 * @since 1.7.0 225 * 226 * @param string $key Key to set a value for. 227 * @param mixed $value Value to set. 228 */ 229 public function __set( $key, $value ) { 230 $this->data[ $key ] = $value; 231 } 232 233 /** 234 * Magic method for unsetting BuddyPress variables. 235 * 236 * @since 1.7.0 237 * 238 * @param string $key Key to unset a value for. 239 */ 240 public function __unset( $key ) { 241 if ( isset( $this->data[ $key ] ) ) { 242 unset( $this->data[ $key ] ); 243 } 244 } 245 246 /** 247 * Magic method to prevent notices and errors from invalid method calls. 248 * 249 * @since 1.7.0 250 * 251 * @param string $name 252 * @param array $args 253 * 254 * @return null 255 */ 256 public function __call( $name = '', $args = array() ) { 257 unset( $name, $args ); 258 259 return null; 260 } 261 262 /** Private Methods *******************************************************/ 263 264 /** 265 * Bootstrap constants. 266 * 267 * @since 1.6.0 268 */ 269 private function constants() { 270 271 // Place your custom code (actions/filters) in a file called 272 // '/plugins/bp-custom.php' and it will be loaded before anything else. 273 if ( file_exists( WP_PLUGIN_DIR . '/bp-custom.php' ) ) { 274 require WP_PLUGIN_DIR . '/bp-custom.php'; 275 } 276 277 // Path and URL. 278 if ( ! defined( 'BP_PLUGIN_DIR' ) ) { 279 define( 'BP_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); 280 } 281 282 if ( ! defined( 'BP_PLUGIN_URL' ) ) { 283 define( 'BP_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); 284 } 285 286 // Legacy forum constant - supported for compatibility with bbPress 2. 287 if ( ! defined( 'BP_FORUMS_PARENT_FORUM_ID' ) ) { 288 define( 'BP_FORUMS_PARENT_FORUM_ID', 1 ); 289 } 290 291 // Legacy forum constant - supported for compatibility with bbPress 2. 292 if ( ! defined( 'BP_FORUMS_SLUG' ) ) { 293 define( 'BP_FORUMS_SLUG', 'forums' ); 294 } 295 296 // Only applicable to those running trunk. 297 if ( ! defined( 'BP_SOURCE_SUBDIRECTORY' ) ) { 298 define( 'BP_SOURCE_SUBDIRECTORY', '' ); 299 } 300 301 // Define on which blog ID BuddyPress should run. 302 if ( ! defined( 'BP_ROOT_BLOG' ) ) { 303 304 // Default to use current blog ID. 305 // Fulfills non-network installs and BP_ENABLE_MULTIBLOG installs. 306 $root_blog_id = get_current_blog_id(); 307 308 // Multisite check. 309 if ( is_multisite() ) { 310 311 // Multiblog isn't enabled. 312 if ( ! defined( 'BP_ENABLE_MULTIBLOG' ) || ( defined( 'BP_ENABLE_MULTIBLOG' ) && (int) constant( 'BP_ENABLE_MULTIBLOG' ) === 0 ) ) { 313 // Check to see if BP is network-activated 314 // We're not using is_plugin_active_for_network() b/c you need to include the 315 // /wp-admin/includes/plugin.php file in order to use that function. 316 317 // Get network-activated plugins. 318 $plugins = get_site_option( 'active_sitewide_plugins' ); 319 320 // Basename. 321 $basename = basename( constant( 'BP_PLUGIN_DIR' ) ) . '/bp-loader.php'; 322 323 // Plugin is network-activated; use main site ID instead. 324 if ( isset( $plugins[ $basename ] ) ) { 325 $current_site = get_current_site(); 326 $root_blog_id = $current_site->blog_id; 327 } 328 } 329 } 330 331 define( 'BP_ROOT_BLOG', $root_blog_id ); 332 } 333 334 // The search slug has to be defined nice and early because of the way 335 // search requests are loaded. 336 // 337 // @todo Make this better. 338 if ( ! defined( 'BP_SEARCH_SLUG' ) ) { 339 define( 'BP_SEARCH_SLUG', 'search' ); 340 } 341 } 342 343 /** 344 * Component global variables. 345 * 346 * @since 1.6.0 347 */ 348 private function setup_globals() { 349 350 /** Versions */ 351 352 $this->version = '11.0.0-alpha'; 353 $this->db_version = 13271; 354 355 /** Loading */ 356 357 /** 358 * Should deprecated code be loaded? 359 * 360 * @since 2.0.0 Defaults to false always 361 * @since 2.8.0 Defaults to true on upgrades, false for new installs. 362 */ 363 $this->load_deprecated = false; 364 365 /** Toolbar */ 366 367 /** 368 * @var string The primary toolbar ID. 369 */ 370 $this->my_account_menu_id = ''; 371 372 /** URIs */ 373 374 /** 375 * @var int The current offset of the URI. 376 * @see bp_core_set_uri_globals() 377 */ 378 $this->unfiltered_uri_offset = 0; 379 380 /** 381 * @var bool Are status headers already sent? 382 */ 383 $this->no_status_set = false; 384 385 /** Components */ 386 387 /** 388 * @var string Name of the current BuddyPress component (primary). 389 */ 390 $this->current_component = ''; 391 392 /** 393 * @var string Name of the current BuddyPress item (secondary). 394 */ 395 $this->current_item = ''; 396 397 /** 398 * @var string Name of the current BuddyPress action (tertiary). 399 */ 400 $this->current_action = ''; 401 402 /** 403 * @var bool Displaying custom 2nd level navigation menu (I.E a group). 404 */ 405 $this->is_single_item = false; 406 407 /** Root */ 408 409 /** 410 * Filters the BuddyPress Root blog ID. 411 * 412 * @since 1.5.0 413 * 414 * @const constant BP_ROOT_BLOG BuddyPress Root blog ID. 415 */ 416 $this->root_blog_id = (int) apply_filters( 'bp_get_root_blog_id', BP_ROOT_BLOG ); 417 418 /** Paths */ 419 420 // BuddyPress root directory. 421 $this->file = constant( 'BP_PLUGIN_DIR' ) . 'bp-loader.php'; 422 $this->basename = basename( constant( 'BP_PLUGIN_DIR' ) ) . '/bp-loader.php'; 423 $this->plugin_dir = trailingslashit( constant( 'BP_PLUGIN_DIR' ) . constant( 'BP_SOURCE_SUBDIRECTORY' ) ); 424 $this->plugin_url = trailingslashit( constant( 'BP_PLUGIN_URL' ) . constant( 'BP_SOURCE_SUBDIRECTORY' ) ); 425 426 // Languages. 427 $this->lang_dir = $this->plugin_dir . 'bp-languages'; 428 429 // Templates (theme compatibility). 430 $this->themes_dir = $this->plugin_dir . 'bp-templates'; 431 $this->themes_url = $this->plugin_url . 'bp-templates'; 432 433 // Themes (for bp-default). 434 $this->old_themes_dir = $this->plugin_dir . 'bp-themes'; 435 $this->old_themes_url = $this->plugin_url . 'bp-themes'; 436 437 /** Theme Compat */ 438 439 $this->theme_compat = new stdClass(); // Base theme compatibility class. 440 $this->filters = new stdClass(); // Used when adding/removing filters. 441 442 /** Users */ 443 444 $this->current_user = new stdClass(); 445 $this->displayed_user = new stdClass(); 446 447 /** Post types and taxonomies */ 448 449 /** 450 * Filters the post type slug for the email component. 451 * 452 * @since 2.5.0 453 * 454 * @param string $value Email post type slug. 455 */ 456 $this->email_post_type = apply_filters( 'bp_email_post_type', 'bp-email' ); 457 458 /** 459 * Filters the taxonomy slug for the email type component. 460 * 461 * @since 2.5.0 462 * 463 * @param string $value Email type taxonomy slug. 464 */ 465 $this->email_taxonomy_type = apply_filters( 'bp_email_tax_type', 'bp-email-type' ); 466 } 467 468 /** 469 * Legacy BuddyPress constants. 470 * 471 * Try to avoid using these. Their values have been moved into variables 472 * in the instance, and have matching functions to get/set their values. 473 * 474 * @since 1.7.0 475 */ 476 private function legacy_constants() { 477 478 // Define the BuddyPress version. 479 if ( ! defined( 'BP_VERSION' ) ) { 480 define( 'BP_VERSION', $this->version ); 481 } 482 483 // Define the database version. 484 if ( ! defined( 'BP_DB_VERSION' ) ) { 485 define( 'BP_DB_VERSION', $this->db_version ); 486 } 487 488 // Define if deprecated functions should be ignored. 489 if ( ! defined( 'BP_IGNORE_DEPRECATED' ) ) { 490 define( 'BP_IGNORE_DEPRECATED', true ); 491 } 492 } 493 494 /** 495 * Include required files. 496 * 497 * @since 1.6.0 498 */ 499 private function includes() { 500 spl_autoload_register( array( $this, 'autoload' ) ); 501 502 // Load the WP abstraction file so BuddyPress can run on all WordPress setups. 503 require $this->plugin_dir . 'bp-core/bp-core-wpabstraction.php'; 504 505 // Setup the versions (after we include multisite abstraction above). 506 $this->versions(); 507 508 /** Update/Install */ 509 510 // Theme compatibility. 511 require $this->plugin_dir . 'bp-core/bp-core-template-loader.php'; 512 require $this->plugin_dir . 'bp-core/bp-core-theme-compatibility.php'; 513 514 // Require all of the BuddyPress core libraries. 515 require $this->plugin_dir . 'bp-core/bp-core-dependency.php'; 516 require $this->plugin_dir . 'bp-core/bp-core-actions.php'; 517 require $this->plugin_dir . 'bp-core/bp-core-caps.php'; 518 require $this->plugin_dir . 'bp-core/bp-core-cache.php'; 519 require $this->plugin_dir . 'bp-core/bp-core-cssjs.php'; 520 require $this->plugin_dir . 'bp-core/bp-core-update.php'; 521 require $this->plugin_dir . 'bp-core/bp-core-options.php'; 522 require $this->plugin_dir . 'bp-core/bp-core-taxonomy.php'; 523 require $this->plugin_dir . 'bp-core/bp-core-filters.php'; 524 require $this->plugin_dir . 'bp-core/bp-core-attachments.php'; 525 require $this->plugin_dir . 'bp-core/bp-core-avatars.php'; 526 require $this->plugin_dir . 'bp-core/bp-core-widgets.php'; 527 require $this->plugin_dir . 'bp-core/bp-core-template.php'; 528 require $this->plugin_dir . 'bp-core/bp-core-adminbar.php'; 529 require $this->plugin_dir . 'bp-core/bp-core-buddybar.php'; 530 require $this->plugin_dir . 'bp-core/bp-core-catchuri.php'; 531 require $this->plugin_dir . 'bp-core/bp-core-functions.php'; 532 require $this->plugin_dir . 'bp-core/bp-core-moderation.php'; 533 require $this->plugin_dir . 'bp-core/bp-core-loader.php'; 534 require $this->plugin_dir . 'bp-core/bp-core-customizer-email.php'; 535 require $this->plugin_dir . 'bp-core/bp-core-rest-api.php'; 536 require $this->plugin_dir . 'bp-core/bp-core-blocks.php'; 537 538 // Maybe load deprecated functionality (this double negative is proof positive!). 539 if ( ! bp_get_option( '_bp_ignore_deprecated_code', ! $this->load_deprecated ) ) { 540 require $this->plugin_dir . 'bp-core/deprecated/1.2.php'; 541 require $this->plugin_dir . 'bp-core/deprecated/1.5.php'; 542 require $this->plugin_dir . 'bp-core/deprecated/1.6.php'; 543 require $this->plugin_dir . 'bp-core/deprecated/1.7.php'; 544 require $this->plugin_dir . 'bp-core/deprecated/1.9.php'; 545 require $this->plugin_dir . 'bp-core/deprecated/2.0.php'; 546 require $this->plugin_dir . 'bp-core/deprecated/2.1.php'; 547 require $this->plugin_dir . 'bp-core/deprecated/2.2.php'; 548 require $this->plugin_dir . 'bp-core/deprecated/2.3.php'; 549 require $this->plugin_dir . 'bp-core/deprecated/2.4.php'; 550 require $this->plugin_dir . 'bp-core/deprecated/2.5.php'; 551 require $this->plugin_dir . 'bp-core/deprecated/2.6.php'; 552 require $this->plugin_dir . 'bp-core/deprecated/2.7.php'; 553 require $this->plugin_dir . 'bp-core/deprecated/2.8.php'; 554 require $this->plugin_dir . 'bp-core/deprecated/2.9.php'; 555 require $this->plugin_dir . 'bp-core/deprecated/3.0.php'; 556 require $this->plugin_dir . 'bp-core/deprecated/4.0.php'; 557 require $this->plugin_dir . 'bp-core/deprecated/6.0.php'; 558 require $this->plugin_dir . 'bp-core/deprecated/7.0.php'; 559 require $this->plugin_dir . 'bp-core/deprecated/8.0.php'; 560 require $this->plugin_dir . 'bp-core/deprecated/9.0.php'; 561 require $this->plugin_dir . 'bp-core/deprecated/10.0.php'; 562 } 563 564 // Load wp-cli module if PHP 5.6+. 565 if ( 566 defined( 'WP_CLI' ) 567 && ! class_exists( 'Buddypress\CLI\Command\BuddypressCommand' ) 568 && file_exists( $this->plugin_dir . 'cli/wp-cli-bp.php' ) 569 && version_compare( phpversion(), '5.6.0', '>=' ) ) { 570 require $this->plugin_dir . 'cli/wp-cli-bp.php'; 571 } 572 } 573 574 /** 575 * Autoload classes. 576 * 577 * @since 2.5.0 578 * 579 * @param string $class Classes to be autoloaded. 580 * @return string Path of a class. 581 */ 582 public function autoload( $class ) { 583 $class_parts = explode( '_', strtolower( $class ) ); 584 585 if ( 'bp' !== $class_parts[0] ) { 586 return; 587 } 588 589 $components = array( 590 'activity', 591 'blogs', 592 'core', 593 'friends', 594 'groups', 595 'members', 596 'messages', 597 'notifications', 598 'settings', 599 'xprofile', 600 ); 601 602 // These classes don't have a name that matches their component. 603 $irregular_map = array( 604 'BP_Akismet' => 'activity', 605 'BP_REST_Activity_Endpoint' => 'activity', 606 607 'BP_REST_Blogs_Endpoint' => 'blogs', 608 'BP_REST_Attachments_Blog_Avatar_Endpoint' => 'blogs', 609 610 'BP_Admin' => 'core', 611 'BP_Attachment_Avatar' => 'core', 612 'BP_Attachment_Cover_Image' => 'core', 613 'BP_Attachment' => 'core', 614 'BP_Button' => 'core', 615 'BP_Block' => 'core', 616 'BP_Component' => 'core', 617 'BP_Customizer_Control_Range' => 'core', 618 'BP_Date_Query' => 'core', 619 'BP_Email_Delivery' => 'core', 620 'BP_Email_Address' => 'core', 621 'BP_Email_Recipient' => 'core', 622 'BP_Email_Sender' => 'core', 623 'BP_Email_Participant' => 'core', 624 'BP_Email' => 'core', 625 'BP_Embed' => 'core', 626 'BP_Media_Extractor' => 'core', 627 'BP_Members_Suggestions' => 'core', 628 'BP_PHPMailer' => 'core', 629 'BP_Recursive_Query' => 'core', 630 'BP_Suggestions' => 'core', 631 'BP_Theme_Compat' => 'core', 632 'BP_User_Query' => 'core', 633 'BP_Walker_Category_Checklist' => 'core', 634 /** 635 * BP_Walker_Nav_Menu_Checklist class. 636 * 637 * As this class corresponding file is deprecated, it will trigger a deprecation notice if instantiated. 638 * In a subsequent release, we'll remove it from our Classes Autoloader. 639 * 640 * @todo Remove the BP_Walker_Nav_Menu_Checklist from our Classes Autoloader. 641 */ 642 'BP_Walker_Nav_Menu_Checklist' => 'core', 643 'BP_Walker_Nav_Menu' => 'core', 644 'BP_Invitation_Manager' => 'core', 645 'BP_Invitation' => 'core', 646 'BP_REST_Components_Endpoint' => 'core', 647 'BP_REST_Attachments' => 'core', 648 'BP_Admin_Types' => 'core', 649 'BP_Optout' => 'core', 650 'BP_Optouts_List_Table' => 'core', 651 652 'BP_Core_Friends_Widget' => 'friends', 653 'BP_REST_Friends_Endpoint' => 'friends', 654 655 'BP_Group_Extension' => 'groups', 656 'BP_Group_Member_Query' => 'groups', 657 'BP_REST_Groups_Endpoint' => 'groups', 658 'BP_REST_Group_Membership_Endpoint' => 'groups', 659 'BP_REST_Group_Invites_Endpoint' => 'groups', 660 'BP_REST_Group_Membership_Request_Endpoint' => 'groups', 661 'BP_REST_Attachments_Group_Avatar_Endpoint' => 'groups', 662 'BP_REST_Attachments_Group_Cover_Endpoint' => 'groups', 663 664 'BP_Core_Members_Template' => 'members', 665 'BP_Core_Members_Widget' => 'members', 666 'BP_Core_Recently_Active_Widget' => 'members', 667 'BP_Core_Whos_Online_Widget' => 'members', 668 'BP_Registration_Theme_Compat' => 'members', 669 'BP_Signup' => 'members', 670 'BP_REST_Members_Endpoint' => 'members', 671 'BP_REST_Attachments_Member_Avatar_Endpoint' => 'members', 672 'BP_REST_Attachments_Member_Cover_Endpoint' => 'members', 673 'BP_REST_Signup_Endpoint' => 'members', 674 'BP_Members_Invitation_Manager' => 'members', 675 'BP_Members_Invitations_Template' => 'members', 676 677 'BP_REST_Messages_Endpoint' => 'messages', 678 679 'BP_REST_Notifications_Endpoint' => 'notifications', 680 681 'BP_REST_XProfile_Fields_Endpoint' => 'xprofile', 682 'BP_REST_XProfile_Field_Groups_Endpoint' => 'xprofile', 683 'BP_REST_XProfile_Data_Endpoint' => 'xprofile', 684 ); 685 686 $component = null; 687 688 // First check to see if the class is one without a properly namespaced name. 689 if ( isset( $irregular_map[ $class ] ) ) { 690 $component = $irregular_map[ $class ]; 691 692 // Next chunk is usually the component name. 693 } elseif ( in_array( $class_parts[1], $components, true ) ) { 694 $component = $class_parts[1]; 695 } 696 697 if ( ! $component ) { 698 return; 699 } 700 701 // Sanitize class name. 702 $class = strtolower( str_replace( '_', '-', $class ) ); 703 704 if ( 'bp-rest-attachments' === $class ) { 705 $path = dirname( __FILE__ ) . "/bp-{$component}/classes/trait-attachments.php"; 706 } else { 707 $path = dirname( __FILE__ ) . "/bp-{$component}/classes/class-{$class}.php"; 708 } 709 710 // Sanity check. 711 if ( ! file_exists( $path ) ) { 712 return; 713 } 714 715 /* 716 * Sanity check 2 - Check if component is active before loading class. 717 * Skip if PHPUnit is running, or BuddyPress is installing for the first time. 718 */ 719 if ( 720 ! in_array( $component, array( 'core', 'members' ), true ) && 721 ! bp_is_active( $component ) && 722 ! function_exists( 'tests_add_filter' ) 723 ) { 724 return; 725 } 726 727 require $path; 728 } 729 730 /** 731 * Set up the default hooks and actions. 732 * 733 * @since 1.6.0 734 */ 735 private function setup_actions() { 736 737 // Add actions to plugin activation and deactivation hooks. 738 add_action( 'activate_' . $this->basename, 'bp_activation' ); 739 add_action( 'deactivate_' . $this->basename, 'bp_deactivation' ); 740 741 // If BuddyPress is being deactivated, do not add any actions. 742 if ( bp_is_deactivation( $this->basename ) ) { 743 return; 744 } 745 746 // Array of BuddyPress core actions. 747 $actions = array( 748 'setup_theme', // Setup the default theme compat. 749 'setup_current_user', // Setup currently logged in user. 750 'register_post_types', // Register post types. 751 'register_post_statuses', // Register post statuses. 752 'register_taxonomies', // Register taxonomies. 753 'register_views', // Register the views. 754 'register_theme_directory', // Register the theme directory. 755 'register_theme_packages', // Register bundled theme packages (bp-themes). 756 'load_textdomain', // Load textdomain. 757 'add_rewrite_tags', // Add rewrite tags. 758 'generate_rewrite_rules', // Generate rewrite rules. 759 ); 760 761 // Add the actions. 762 foreach ( $actions as $class_action ) { 763 if ( method_exists( $this, $class_action ) ) { 764 add_action( 'bp_' . $class_action, array( $this, $class_action ), 5 ); 765 } 766 } 767 768 /** 769 * Fires after the setup of all BuddyPress actions. 770 * 771 * Includes bbp-core-hooks.php. 772 * 773 * @since 1.7.0 774 * 775 * @param BuddyPress $this. Current BuddyPress instance. Passed by reference. 776 */ 777 do_action_ref_array( 'bp_after_setup_actions', array( &$this ) ); 778 } 779 780 /** 781 * Private method to align the active and database versions. 782 * 783 * @since 1.7.0 784 */ 785 private function versions() { 786 787 // Get the possible DB versions (boy is this gross). 788 $versions = array(); 789 $versions['1.6-single'] = get_blog_option( $this->root_blog_id, '_bp_db_version' ); 790 791 // 1.6-single exists, so trust it. 792 if ( ! empty( $versions['1.6-single'] ) ) { 793 $this->db_version_raw = (int) $versions['1.6-single']; 794 795 // If no 1.6-single exists, use the max of the others. 796 } else { 797 $versions['1.2'] = get_site_option( 'bp-core-db-version' ); 798 $versions['1.5-multi'] = get_site_option( 'bp-db-version' ); 799 $versions['1.6-multi'] = get_site_option( '_bp_db_version' ); 800 $versions['1.5-single'] = get_blog_option( $this->root_blog_id, 'bp-db-version' ); 801 802 // Remove empty array items. 803 $versions = array_filter( $versions ); 804 $this->db_version_raw = (int) ( ! empty( $versions ) ) ? (int) max( $versions ) : 0; 805 } 806 } 807 808 /** Public Methods ********************************************************/ 809 810 /** 811 * Set up BuddyPress's legacy theme directory. 812 * 813 * Starting with version 1.2, and ending with version 1.8, BuddyPress 814 * registered a custom theme directory - bp-themes - which contained 815 * the bp-default theme. Since BuddyPress 1.9, bp-themes is no longer 816 * registered (and bp-default no longer offered) on new installations. 817 * Sites using bp-default (or a child theme of bp-default) will 818 * continue to have bp-themes registered as before. 819 * 820 * @since 1.5.0 821 * 822 * @todo Move bp-default to wordpress.org/extend/themes and remove this. 823 */ 824 public function register_theme_directory() { 825 if ( ! bp_do_register_theme_directory() ) { 826 return; 827 } 828 829 register_theme_directory( $this->old_themes_dir ); 830 } 831 832 /** 833 * Register bundled theme packages. 834 * 835 * Note that since we currently have complete control over bp-themes and 836 * the bp-legacy folders, it's fine to hardcode these here. If at a 837 * later date we need to automate this, an API will need to be built. 838 * 839 * @since 1.7.0 840 */ 841 public function register_theme_packages() { 842 843 // Register the default theme compatibility package. 844 bp_register_theme_package( 845 array( 846 'id' => 'legacy', 847 'name' => __( 'BuddyPress Legacy', 'buddypress' ), 848 'version' => bp_get_version(), 849 'dir' => trailingslashit( $this->themes_dir . '/bp-legacy' ), 850 'url' => trailingslashit( $this->themes_url . '/bp-legacy' ), 851 ) 852 ); 853 854 bp_register_theme_package( 855 array( 856 'id' => 'nouveau', 857 'name' => __( 'BuddyPress Nouveau', 'buddypress' ), 858 'version' => bp_get_version(), 859 'dir' => trailingslashit( $this->themes_dir . '/bp-nouveau' ), 860 'url' => trailingslashit( $this->themes_url . '/bp-nouveau' ), 861 ) 862 ); 863 864 // Register the basic theme stack. This is really dope. 865 bp_register_template_stack( 'get_stylesheet_directory', 10 ); 866 bp_register_template_stack( 'get_template_directory', 12 ); 867 bp_register_template_stack( 'bp_get_theme_compat_dir', 14 ); 868 } 869 870 /** 871 * Set up the default BuddyPress theme compatibility location. 872 * 873 * @since 1.7.0 874 */ 875 public function setup_theme() { 876 877 // Bail if something already has this under control. 878 if ( ! empty( $this->theme_compat->theme ) ) { 879 return; 880 } 881 882 // Setup the theme package to use for compatibility. 883 bp_setup_theme_compat( bp_get_theme_package_id() ); 884 } 885 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Dec 6 01:00:58 2024 | Cross-referenced by PHPXref 0.7.1 |