Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
03/22/2010 11:34:23 AM (16 years ago)
Author:
apeatling
Message:

Added new install/upgrade wizard. Removed root components and replaced them with actual WordPress pages. Testing on WordPress vhost/novhost and root profile support still to do.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/bp-core/bp-core-catchuri.php

    r2695 r2863  
    2828function bp_core_set_uri_globals() {
    2929        global $current_component, $current_action, $action_variables;
    30         global $displayed_user_id;
     30        global $displayed_user_id, $bp_pages;
    3131        global $is_member_page;
    32         global $bp_unfiltered_uri;
     32        global $bp_unfiltered_uri, $bp_unfiltered_uri_offset;
    3333        global $bp, $current_blog;
     34
     35        /* Fetch all the WP page names for each component */
     36        if ( empty( $bp_pages ) )
     37                $bp_pages = bp_core_get_page_names();
    3438
    3539        if ( !defined( 'BP_ENABLE_MULTIBLOG' ) && bp_core_is_multisite() ) {
     
    6973        $action_index = $component_index + 1;
    7074
    71         // If this is a WordPress page, return from the function.
    72         if ( is_page( $bp_uri[$component_index] ) )
    73                 return false;
    74 
    7575        /* Get site path items */
    7676        $paths = explode( '/', bp_core_get_site_path() );
     
    9494        $bp_unfiltered_uri = $bp_uri;
    9595
    96         /* If we are under anything with a members slug, set the correct globals */
    97         if ( $bp_uri[0] == BP_MEMBERS_SLUG ) {
    98                 $is_member_page = true;
    99                 $is_root_component = true;
    100         }
    101 
    102         /* Catch a member page and set the current member ID */
    103         if ( !defined( 'BP_ENABLE_ROOT_PROFILES' ) ) {
    104                 if ( ( $bp_uri[0] == BP_MEMBERS_SLUG && !empty( $bp_uri[1] ) ) || in_array( 'wp-load.php', $bp_uri ) ) {
    105                         // We are within a member page, set up user id globals
    106                         $displayed_user_id = bp_core_get_displayed_userid( $bp_uri[1] );
    107 
    108                         unset($bp_uri[0]);
    109                         unset($bp_uri[1]);
    110 
    111                         /* Reset the keys by merging with an empty array */
    112                         $bp_uri = array_merge( array(), $bp_uri );
    113                 }
    114         } else {
    115                 if ( get_userdatabylogin( $bp_uri[0] ) || in_array( 'wp-load.php', $bp_uri ) ) {
    116                         $is_member_page = true;
    117                         $is_root_component = true;
    118 
    119                         // We are within a member page, set up user id globals
    120                         $displayed_user_id = bp_core_get_displayed_userid( $bp_uri[0] );
    121 
    122                         unset($bp_uri[0]);
    123 
    124                         /* Reset the keys by merging with an empty array */
    125                         $bp_uri = array_merge( array(), $bp_uri );
    126                 }
    127         }
    128 
    129         if ( !isset($is_root_component) )
    130                 $is_root_component = in_array( $bp_uri[0], $bp->root_components );
    131 
    132         if ( 'no' == VHOST && !$is_root_component ) {
    133                 $component_index++;
    134                 $action_index++;
    135         }
     96        /* Find a match within registered BuddyPress controlled WP pages (check members first) */
     97        foreach ( (array)$bp_pages as $page_key => $bp_page ) {
     98                if ( in_array( $bp_page->name, (array)$bp_uri ) ) {
     99                        /* Match found, now match the slug to make sure. */
     100                        $uri_chunks = explode( '/', $bp_page->slug );
     101
     102                        foreach ( (array)$uri_chunks as $key => $uri_chunk ) {
     103                                if ( $bp_uri[$key] == $uri_chunk ) {
     104                                        $matches[] = 1;
     105                                } else {
     106                                        $matches[] = 0;
     107                                }
     108                        }
     109
     110                        if ( !in_array( 0, (array) $matches ) ) {
     111                                $match = $bp_page;
     112                                $match->key = $page_key;
     113                                break;
     114                        };
     115
     116                        unset( $matches );
     117                }
     118
     119                unset( $uri_chunks );
     120        }
     121
     122        /* This is not a BuddyPress page, so just return. */
     123        if ( in_array( 0, (array) $matches ) )
     124                return false;
     125
     126        /* Find the offset */
     127        $uri_offset = 0;
     128        $slug = explode( '/', $match->slug );
     129
     130        if ( !empty( $slug ) && 1 != count( $slug ) ) {
     131                array_pop( $slug );
     132                $uri_offset = count( $slug );
     133        }
     134
     135        /* Global the unfiltered offset to use in bp_core_load_template() */
     136        $bp_unfiltered_uri_offset = $uri_offset;
     137
     138        /* This is a members page so lets check if we have a displayed member */
     139        if ( 'members' == $match->key ) {
     140                if ( !empty( $bp_uri[$uri_offset + 1] ) ) {
     141                        if ( defined( 'BP_ENABLE_USERNAME_COMPATIBILITY_MODE' ) )
     142                                $displayed_user_id = (int) bp_core_get_userid( $bp_uri[$uri_offset + 1] );
     143                        else
     144                                $displayed_user_id = (int) bp_core_get_userid_from_nicename( $bp_uri[$uri_offset + 1] );
     145
     146                        $uri_offset = $uri_offset + 2;
     147
     148                        /* Remove everything from the URI up to the offset and take it from there. */
     149                        for ( $i = 0; $i < $uri_offset; $i++ ) {
     150                                unset( $bp_uri[$i] );
     151                        }
     152
     153                        $current_component = $bp_uri[$uri_offset];
     154                }
     155        }
     156
     157        /* Reset the keys by merging with an empty array */
     158        $bp_uri = array_merge( array(), $bp_uri );
    136159
    137160        /* Set the current component */
    138         $current_component = $bp_uri[$component_index];
     161        if ( empty( $current_component ) ) {
     162                for ( $i = 0; $i <= $uri_offset; $i++ ) {
     163                        if ( !empty( $bp_uri[$i] ) ) {
     164                                $current_component .= $bp_uri[$i];
     165
     166                                if ( $i != $uri_offset )
     167                                        $current_component .= '/';
     168                        }
     169                }
     170        } else
     171                $i = 1;
    139172
    140173        /* Set the current action */
    141         $current_action = $bp_uri[$action_index];
     174        $current_action = $bp_uri[$i];
     175
     176        /* Unset the current_component and action from action_variables */
     177        for ( $j = 0; $j <= $i; $j++ )
     178                unset( $bp_uri[$j] );
    142179
    143180        /* Set the entire URI as the action variables, we will unset the current_component and action in a second */
    144181        $action_variables = $bp_uri;
    145182
    146         /* Unset the current_component and action from action_variables */
    147         unset($action_variables[$component_index]);
    148         unset($action_variables[$action_index]);
    149 
    150183        /* Remove the username from action variables if this is not a VHOST install */
    151184        if ( 'no' == VHOST && !$is_root_component )
    152                 array_shift($action_variables);
     185                array_shift($bp_uri);
    153186
    154187        /* Reset the keys by merging with an empty array */
    155188        $action_variables = array_merge( array(), $action_variables );
    156189
    157         //var_dump($current_component, $current_action, $action_variables); die;
     190        //var_dump($current_component, $current_action, $bp_uri);
    158191}
    159192add_action( 'plugins_loaded', 'bp_core_set_uri_globals', 3 );
    160193
    161194/**
    162  * bp_catch_uri()
    163  *
    164  * Takes either a single page name or array of page names and
    165  * loads the first template file that can be found.
    166  *
    167  * Please don't call this function directly anymore, use: bp_core_load_template()
     195 * bp_core_load_template()
     196 *
     197 * Load a specific template file with fallback support.
     198 *
     199 * Example:
     200 *   bp_core_load_template( 'members/index' );
     201 * Loads:
     202 *   wp-content/themes/[activated_theme]/members/index.php
    168203 *
    169204 * @package BuddyPress Core
    170  * @global $bp_path BuddyPress global containing the template file names to use.
    171  * @param $pages Template file names to use.
    172  * @uses add_action() Hooks a function on to a specific action
     205 * @param $username str Username to check.
     206 * @global $wpdb WordPress DB access object.
     207 * @return false on no match
     208 * @return int the user ID of the matched user.
    173209 */
    174 function bp_catch_uri( $pages, $skip_blog_check = false ) {
    175         global $bp_path, $bp_skip_blog_check;
    176 
    177         $bp_skip_blog_check = $skip_blog_check;
    178 
    179         $bp_path = $pages;
    180 
    181         if ( !bp_is_blog_page() ) {
    182                 remove_action( 'template_redirect', 'redirect_canonical' );
    183         }
    184         add_action( 'template_redirect', 'bp_core_do_catch_uri', 2 );
    185 }
    186 
    187 /**
    188  * bp_core_do_catch_uri()
    189  *
    190  * Loads the first template file found based on the $bp_path global.
    191  *
    192  * @package BuddyPress Core
    193  * @global $bp_path BuddyPress global containing the template file names to use.
    194  */
    195 function bp_core_do_catch_uri() {
    196         global $bp_path, $bp, $wpdb;
    197         global $current_blog, $bp_skip_blog_check;
    198         global $bp_no_status_set;
    199         global $wp_query;
    200 
    201         /* Can be a single template or an array of templates */
    202         $templates = $bp_path;
    203 
    204         /* Don't hijack any URLs on blog pages */
    205         if ( bp_is_blog_page() ) {
    206                 if ( !$bp_skip_blog_check )
    207                         return false;
    208         } else {
    209                 $wp_query->is_home = false;
    210         }
    211 
    212         /* Make sure this is not reported as a 404 */
    213         if ( !$bp_no_status_set ) {
    214                 status_header( 200 );
    215                 $wp_query->is_404 = false;
    216                 $wp_query->is_page = true;
    217         }
    218 
     210function bp_core_load_template( $templates ) {
     211        global $bp, $wpdb, $wp_query, $bp_unfiltered_uri, $bp_unfiltered_uri_offset;
     212
     213        /* Determine if the root object WP page exists for this request (is there an API function for this?)*/
     214        if ( !$page_exists = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_name = %s", $bp_unfiltered_uri[$bp_unfiltered_uri_offset] ) ) )
     215                return false;
     216
     217        /* Set the root object as the current wp_query-ied item */
     218        foreach ( $bp->pages as $page ) {
     219                if ( $page->name == $bp_unfiltered_uri[$bp_unfiltered_uri_offset] )
     220                        $object_id = $page->id;
     221        }
     222
     223        $wp_query->queried_object = &get_post( $object_id );
     224        $wp_query->queried_object_id = $object_id;
     225
     226        /* Fetch each template and add the php suffix */
    219227        foreach ( (array)$templates as $template )
    220228                $filtered_templates[] = $template . '.php';
    221229
     230        /* Filter the template locations so that plugins can alter where they are located */
    222231        if ( $located_template = apply_filters( 'bp_located_template', locate_template( (array) $filtered_templates, false ), $filtered_templates ) ) {
     232                /* Template was located, lets set this as a valid page and not a 404. */
     233                status_header( 200 );
     234                $wp_query->is_page = true;
     235                $wp_query->is_404 = false;
     236
    223237                load_template( apply_filters( 'bp_load_template', $located_template ) );
    224         } else {
    225                 if ( $located_template = locate_template( array( '404.php' ) ) ) {
    226                         status_header( 404 );
    227                         load_template( $located_template );
    228                 } else
    229                         bp_core_redirect( $bp->root_domain );
    230         }
     238        }
     239
     240        /* Kill any other output after this. */
    231241        die;
    232242}
    233 
    234 function bp_core_catch_no_access() {
    235         global $bp, $bp_path, $bp_unfiltered_uri, $bp_no_status_set;
    236 
    237         // If bp_core_redirect() and $bp_no_status_set is true,
    238         // we are redirecting to an accessable page, so skip this check.
    239         if ( $bp_no_status_set )
    240                 return false;
    241 
    242         /* If this user has been marked as a spammer and the logged in user is not a site admin, redirect. */
    243         if ( isset( $bp->displayed_user->id ) && bp_core_is_user_spammer( $bp->displayed_user->id ) ) {
    244                 if ( !is_site_admin() )
    245                         bp_core_redirect( $bp->root_domain );
    246                 else
    247                         bp_core_add_message( __( 'This user has been marked as a spammer. Only site admins can view this profile.', 'buddypress' ), 'error' );
    248         }
    249 
    250         // If this user does not exist, redirect to the root domain.
    251         if ( !$bp->displayed_user->id && $bp_unfiltered_uri[0] == BP_MEMBERS_SLUG && isset($bp_unfiltered_uri[1]) )
    252                 bp_core_redirect( $bp->root_domain );
    253 
    254         // If the template file doesn't exist, redirect to the root domain.
    255         if ( !bp_is_blog_page() && !file_exists( apply_filters( 'bp_located_template', locate_template( array( $bp_path . '.php' ), false ), array( $bp_path . '.php' ) ) ) )
    256                 bp_core_redirect( $bp->root_domain );
    257 
    258         if ( !$bp_path && !bp_is_blog_page() ) {
    259                 if ( is_user_logged_in() ) {
    260                         wp_redirect( $bp->root_domain );
    261                 } else {
    262                         wp_redirect( site_url( 'wp-login.php?redirect_to=' . site_url() . $_SERVER['REQUEST_URI'] ) );
    263                 }
    264         }
    265 }
    266 add_action( 'wp', 'bp_core_catch_no_access' );
    267243
    268244/**
Note: See TracChangeset for help on using the changeset viewer.