Skip to content

Instantly share code, notes, and snippets.

@standa
Created May 19, 2015 11:44
Show Gist options
  • Save standa/16e9439b68b4e995a063 to your computer and use it in GitHub Desktop.
Save standa/16e9439b68b4e995a063 to your computer and use it in GitHub Desktop.
Google breadcrumbs
<?php
/**
* This generates breadcrumbs according to google specification
* @link https://developers.google.com/structured-data/testing-tool/
* Featuring:
* - nested category trail
* - multiple category trails
* - starting with Home bit
* - without the last bit (the actual product or the current category)
*/
$crumbLevels = array(
// nested breadcrumb trail 1
array(
array('link' => 'url1.html', 'title' => 'URL1'),
array('link' => 'url2.html', 'title' => 'URL2')
),
// nested breadcrumb trail 2
array(
array('link' => 'second-trail-url1.html', 'title' => 'Second trail URL1'),
array('link' => 'second-trail-url2.html', 'title' => 'Second trail URL2')
)
);
if ($crumbsLevels && is_array($crumbsLevels)) {
$out = '<div class="breadcrumbs">'.PHP_EOL;
foreach ($crumbsLevels as $crumbLevel => $crumbs) {
$out .= '<ul style="clear: both">'.PHP_EOL;
foreach ($crumbs as $crumbPosition => $_crumb) {
$id = 'breadcrumb-'.($crumbLevel + 1).'-'.$crumbPosition;
if (isset($crumbs[$crumbPosition+1]) && $crumbPosition + 1 < count($crumbs) - 1) {
$childId = 'breadcrumb-' . ($crumbLevel + 1) . '-' . ($crumbPosition + 1);
} else {
$childId = null;
}
if ($crumbPosition < count($crumbs) - 1) {
$liAttrs = array('id' => $id, 'itemscope' => '', 'itemtype' => 'http://data-vocabulary.org/Breadcrumb');
} else {
$liAttrs = array();
}
$aAttrs = array();
$spanAttrs = array();
if (!empty($childId)) {
$liAttrs['itemref'] = $childId;
}
if ($crumbPosition > 0 && $crumbPosition < count($crumbs) - 1) {
$liAttrs['itemprop'] = 'child';
}
if (!empty($_crumb['hidden'])) {
$liAttrs['style'] = 'visibility: hidden;';
}
if (!empty($_crumb['link'])) {
$aAttrs['href'] = $_crumb['link'];
$aAttrs['title'] = $this->htmlEscape($_crumb['title']);
$aAttrs['itemprop'] = 'url';
}
$spanAttrs['itemprop'] = 'title';
$out .= '<li';
foreach ($liAttrs as $key => $val) { $out .= " $key=\"$val\""; }
$out .= '>';
if (!empty($_crumb['link'])) {
$out .= '<a ';
foreach ($aAttrs as $key => $val) { $out .= " $key=\"$val\""; }
$out .= '>';
}
$out .= '<div ';
foreach ($spanAttrs as $key => $val) { $out .= " $key=\"$val\""; }
$out .= '>'.$this->htmlEscape($_crumb['title']).'</div>';
if (!empty($_crumb['link'])) {
$out .= '</a>';
}
// Leave out the last crumb because it is the current page
if ($crumbPosition < count($crumbs) - 1) {
$out .= '<span> / </span>';
}
$out .= '</li>';
}
$out .= '</ul>'.PHP_EOL;
}
$out .= '</div>'.PHP_EOL; // .grid-full .breadcrumbs
echo $out;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment