Extending Breadcrumb Trail plugin for BuddyPress breadcrumb navigation
//filter and append our items to breadcrumb trails
add_filter('breadcrumb_trail_items', 'hibuddy_include_bp_items',10,2);
function hibuddy_include_bp_items($trail, $args){
global $bp;
//current action
$action = isset( $bp->canonical_stack['action'] ) ? $bp->canonical_stack['action'] : '' ;
$component = isset( $bp->canonical_stack['component'] ) ? $bp->canonical_stack['component'] : '';
$action_variables = isset( $bp->canonical_stack['action_variables'] ) ? $bp->canonical_stack['action_variables'] : array();
$trail_end = '';
//is user component
if( bp_is_user() ){
//remove trail_end
unset($trail['trail_end']);
//add Members Page as Link
$trail[] = "<a href='".get_permalink($bp->pages->members->id)."'>".get_the_title($bp->pages->members->id)."</a>";
//if component is empty, it will just list the user display name as end point
//we may improve it to show the default component title instead in future
if( empty( $component ) ){
$trail['trail_end'] = bp_get_displayed_user_fullname ();
}else{
//if we are here, we are most probably on a component screen of user
$trail[] = bp_core_get_userlink(bp_displayed_user_id());
//find the details about current nav item
$nav_details = hibuddy_find_nav_details($bp->bp_nav, $component);
//let us keep the name of current nav menu as end point
$trail_end = $nav_details['name'];
//are we doing some action for the component
if( !empty( $action ) ) {
//yes, then let us link to the parent component on user
$trail[] = "<a href='". $nav_details['link']."'>".$nav_details['name']."</a>";
$subnav_details = hibuddy_find_subnav_details( $component, $action );
//let us keep that sub nav action name as the end point
$trail_end = $subnav_details['name'];
}
if( !empty( $action_variables ) ){
//is some action_variable set
//if yes, let us append the parent action link to the breadcrumb
$trail[] = "<a href='". $subnav_details['link']."'>".$subnav_details['name']."</a>";
$trail_end = array_pop( $action_variables );
foreach( $action_variables as $action_name )
$trail[] = ucwords(str_replace('-', ' ', $action_name));
$trail_end = ucwords( str_replace('-', ' ', $trail_end ) );
}
}
}elseif( bp_is_active('groups') && bp_is_group() ){
unset($trail['trail_end']);
//let us append the group parent page as link
$trail[] = "<a href='".get_permalink($bp->pages->groups->id)."'>".get_the_title($bp->pages->groups->id)."</a>";
//get the current group details
$current_group = groups_get_current_group();
//if no action is set, we are on group home page
if( empty( $action ) ){
$trail['trail_end'] = bp_get_group_name( $current_group );
}else{
//we are on any of group internal page
$trail[]= "<a href='". bp_get_group_permalink( $current_group )."'>". bp_get_group_name( $current_group )."</a>";
$subnav_details = hibuddy_find_subnav_details( $current_group->slug, $action );
$trail_end = $subnav_details['name'];
if( !empty( $action_variables ) ){
$trail[] = "<a href='". $subnav_details['link']."'>".$subnav_details['name']."</a>";
$trail_end = array_pop( $action_variables );
foreach( $action_variables as $action_name )
$trail[] = ucwords( str_replace('-', ' ', $action_name ) );
$trail_end = ucwords(str_replace('-', ' ',$trail_end ));
}
}
}
//that's all folks for the User/group
//what other components do you use,
//I was planning to write the 3rd section to handle the non core components having their own single pages(e.g. events etc)
// but I need some suggestion about one of the plugins to see if I can have a generic way of doing it
//append trail end
if( !empty( $trail_end ) )
$trail['trail_end'] = $trail_end;
return $trail;
}
/**
*
* Iterates over a multi dimensional array and finds the array item that has a slug name which matches item name
* @global type $bp
* @param mixed $collection array of nav items
* @param type $item_name slug name to match against
* @return mixed|boolean
*/
function hibuddy_find_nav_details($collection, $item_name){
foreach( $collection as $nav_item){
if($nav_item['slug']== $item_name){
//let us manipulate the link
if ( bp_loggedin_user_domain() )
$nav_item['link'] = str_replace( bp_loggedin_user_domain(), bp_displayed_user_domain(), $nav_item['link'] );
return $nav_item;
}
}
return false;
}
/**
* Find the subnav array
* @global type $bp
* @param type $component : component name groups etc
* @param type $action which action eg. admin/forums etc
* @return mixed array of sub nav item details
*/
function hibuddy_find_subnav_details( $component, $action ){
global $bp;
$main_nav = $bp->bp_options_nav[$component];
return hibuddy_find_nav_details( $main_nav, $action );
}
#buddypress #breadcrumb #bp-hacks