Changeset 2863 for trunk/bp-core/bp-core-catchuri.php
- Timestamp:
- 03/22/2010 11:34:23 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/bp-core/bp-core-catchuri.php
r2695 r2863 28 28 function bp_core_set_uri_globals() { 29 29 global $current_component, $current_action, $action_variables; 30 global $displayed_user_id ;30 global $displayed_user_id, $bp_pages; 31 31 global $is_member_page; 32 global $bp_unfiltered_uri ;32 global $bp_unfiltered_uri, $bp_unfiltered_uri_offset; 33 33 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(); 34 38 35 39 if ( !defined( 'BP_ENABLE_MULTIBLOG' ) && bp_core_is_multisite() ) { … … 69 73 $action_index = $component_index + 1; 70 74 71 // If this is a WordPress page, return from the function.72 if ( is_page( $bp_uri[$component_index] ) )73 return false;74 75 75 /* Get site path items */ 76 76 $paths = explode( '/', bp_core_get_site_path() ); … … 94 94 $bp_unfiltered_uri = $bp_uri; 95 95 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 ); 136 159 137 160 /* 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; 139 172 140 173 /* 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] ); 142 179 143 180 /* Set the entire URI as the action variables, we will unset the current_component and action in a second */ 144 181 $action_variables = $bp_uri; 145 182 146 /* Unset the current_component and action from action_variables */147 unset($action_variables[$component_index]);148 unset($action_variables[$action_index]);149 150 183 /* Remove the username from action variables if this is not a VHOST install */ 151 184 if ( 'no' == VHOST && !$is_root_component ) 152 array_shift($ action_variables);185 array_shift($bp_uri); 153 186 154 187 /* Reset the keys by merging with an empty array */ 155 188 $action_variables = array_merge( array(), $action_variables ); 156 189 157 //var_dump($current_component, $current_action, $ action_variables); die;190 //var_dump($current_component, $current_action, $bp_uri); 158 191 } 159 192 add_action( 'plugins_loaded', 'bp_core_set_uri_globals', 3 ); 160 193 161 194 /** 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 168 203 * 169 204 * @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. 173 209 */ 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 210 function 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 */ 219 227 foreach ( (array)$templates as $template ) 220 228 $filtered_templates[] = $template . '.php'; 221 229 230 /* Filter the template locations so that plugins can alter where they are located */ 222 231 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 223 237 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. */ 231 241 die; 232 242 } 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 else247 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' );267 243 268 244 /**
Note: See TracChangeset
for help on using the changeset viewer.