Index: bp-core/bp-core-functions.php =================================================================== --- bp-core/bp-core-functions.php (revision 7351) +++ bp-core/bp-core-functions.php (working copy) @@ -1411,3 +1411,78 @@ __('Log in/Log out', 'buddypress'), + 'slug' => 'login', + 'link' => wp_login_url() + ) + ); + + $bp_directory_page_ids = bp_core_get_directory_page_ids(); + + if( !empty( $bp_directory_page_ids['register'] ) ) { + $utilities[] = array( + 'name' => get_the_title( $bp_directory_page_ids['register'] ), + 'slug' => 'register', + 'link' => get_permalink( $bp_directory_page_ids['register'] ) + ); + } + + $bp_menu_items = buddypress()->bp_nav; + $bp_menu_items = array_merge( $utilities, $bp_menu_items ); + $page_args = array(); + + if( count( $bp_menu_items ) < 1 ) + return false; + + $found = ''; + + foreach( $bp_menu_items as $bp_item ) { + $item_name = ''; + + if( !empty( $selected ) && $bp_item['slug'] == $selected ) + return $bp_item['link']; + + else { + + // deleting number + $item_name = preg_replace( '/([.0-9]+)/', '', $bp_item['name'] ); + $item_name = trim( wp_kses( $item_name, array() ) ); + + $page_args[] = (object) array( + 'ID' => -1, + 'post_title' => $item_name, + 'post_author' => 0, + 'post_date' => 0, + 'post_excerpt' => $bp_item['slug'], + 'post_type' => 'page', + 'post_status' => 'publish', + 'comment_status' => 'closed', + 'guid' => $bp_item['link'] + ); + } + + } + + return $page_args; + +} Index: bp-core/bp-core-filters.php =================================================================== --- bp-core/bp-core-filters.php (revision 7351) +++ bp-core/bp-core-filters.php (working copy) @@ -386,3 +386,68 @@ add_filter( 'bp_modify_page_title', 'wptexturize' ); add_filter( 'bp_modify_page_title', 'convert_chars' ); add_filter( 'bp_modify_page_title', 'esc_html' ); + + +/* BP Nav Menu */ + +/** + * Filters wp_setup_nav_menu_item to adapt the links to current user + * + * If user is not logged in regiser menu and login menu item must show + * If user is logged in register menu must be unset and logout must replace login + * + * @param WP_Post $menu_item the menu item + * @uses is_admin() to check we're in backend + * @uses is_user_logged_in() to check if we have a user logged in + * @uses wp_logout_url() to build the log out url + * @uses bp_get_root_domain() to be redirected to root domain url once logged out + * @uses wp_login_url() to build log in url + * @uses wp_guess_url() to be redirected to be redirected at the best place once logged in + * @uses bp_get_nav_item_pages() to get the url for the user's nav + * @uses bp_get_requested_url() to get the current url + * @return WP_Post a modified menu item if needed + */ +function bp_setup_nav_menu_item( $menu_item ) { + + if( is_admin() ) + return $menu_item; + + $css_target = preg_match( '/\sbp-(.*)-nav/', implode( ' ', $menu_item->classes), $matches ); + + if( empty( $matches[1] ) ) + return $menu_item; + + switch( $matches[1] ) { + case 'login' : + if( is_user_logged_in() ) { + $menu_item->url = wp_logout_url( bp_get_root_domain() ); + $menu_item->title = __( 'Log out', 'buddypress' ); + } else { + $menu_item->url = wp_login_url( wp_guess_url() ); + $menu_item->title = __( 'Log in', 'buddypress' ); + } + + break; + + case 'register' : + if( is_user_logged_in() ) + $menu_item->_invalid = true; + break; + + default: + if( is_user_logged_in() ) + $menu_item->url = bp_get_nav_item_pages( $matches[1] ); + else + $menu_item->_invalid = true; + break; + } + + $current = bp_get_requested_url(); + + if( strpos( $current, $menu_item->url ) !== false ) + $menu_item->classes[] = 'current_page_item'; + + return $menu_item; +} + +add_filter( 'wp_setup_nav_menu_item', 'bp_setup_nav_menu_item', 10, 1 ); Index: bp-core/admin/bp-core-functions.php =================================================================== --- bp-core/admin/bp-core-functions.php (revision 7351) +++ bp-core/admin/bp-core-functions.php (working copy) @@ -642,3 +642,74 @@ return $action; } + + +/* BP Nav Menu */ + +/** + * Registers a meta box for BuddyPress WP Nav Menu and a js at the bottom of the page + * + * @global integer the current blog id + * @uses bp_get_root_blog_id() to check current is root + * @uses add_meta_box() to register the BuddyPress WP Nav accordeon + * @uses add_action() to hook to admin footer scripts and load a piece of javascript + */ +function bp_admin_wp_nav_menu_meta_box() { + global $blog_id; + + if( $blog_id != bp_get_root_blog_id() ) + return; + + add_meta_box( 'add-buddypress-nav-menu', __( 'BuddyPress', 'buddypress' ), 'bp_admin_do_wp_nav_menu_meta_box', 'nav-menus', 'side', 'default' ); + + add_action( 'admin_print_footer_scripts', 'bp_admin_wp_nav_menu_restrict_class_attr' ); +} + +/** + * Builds the accordeon and populates it with login/register/bp_nav items + * + * @global $nav_menu_selected_id + * @uses BP_Walker_Nav_Menu_Checklist to use our adapted walker + * @uses bp_get_nav_item_pages() to get the menu items + * @return string html output + */ +function bp_admin_do_wp_nav_menu_meta_box() { + global $nav_menu_selected_id; + + $walker = new BP_Walker_Nav_Menu_Checklist( false ); + $args = array( 'walker' => $walker ); + $menu_pages = bp_get_nav_item_pages(); + ?> +
+ + + db_fields = $fields; + } + } + + function start_lvl( &$output, $depth = 0, $args = array() ) { + $indent = str_repeat( "\t", $depth ); + $output .= "\n$indent