Skip to:
Content

BuddyPress.org

Ticket #7277: 7277.diff

File 7277.diff, 48.8 KB (added by boonebgorges, 3 years ago)
  • src/bp-loader.php

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

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