/**
  * Validates the URL to determine if the activity item is valid.
  *
  * @since 2.6.0
  *
  * @param  string   $url The URL to check.
  * @return int|bool Activity ID on success; boolean false on failure.
  */
 protected function validate_url_to_item_id($url)
 {
     if (bp_core_enable_root_profiles()) {
         $domain = bp_get_root_domain();
     } else {
         $domain = bp_get_members_directory_permalink();
     }
     // Check the URL to see if this is a single activity URL.
     if (0 !== strpos($url, $domain)) {
         return false;
     }
     // Check for activity slug.
     if (false === strpos($url, '/' . bp_get_activity_slug() . '/')) {
         return false;
     }
     // Do more checks.
     $url = trim(untrailingslashit($url));
     // Grab the activity ID.
     $activity_id = (int) substr($url, strrpos($url, '/') + 1);
     if (!empty($activity_id)) {
         // Check if activity item still exists.
         $activity = new BP_Activity_Activity($activity_id);
         // Okay, we're good to go!
         if (!empty($activity->component) && 0 === (int) $activity->is_spam) {
             return $activity_id;
         }
     }
     return false;
 }
示例#2
0
/**
 * Make sure the username is not the blog slug in case of root profile & subdirectory blog
 *
 * If BP_ENABLE_ROOT_PROFILES is defined & multisite config is set to subdirectories,
 * then there is a chance site.url/username == site.url/blogslug. If so, user's profile
 * is not reachable, instead the blog is displayed. This filter makes sure the signup username
 * is not the same than the blog slug for this particular config.
 *
 * @since  BuddyPress (2.1.0)
 * @param  array $illegal_names
 * @return array $illegal_names
 */
function bp_members_signup_with_subdirectory_blog($illegal_names = array())
{
    if (!bp_core_enable_root_profiles()) {
        return $illegal_names;
    }
    if (is_network_admin() && isset($_POST['blog'])) {
        $blog = $_POST['blog'];
        $domain = '';
        if (preg_match('|^([a-zA-Z0-9-])$|', $blog['domain'])) {
            $domain = strtolower($blog['domain']);
        }
        if (username_exists($domain)) {
            $illegal_names[] = $domain;
        }
    } else {
        $illegal_names[] = buddypress()->signup->username;
    }
    return $illegal_names;
}
/**
 * Return the domain for the passed user: e.g. http://example.com/members/andy/.
 *
 * @since 1.0.0
 *
 * @param int         $user_id       The ID of the user.
 * @param string|bool $user_nicename Optional. user_nicename of the user.
 * @param string|bool $user_login    Optional. user_login of the user.
 * @return string
 */
function bp_core_get_user_domain($user_id = 0, $user_nicename = false, $user_login = false)
{
    if (empty($user_id)) {
        return;
    }
    $username = bp_core_get_username($user_id, $user_nicename, $user_login);
    if (bp_is_username_compatibility_mode()) {
        $username = rawurlencode($username);
    }
    $after_domain = bp_core_enable_root_profiles() ? $username : bp_get_members_root_slug() . '/' . $username;
    $domain = trailingslashit(bp_get_root_domain() . '/' . $after_domain);
    // Don't use this filter.  Subject to removal in a future release.
    // Use the 'bp_core_get_user_domain' filter instead.
    $domain = apply_filters('bp_core_get_user_domain_pre_cache', $domain, $user_id, $user_nicename, $user_login);
    /**
     * Filters the domain for the passed user.
     *
     * @since 1.0.1
     *
     * @param string $domain        Domain for the passed user.
     * @param int    $user_id       ID of the passed user.
     * @param string $user_nicename User nicename of the passed user.
     * @param string $user_login    User login of the passed user.
     */
    return apply_filters('bp_core_get_user_domain', $domain, $user_id, $user_nicename, $user_login);
}
/**
 * Analyze the URI and break it down into BuddyPress-usable chunks.
 *
 * BuddyPress can use complete custom friendly URIs without the user having to
 * add new rewrite rules. Custom components are able to use their own custom
 * URI structures with very little work.
 *
 * The URIs are broken down as follows:
 *   - http:// example.com / members / andy / [current_component] / [current_action] / [action_variables] / [action_variables] / ...
 *   - OUTSIDE ROOT: http:// example.com / sites / buddypress / members / andy / [current_component] / [current_action] / [action_variables] / [action_variables] / ...
 *
 *	Example:
 *    - http://example.com/members/andy/profile/edit/group/5/
 *    - $bp->current_component: string 'xprofile'
 *    - $bp->current_action: string 'edit'
 *    - $bp->action_variables: array ['group', 5]
 *
 * @since 1.0.0
 */
function bp_core_set_uri_globals()
{
    global $current_blog, $wp_rewrite;
    // Don't catch URIs on non-root blogs unless multiblog mode is on.
    if (!bp_is_root_blog() && !bp_is_multiblog_mode()) {
        return false;
    }
    $bp = buddypress();
    // Define local variables.
    $root_profile = $match = false;
    $key_slugs = $matches = $uri_chunks = array();
    // Fetch all the WP page names for each component.
    if (empty($bp->pages)) {
        $bp->pages = bp_core_get_directory_pages();
    }
    // Ajax or not?
    if (defined('DOING_AJAX') && DOING_AJAX || strpos($_SERVER['REQUEST_URI'], 'wp-load.php')) {
        $path = bp_get_referer_path();
    } else {
        $path = esc_url($_SERVER['REQUEST_URI']);
    }
    /**
     * Filters the BuddyPress global URI path.
     *
     * @since 1.0.0
     *
     * @param string $path Path to set.
     */
    $path = apply_filters('bp_uri', $path);
    // Take GET variables off the URL to avoid problems.
    $path = strtok($path, '?');
    // Fetch current URI and explode each part separated by '/' into an array.
    $bp_uri = explode('/', $path);
    // Loop and remove empties.
    foreach ((array) $bp_uri as $key => $uri_chunk) {
        if (empty($bp_uri[$key])) {
            unset($bp_uri[$key]);
        }
    }
    // If running off blog other than root, any subdirectory names must be
    // removed from $bp_uri. This includes two cases:
    //
    // 1. when WP is installed in a subdirectory,
    // 2. when BP is running on secondary blog of a subdirectory
    // multisite installation. Phew!
    if (is_multisite() && !is_subdomain_install() && (bp_is_multiblog_mode() || 1 != bp_get_root_blog_id())) {
        // Blow chunks.
        $chunks = explode('/', $current_blog->path);
        // If chunks exist...
        if (!empty($chunks)) {
            // ...loop through them...
            foreach ($chunks as $key => $chunk) {
                $bkey = array_search($chunk, $bp_uri);
                // ...and unset offending keys
                if (false !== $bkey) {
                    unset($bp_uri[$bkey]);
                }
                $bp_uri = array_values($bp_uri);
            }
        }
    }
    // Get site path items.
    $paths = explode('/', bp_core_get_site_path());
    // Take empties off the end of path.
    if (empty($paths[count($paths) - 1])) {
        array_pop($paths);
    }
    // Take empties off the start of path.
    if (empty($paths[0])) {
        array_shift($paths);
    }
    // Reset indexes.
    $bp_uri = array_values($bp_uri);
    $paths = array_values($paths);
    // Unset URI indices if they intersect with the paths.
    foreach ((array) $bp_uri as $key => $uri_chunk) {
        if (isset($paths[$key]) && $uri_chunk == $paths[$key]) {
            unset($bp_uri[$key]);
        }
    }
    // Reset the keys by merging with an empty array.
    $bp_uri = array_merge(array(), $bp_uri);
    // If a component is set to the front page, force its name into $bp_uri
    // so that $current_component is populated (unless a specific WP post is being requested
    // via a URL parameter, usually signifying Preview mode).
    if ('page' == get_option('show_on_front') && get_option('page_on_front') && empty($bp_uri) && empty($_GET['p']) && empty($_GET['page_id'])) {
        $post = get_post(get_option('page_on_front'));
        if (!empty($post)) {
            $bp_uri[0] = $post->post_name;
        }
    }
    // Keep the unfiltered URI safe.
    $bp->unfiltered_uri = $bp_uri;
    // Don't use $bp_unfiltered_uri, this is only for backpat with old plugins. Use $bp->unfiltered_uri.
    $GLOBALS['bp_unfiltered_uri'] =& $bp->unfiltered_uri;
    // Get slugs of pages into array.
    foreach ((array) $bp->pages as $page_key => $bp_page) {
        $key_slugs[$page_key] = trailingslashit('/' . $bp_page->slug);
    }
    // Bail if keyslugs are empty, as BP is not setup correct.
    if (empty($key_slugs)) {
        return;
    }
    // Loop through page slugs and look for exact match to path.
    foreach ($key_slugs as $key => $slug) {
        if ($slug == $path) {
            $match = $bp->pages->{$key};
            $match->key = $key;
            $matches[] = 1;
            break;
        }
    }
    // No exact match, so look for partials.
    if (empty($match)) {
        // Loop through each page in the $bp->pages global.
        foreach ((array) $bp->pages as $page_key => $bp_page) {
            // Look for a match (check members first).
            if (in_array($bp_page->name, (array) $bp_uri)) {
                // Match found, now match the slug to make sure.
                $uri_chunks = explode('/', $bp_page->slug);
                // Loop through uri_chunks.
                foreach ((array) $uri_chunks as $key => $uri_chunk) {
                    // Make sure chunk is in the correct position.
                    if (!empty($bp_uri[$key]) && $bp_uri[$key] == $uri_chunk) {
                        $matches[] = 1;
                        // No match.
                    } else {
                        $matches[] = 0;
                    }
                }
                // Have a match.
                if (!in_array(0, (array) $matches)) {
                    $match = $bp_page;
                    $match->key = $page_key;
                    break;
                }
                // Unset matches.
                unset($matches);
            }
            // Unset uri chunks.
            unset($uri_chunks);
        }
    }
    // URLs with BP_ENABLE_ROOT_PROFILES enabled won't be caught above.
    if (empty($matches) && bp_core_enable_root_profiles()) {
        // Switch field based on compat.
        $field = bp_is_username_compatibility_mode() ? 'login' : 'slug';
        // Make sure there's a user corresponding to $bp_uri[0].
        if (!empty($bp->pages->members) && !empty($bp_uri[0]) && ($root_profile = get_user_by($field, $bp_uri[0]))) {
            // Force BP to recognize that this is a members page.
            $matches[] = 1;
            $match = $bp->pages->members;
            $match->key = 'members';
        }
    }
    // Search doesn't have an associated page, so we check for it separately.
    if (!empty($bp_uri[0]) && bp_get_search_slug() == $bp_uri[0]) {
        $matches[] = 1;
        $match = new stdClass();
        $match->key = 'search';
        $match->slug = bp_get_search_slug();
    }
    // This is not a BuddyPress page, so just return.
    if (empty($matches)) {
        return false;
    }
    $wp_rewrite->use_verbose_page_rules = false;
    // Find the offset. With $root_profile set, we fudge the offset down so later parsing works.
    $slug = !empty($match) ? explode('/', $match->slug) : '';
    $uri_offset = empty($root_profile) ? 0 : -1;
    // Rejig the offset.
    if (!empty($slug) && 1 < count($slug)) {
        // Only offset if not on a root profile. Fixes issue when Members page is nested.
        if (false === $root_profile) {
            array_pop($slug);
            $uri_offset = count($slug);
        }
    }
    // Global the unfiltered offset to use in bp_core_load_template().
    // To avoid PHP warnings in bp_core_load_template(), it must always be >= 0.
    $bp->unfiltered_uri_offset = $uri_offset >= 0 ? $uri_offset : 0;
    // We have an exact match.
    if (isset($match->key)) {
        // Set current component to matched key.
        $bp->current_component = $match->key;
        // If members component, do more work to find the actual component.
        if ('members' == $match->key) {
            $after_member_slug = false;
            if (!empty($bp_uri[$uri_offset + 1])) {
                $after_member_slug = $bp_uri[$uri_offset + 1];
            }
            // Are we viewing a specific user?
            if ($after_member_slug) {
                // If root profile, we've already queried for the user.
                if ($root_profile instanceof WP_User) {
                    $bp->displayed_user->id = $root_profile->ID;
                    // Switch the displayed_user based on compatibility mode.
                } elseif (bp_is_username_compatibility_mode()) {
                    $bp->displayed_user->id = (int) bp_core_get_userid(urldecode($after_member_slug));
                } else {
                    $bp->displayed_user->id = (int) bp_core_get_userid_from_nicename($after_member_slug);
                }
            }
            // Is this a member type directory?
            if (!bp_displayed_user_id() && $after_member_slug === apply_filters('bp_members_member_type_base', _x('type', 'member type URL base', 'buddypress')) && !empty($bp_uri[$uri_offset + 2])) {
                $matched_types = bp_get_member_types(array('has_directory' => true, 'directory_slug' => $bp_uri[$uri_offset + 2]));
                if (!empty($matched_types)) {
                    $bp->current_member_type = reset($matched_types);
                    unset($bp_uri[$uri_offset + 1]);
                }
            }
            // If the slug matches neither a member type nor a specific member, 404.
            if (!bp_displayed_user_id() && !bp_get_current_member_type() && $after_member_slug) {
                // Prevent components from loading their templates.
                $bp->current_component = '';
                bp_do_404();
                return;
            }
            // If the displayed user is marked as a spammer, 404 (unless logged-in user is a super admin).
            if (bp_displayed_user_id() && bp_is_user_spammer(bp_displayed_user_id())) {
                if (bp_current_user_can('bp_moderate')) {
                    bp_core_add_message(__('This user has been marked as a spammer. Only site admins can view this profile.', 'buddypress'), 'warning');
                } else {
                    bp_do_404();
                    return;
                }
            }
            // Bump the offset.
            if (bp_displayed_user_id()) {
                if (isset($bp_uri[$uri_offset + 2])) {
                    $bp_uri = array_merge(array(), array_slice($bp_uri, $uri_offset + 2));
                    $bp->current_component = $bp_uri[0];
                    // No component, so default will be picked later.
                } else {
                    $bp_uri = array_merge(array(), array_slice($bp_uri, $uri_offset + 2));
                    $bp->current_component = '';
                }
                // Reset the offset.
                $uri_offset = 0;
            }
        }
    }
    // Determine the current action.
    $current_action = isset($bp_uri[$uri_offset + 1]) ? $bp_uri[$uri_offset + 1] : '';
    /*
     * If a BuddyPress directory is set to the WP front page, URLs like example.com/members/?s=foo
     * shouldn't interfere with blog searches.
     */
    if (empty($current_action) && !empty($_GET['s']) && 'page' == get_option('show_on_front') && !empty($match->id)) {
        $page_on_front = (int) get_option('page_on_front');
        if ((int) $match->id === $page_on_front) {
            $bp->current_component = '';
            return false;
        }
    }
    $bp->current_action = $current_action;
    // Slice the rest of the $bp_uri array and reset offset.
    $bp_uri = array_slice($bp_uri, $uri_offset + 2);
    $uri_offset = 0;
    // Set the entire URI as the action variables, we will unset the current_component and action in a second.
    $bp->action_variables = $bp_uri;
    // Reset the keys by merging with an empty array.
    $bp->action_variables = array_merge(array(), $bp->action_variables);
}
/**
 * Get user domain.
 *
 * Do not use this outside of digests!
 *
 * This is almost a duplicate of bp_core_get_user_domain(), but references
 * our already-fetched mass-userdata array to avoid pinging the DB over and
 * over again in a foreach loop.
 */
function ass_digest_get_user_domain($user_id)
{
    global $bp;
    if (empty($bp->ass->massdata)) {
        return false;
    }
    $mass_userdata = $bp->ass->massdata;
    $username = bp_is_username_compatibility_mode() ? $mass_userdata[$user_id]['user_login'] : $mass_userdata[$user_id]['user_nicename'];
    if (bp_core_enable_root_profiles()) {
        $after_domain = $username;
    } else {
        $after_domain = bp_get_members_root_slug() . '/';
        $after_domain .= bp_is_username_compatibility_mode() ? rawurlencode($username) : $username;
    }
    $domain = trailingslashit(bp_get_root_domain() . '/' . $after_domain);
    $domain = apply_filters('bp_core_get_user_domain_pre_cache', $domain, $user_id, $mass_userdata[$user_id]['user_nicename'], $mass_userdata[$user_id]['user_login']);
    return apply_filters('bp_core_get_user_domain', $domain, $user_id, $mass_userdata[$user_id]['user_nicename'], $mass_userdata[$user_id]['user_login']);
}
/**
 * Returns the domain for the passed user: e.g. http://domain.com/members/andy/
 *
 * @package BuddyPress Core
 * @global $current_user WordPress global variable containing current logged in user information
 * @param user_id The ID of the user.
 */
function bp_core_get_user_domain($user_id, $user_nicename = false, $user_login = false)
{
    if (empty($user_id)) {
        return;
    }
    if (!($domain = wp_cache_get('bp_user_domain_' . $user_id, 'bp'))) {
        $username = bp_core_get_username($user_id, $user_nicename, $user_login);
        if (bp_is_username_compatibility_mode()) {
            $username = rawurlencode($username);
        }
        $after_domain = bp_core_enable_root_profiles() ? $username : bp_get_members_root_slug() . '/' . $username;
        $domain = trailingslashit(bp_get_root_domain() . '/' . $after_domain);
        $domain = apply_filters('bp_core_get_user_domain_pre_cache', $domain, $user_id, $user_nicename, $user_login);
        // Cache the link
        if (!empty($domain)) {
            wp_cache_set('bp_user_domain_' . $user_id, $domain, 'bp');
        }
    }
    return apply_filters('bp_core_get_user_domain', $domain, $user_id, $user_nicename, $user_login);
}
示例#7
0
/**
 * Return the domain for the passed user: e.g. http://domain.com/members/andy/.
 *
 * @param int $user_id The ID of the user.
 * @param string $user_nicename Optional. user_nicename of the user.
 * @param string $user_login Optional. user_login of the user.
 */
function bp_core_get_user_domain($user_id = 0, $user_nicename = false, $user_login = false)
{
    if (empty($user_id)) {
        return;
    }
    $username = bp_core_get_username($user_id, $user_nicename, $user_login);
    if (bp_is_username_compatibility_mode()) {
        $username = rawurlencode($username);
    }
    $after_domain = bp_core_enable_root_profiles() ? $username : bp_get_members_root_slug() . '/' . $username;
    $domain = trailingslashit(bp_get_root_domain() . '/' . $after_domain);
    // Don't use this filter.  Subject to removal in a future release.
    // Use the 'bp_core_get_user_domain' filter instead.
    $domain = apply_filters('bp_core_get_user_domain_pre_cache', $domain, $user_id, $user_nicename, $user_login);
    return apply_filters('bp_core_get_user_domain', $domain, $user_id, $user_nicename, $user_login);
}
示例#8
0
/**
 * Analyzes the URI structure and breaks it down into parts for use in code.
 * BuddyPress can use complete custom friendly URI's without the user having to
 * add new re-write rules. Custom components are able to use their own custom
 * URI structures with very little work.
 *
 * @package BuddyPress Core
 * @since BuddyPress (r100)
 *
 * The URI's are broken down as follows:
 *   - http:// domain.com / members / andy / [current_component] / [current_action] / [action_variables] / [action_variables] / ...
 *   - OUTSIDE ROOT: http:// domain.com / sites / buddypress / members / andy / [current_component] / [current_action] / [action_variables] / [action_variables] / ...
 *
 *	Example:
 *    - http://domain.com/members/andy/profile/edit/group/5/
 *    - $bp->current_component: string 'xprofile'
 *    - $bp->current_action: string 'edit'
 *    - $bp->action_variables: array ['group', 5]
 *
 */
function bp_core_set_uri_globals()
{
    global $bp, $current_blog, $wpdb;
    // Don't catch URIs on non-root blogs unless multiblog mode is on
    if (!bp_is_root_blog() && !bp_is_multiblog_mode()) {
        return false;
    }
    // Define local variables
    $root_profile = $match = false;
    $key_slugs = $matches = $uri_chunks = array();
    // Fetch all the WP page names for each component
    if (empty($bp->pages)) {
        $bp->pages = bp_core_get_directory_pages();
    }
    // Ajax or not?
    if (strpos($_SERVER['REQUEST_URI'], 'wp-load.php')) {
        $path = bp_core_referrer();
    } else {
        $path = esc_url($_SERVER['REQUEST_URI']);
    }
    // Filter the path
    $path = apply_filters('bp_uri', $path);
    // Take GET variables off the URL to avoid problems
    $path = strtok($path, '?');
    // Fetch current URI and explode each part separated by '/' into an array
    $bp_uri = explode('/', $path);
    // Loop and remove empties
    foreach ((array) $bp_uri as $key => $uri_chunk) {
        if (empty($bp_uri[$key])) {
            unset($bp_uri[$key]);
        }
    }
    // If running off blog other than root, any subdirectory names must be
    // removed from $bp_uri. This includes two cases:
    //
    //    1. when WP is installed in a subdirectory,
    //    2. when BP is running on secondary blog of a subdirectory
    //       multisite installation. Phew!
    if (is_multisite() && !is_subdomain_install() && (bp_is_multiblog_mode() || 1 != bp_get_root_blog_id())) {
        // Blow chunks
        $chunks = explode('/', $current_blog->path);
        // If chunks exist...
        if (!empty($chunks)) {
            // ...loop through them...
            foreach ($chunks as $key => $chunk) {
                $bkey = array_search($chunk, $bp_uri);
                // ...and unset offending keys
                if (false !== $bkey) {
                    unset($bp_uri[$bkey]);
                }
                $bp_uri = array_values($bp_uri);
            }
        }
    }
    // Get site path items
    $paths = explode('/', bp_core_get_site_path());
    // Take empties off the end of path
    if (empty($paths[count($paths) - 1])) {
        array_pop($paths);
    }
    // Take empties off the start of path
    if (empty($paths[0])) {
        array_shift($paths);
    }
    // Unset URI indices if they intersect with the paths
    foreach ((array) $bp_uri as $key => $uri_chunk) {
        if (in_array($uri_chunk, $paths)) {
            unset($bp_uri[$key]);
        }
    }
    // Reset the keys by merging with an empty array
    $bp_uri = array_merge(array(), $bp_uri);
    // If a component is set to the front page, force its name into $bp_uri
    // so that $current_component is populated
    if ('page' == get_option('show_on_front') && get_option('page_on_front') && empty($bp_uri)) {
        $post = get_post(get_option('page_on_front'));
        if (!empty($post)) {
            $bp_uri[0] = $post->post_name;
        }
    }
    // Keep the unfiltered URI safe
    $bp->unfiltered_uri = $bp_uri;
    // Get slugs of pages into array
    foreach ((array) $bp->pages as $page_key => $bp_page) {
        $key_slugs[$page_key] = trailingslashit('/' . $bp_page->slug);
    }
    // Bail if keyslugs are empty, as BP is not setup correct
    if (empty($key_slugs)) {
        return;
    }
    // Loop through page slugs and look for exact match to path
    foreach ($key_slugs as $key => $slug) {
        if ($slug == $path) {
            $match = $bp->pages->{$key};
            $match->key = $key;
            $matches[] = 1;
            break;
        }
    }
    // No exact match, so look for partials
    if (empty($match)) {
        // Loop through each page in the $bp->pages global
        foreach ((array) $bp->pages as $page_key => $bp_page) {
            // Look for a match (check members first)
            if (in_array($bp_page->name, (array) $bp_uri)) {
                // Match found, now match the slug to make sure.
                $uri_chunks = explode('/', $bp_page->slug);
                // Loop through uri_chunks
                foreach ((array) $uri_chunks as $key => $uri_chunk) {
                    // Make sure chunk is in the correct position
                    if (!empty($bp_uri[$key]) && $bp_uri[$key] == $uri_chunk) {
                        $matches[] = 1;
                        // No match
                    } else {
                        $matches[] = 0;
                    }
                }
                // Have a match
                if (!in_array(0, (array) $matches)) {
                    $match = $bp_page;
                    $match->key = $page_key;
                    break;
                }
                // Unset matches
                unset($matches);
            }
            // Unset uri chunks
            unset($uri_chunks);
        }
    }
    // URLs with BP_ENABLE_ROOT_PROFILES enabled won't be caught above
    if (empty($matches) && bp_core_enable_root_profiles()) {
        // Make sure there's a user corresponding to $bp_uri[0]
        if (!empty($bp->pages->members) && !empty($bp_uri[0]) && ($root_profile = get_user_by('login', $bp_uri[0]))) {
            // Force BP to recognize that this is a members page
            $matches[] = 1;
            $match = $bp->pages->members;
            $match->key = 'members';
            // Without the 'members' URL chunk, WordPress won't know which page to load
            // This filter intercepts the WP query and tells it to load the members page
            add_filter('request', create_function('$query_args', '$query_args["pagename"] = "' . $match->name . '"; return $query_args;'));
        }
    }
    // Search doesn't have an associated page, so we check for it separately
    if (!empty($bp_uri[0]) && bp_get_search_slug() == $bp_uri[0]) {
        $matches[] = 1;
        $match = new stdClass();
        $match->key = 'search';
        $match->slug = bp_get_search_slug();
    }
    // This is not a BuddyPress page, so just return.
    if (!isset($matches)) {
        return false;
    }
    // Find the offset. With $root_profile set, we fudge the offset down so later parsing works
    $slug = !empty($match) ? explode('/', $match->slug) : '';
    $uri_offset = empty($root_profile) ? 0 : -1;
    // Rejig the offset
    if (!empty($slug) && 1 < count($slug)) {
        array_pop($slug);
        $uri_offset = count($slug);
    }
    // Global the unfiltered offset to use in bp_core_load_template().
    // To avoid PHP warnings in bp_core_load_template(), it must always be >= 0
    $bp->unfiltered_uri_offset = $uri_offset >= 0 ? $uri_offset : 0;
    // We have an exact match
    if (isset($match->key)) {
        // Set current component to matched key
        $bp->current_component = $match->key;
        // If members component, do more work to find the actual component
        if ('members' == $match->key) {
            // Viewing a specific user
            if (!empty($bp_uri[$uri_offset + 1])) {
                // Switch the displayed_user based on compatbility mode
                if (bp_is_username_compatibility_mode()) {
                    $bp->displayed_user->id = (int) bp_core_get_userid(urldecode($bp_uri[$uri_offset + 1]));
                } else {
                    $bp->displayed_user->id = (int) bp_core_get_userid_from_nicename(urldecode($bp_uri[$uri_offset + 1]));
                }
                if (!bp_displayed_user_id()) {
                    // Prevent components from loading their templates
                    $bp->current_component = '';
                    bp_do_404();
                    return;
                }
                // If the displayed user is marked as a spammer, 404 (unless logged-
                // in user is a super admin)
                if (bp_displayed_user_id() && bp_is_user_spammer(bp_displayed_user_id())) {
                    if (bp_current_user_can('bp_moderate')) {
                        bp_core_add_message(__('This user has been marked as a spammer. Only site admins can view this profile.', 'buddypress'), 'warning');
                    } else {
                        bp_do_404();
                        return;
                    }
                }
                // Bump the offset
                if (isset($bp_uri[$uri_offset + 2])) {
                    $bp_uri = array_merge(array(), array_slice($bp_uri, $uri_offset + 2));
                    $bp->current_component = $bp_uri[0];
                    // No component, so default will be picked later
                } else {
                    $bp_uri = array_merge(array(), array_slice($bp_uri, $uri_offset + 2));
                    $bp->current_component = '';
                }
                // Reset the offset
                $uri_offset = 0;
            }
        }
    }
    // Set the current action
    $bp->current_action = isset($bp_uri[$uri_offset + 1]) ? $bp_uri[$uri_offset + 1] : '';
    // Slice the rest of the $bp_uri array and reset offset
    $bp_uri = array_slice($bp_uri, $uri_offset + 2);
    $uri_offset = 0;
    // Set the entire URI as the action variables, we will unset the current_component and action in a second
    $bp->action_variables = $bp_uri;
    // Remove the username from action variables if this is not a VHOST install
    // @todo - move or remove this all together
    if (defined('VHOST') && 'no' == VHOST && empty($bp->current_component)) {
        array_shift($bp_uri);
    }
    // Reset the keys by merging with an empty array
    $bp->action_variables = array_merge(array(), $bp->action_variables);
}
/**
 * Filter the login redirect URL.
 *
 * @since 1.0.2
 * @package GeoDirectory_BuddyPress_Integration
 *
 * @global object $bp BuddyPress object.
 *
 * @param string $redirect_to The redirect destination URL.
 * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter.
 * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise.
 * @return string The redirect URL.
 */
function geodir_buddypress_login_redirect($redirect_to, $requested_redirect_to, $user)
{
    // Only modify the redirect if we're on the main BP blog
    if (!bp_is_root_blog()) {
        return $redirect_to;
    }
    // Only modify the redirect once the user is logged in
    if (!is_a($user, 'WP_User')) {
        return $redirect_to;
    }
    // If a 'redirect_to' parameter has been passed that contains 'wp-admin'
    if (!empty($redirect_to) && false !== strpos($redirect_to, 'wp-admin') && user_can($user, 'edit_posts')) {
        return $redirect_to;
    }
    $login_redirect = (int) get_option('gdbuddypress_login_redirect');
    switch ($login_redirect) {
        case 1:
            // Home page
            $redirect_to = trailingslashit(home_url());
            break;
        case 2:
            // Profile page
            $members_slug = bp_get_members_root_slug();
            if ($members_slug) {
                $redirect_to = trailingslashit(bp_core_get_user_domain($user->ID));
            } else {
                $username = bp_core_get_username($user->ID, $user->data->user_nicename, $user->data->user_login);
                if (bp_core_enable_root_profiles()) {
                    $redirect_to = trailingslashit(bp_get_root_domain() . '/' . $username);
                } else {
                    $bp_pages = bp_core_get_directory_pages();
                    if (isset($bp_pages->members->slug)) {
                        $members_slug = $bp_pages->members->slug;
                    } else {
                        global $bp;
                        $members_slug = defined('BP_MEMBERS_SLUG') ? BP_MEMBERS_SLUG : $bp->members->id;
                    }
                    $redirect_to = trailingslashit(bp_get_root_domain() . '/' . $members_slug . '/' . $username);
                }
            }
            break;
        case 3:
            // Menu page
            $menu_redirect = (int) get_option('gdbuddypress_menu_redirect');
            if ($menu_redirect > 0) {
                $redirect_to = get_permalink($menu_redirect);
            }
            break;
    }
    return $redirect_to;
}