Note: This guide is only valid for versions of Breadcrumb NavXT prior to 4.0. Since Breadcrumb NavXT 4.0 the bcn_after_fill
action should be used to remove breadcrumbs from the breadcrumb trail.
Over the past year, several individuals have inquired on the feasibility of removing the current item (page, post, etc) from the Breadcrumb trail. While this is not good form, every page in the hierarchy should be represented in the breadcrumb trail, one will discuss how to remove the current item from the breadcrumb trail.
As in the Keep a Page Out of the Breadcrumb Trail guide, the method discussed herein differs from earlier methods provided in response to comments elsewhere. Likewise, this method uses the OOP principle of inheritance and requires PHP5–as does Breadcrumb NavXT so that should not be a problem.
Previously, removing the current item from the breadcrumb trail was the suggested method of implementation. While this works great, it does have some flexibility issues. And, it will not work if the bcn_breadcrumb_trail::trail
array is a private or protected member variable (which may happen in the future). Instead, this guide will override the bcn_breadcrumb_trail::display()
member function.
First, open the functions.php file of your theme. Within it we are going to create a new class named ext_breadcrumb_trail
, and tell PHP that it is an extension of the bcn_breadcrumb_trail
class. We will place the skeleton for the class constructor in at this time as well.
class ext_breadcrumb_trail extends bcn_breadcrumb_trail
{
//Default constructor
function __construct()
{
//Need to make sure we call the constructor of bcn_breadcrumb_trail
parent::__construct();
}
}
Now, onto overriding bcn_breadcrumb_trail::display()
. If you do not use bcn_breadcrumb_trail::display_trail()
then this is all you will need:
class ext_breadcrumb_trail extends bcn_breadcrumb_trail
{
//Default constructor
function __construct()
{
//Need to make sure we call the constructor of bcn_breadcrumb_trail
parent::__construct();
}
/**
* display
*
* Breadcrumb Creation Function
*
* This functions outputs or returns the breadcrumb trail in string form.
*
* @return void Void if Option to print out breadcrumb trail was chosen.
* @return string String-Data of breadcrumb trail.
* @param bool $return Whether to return data or to echo it.
* @param bool $linked[optional] Whether to allow hyperlinks in the trail or not.
* @param bool $reverse[optional] Whether to reverse the output or not.
*/
function display($return = false, $linked = true, $reverse = false)
{
//Set trail order based on reverse flag
$this->order($reverse);
//Initilize the string which will hold the assembled trail
$trail_str = '';
//The main compiling loop
foreach($this->trail as $key=>$breadcrumb)
{
//Must branch if we are reversing the output or not
if($reverse)
{
//Add in the separator only if we are the 2nd or greater element
if($key > 0)
{
$trail_str .= $this->opt['separator'];
}
}
else
{
//Only show the separator when necessary
if($key > count($this->trail) - 2)
{
$trail_str .= $this->opt['separator'];
}
}
//Trim titles, if needed
if($this->opt['max_title_length'] > 0)
{
//Trim the breadcrumb's title
$breadcrumb->title_trim($this->opt['max_title_length']);
}
//We want to output everything but the current item
if($key === 0)
{
break;
}
//Place in the breadcrumb's assembled elements
$trail_str .= $breadcrumb->assemble($linked);
}
//Should we return or echo the assembled trail?
if($return)
{
return $trail_str;
}
else
{
//Giving credit where credit is due, please don't remove it
$tag = "<!-- Breadcrumb NavXT " . $this->version . " -->\n";
echo $tag . $trail_str;
}
}
}
The above code has only minor changes from the distributed bcn_breadcrumb_trail::display()
code. One line was adjusted so that one less breadcrumb separator would be output. The other change involved replacing $this->current_item($breadcrumb);
with break;
, ending the loop execution. Note, if you want the “extra” breadcrumb separator to still display, change the line:
if($key < count($this->trail) - 2)
to:
if($key < count($this->trail) - 1)
If you need bcn_breadcrumb_trail::display_trail()
instead of bcn_breadcrumb_trail::display()
you will want to use the following code:
class ext_breadcrumb_trail extends bcn_breadcrumb_trail
{
//Default constructor
function __construct()
{
//Need to make sure we call the constructor of bcn_breadcrumb_trail
parent::__construct();
}
/**
* display_list
*
* Breadcrumb Creation Function
*
* This functions outputs or returns the breadcrumb trail in list form.
*
* @return void Void if Option to print out breadcrumb trail was chosen.
* @return string String-Data of breadcrumb trail.
* @param bool $return Whether to return data or to echo it.
* @param bool $linked[optional] Whether to allow hyperlinks in the trail or not.
* @param bool $reverse[optional] Whether to reverse the output or not.
*/
function display_list($return = false, $linked = true, $reverse = false)
{
//Set trail order based on reverse flag
$this->order($reverse);
//Initilize the string which will hold the assembled trail
$trail_str = '';
//The main compiling loop
foreach($this->trail as $key=>$breadcrumb)
{
$trail_str .= '
<li>';
//Trim titles, if needed
if($this->opt['max_title_length'] > 0)
{
//Trim the breadcrumb's title
$breadcrumb->title_trim(
$this->opt['max_title_length']);
}
//We want to output everything but the current item
if($key === 0)
{
break;
}
//Place in the breadcrumb's assembled elements
$trail_str .= $breadcrumb->assemble($linked);
$trail_str .= "</li>
\n";
}
//Should we return or echo the assembled trail?
if($return)
{
return $trail_str;
}
else
{
//Giving credit where credit is due, please don't remove it
$tag = "<!-- Breadcrumb NavXT " . $this->version . " -->\n";
echo $tag . $trail_str;
}
}
}
The only change in this code from the distributed bcn_breadcrumb_trail::display_trail()
involved modifying the branch statement used for the current item. This involved replacing $this->current_item($breadcrumb);
with break;
. Now onto calling our new class. For users of the normal, sting output breadcrumb trail, you will use something on the lines of:
if(class_exists('ext_breadcrumb_trail'))
{
//Make new instance of the ext_breadcrumb_trail object
$breadcrumb_trail = new ext_breadcrumb_trail();
//Setup options here if needed
//Fill the breadcrumb trail
$breadcrumb_trail->fill();
//Display the trail
$breadcrumb_trail->display();
}
While users of the HTML list output form of the breadcrumb trail will want to use:
if(class_exists('ext_breadcrumb_trail'))
{
//Make new instance of the ext_breadcrumb_trail object
$breadcrumb_trail = new ext_breadcrumb_trail();
//Setup options here if needed
//Fill the breadcrumb trail
$breadcrumb_trail->fill();
//Display the trail
$breadcrumb_trail->display_list();
}
This is a quite simple method for removing the current item from the breadcrumb trail output. Since the display functions will not be modified in the foreseeable future, this is quite safe to use. Again, for usability reasons, one recommends you do not actually remove the current item from the breadcrumb trail.
-John Havlik
[end of transmission, stay tuned]