<?php
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
/**
|
* Outputs the breadcrumb list as an array
|
* @return array
|
*/
|
function jvbGetCrumbs():array
|
{
|
$cache = new JVBase\managers\CacheManager('breadcrumbs', MONTH_IN_SECONDS);
|
$key = get_queried_object_id();
|
$crumbs = $cache->get($key);
|
$crumbs = false;
|
if ($crumbs) {
|
return $crumbs;
|
}
|
|
$crumbs = [];
|
$crumbs[] = [
|
'name' => 'Home',
|
'icon' => jvbIcon('home'),
|
'url' => get_home_url(),
|
];
|
|
$obj = get_queried_object();
|
|
//taxonomies extra
|
if (is_tax()) {
|
switch ($obj->taxonomy) {
|
case BASE.'type':
|
$type = 'artist';
|
break;
|
default:
|
$type = jvbNoBase($obj->taxonomy);
|
break;
|
}
|
$directory = jvbDirectories($type);
|
$crumbs[] = [
|
'name' => $directory['title'],
|
'url' => $directory['url']
|
];
|
$crumbs = array_merge($crumbs, jvbGetBreadcrumbTermHierarchy($obj));
|
|
}
|
if (is_singular()) {
|
$directory = jvbDirectories(jvbNoBase($obj->post_type));
|
if (!empty($directory)) {
|
$crumbs[] = [
|
'name' => $directory['title'],
|
'url' => $directory['url']
|
];
|
}
|
|
if (jvbIsDirectory()) {
|
$pos = jvbGetDirectoryInfo();
|
if (!empty($pos)) {
|
$name = $pos['title'];
|
|
|
if ($name == 'Map') {
|
$crumbs[] = array(
|
'name' => 'Tattoo Shops',
|
'url' => jvbDirectories(BASE.'shop')['url']
|
);
|
}
|
|
$crumbs[] = array(
|
'name' => $name,
|
'url' => $pos['url']
|
);
|
}
|
} else {
|
//
|
// $crumbs[] = array(
|
// 'name' => get_the_title(),
|
// 'url' => false,
|
// );
|
$crumbs = array_merge($crumbs, jvbGetBreadcrumbPostHierarchy($obj));
|
}
|
|
} elseif (is_post_type_archive() && !is_post_type_archive(BASE.'dash')) {
|
$name = jvbNoBase($obj->name);
|
$crumbs[] = array(
|
'name' => JVB_CONTENT[$name]['breadcrumb']??JVB_CONTENT[$name]['plural'],
|
'url' => false,
|
);
|
}
|
$cache->set($key, $crumbs);
|
return $crumbs;
|
}
|
|
|
/**
|
* @return string
|
*/
|
function jvbBuildBreadcrumbs():string
|
{
|
if (is_front_page()) {
|
return '';
|
}
|
$crumbs = jvbGetCrumbs();
|
|
$out = '<nav id="breadcrumbs">';
|
$out .= '<ol itemscope itemtype="https://schema.org/BreadcrumbList">';
|
|
if (!empty($crumbs)) {
|
$i = 1;
|
foreach ($crumbs as $crumb) {
|
$label = '<span itemprop="name">'.strtolower($crumb['name']).'</span>';
|
if (array_key_exists('icon', $crumb)) {
|
$label = $crumb['icon'].'<span class="screen-reader-text" itemprop="name">'.$crumb['name'].'</span>';
|
}
|
$aOpen = $aClose = '';
|
if ($crumb['url'] !== false) {
|
if (array_key_exists('id', $crumb) && $crumb['id'] === get_queried_object_id()){
|
|
} else {
|
$aOpen = '<a itemprop="item" href="'.$crumb['url'].'" title="'.$crumb['name'].'">';
|
$aClose = '</a>';
|
}
|
}
|
$out .= '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">'.$aOpen.$label.$aClose.'<meta itemprop="position" content="'.$i.'" /></li>';
|
$i++;
|
}
|
}
|
|
$out .= '</ol>';
|
$out .= '</nav>';
|
|
return $out;
|
}
|
|
|
/**
|
* Builds a breadcrumb list of post parents, if available
|
* @param WP_Post $post
|
* @param array $crumbs
|
*
|
* @return array
|
*/
|
function jvbGetBreadcrumbPostHierarchy(WP_Post $post, array $crumbs = []):array
|
{
|
|
array_unshift($crumbs, [
|
'name' => $post->post_title,
|
'url' => get_the_permalink($post->ID),
|
'id' => $post->ID,
|
]);
|
|
if ($post->post_parent !== 0) {
|
$parent = get_post($post->post_parent);
|
if ($parent) {
|
$crumbs = jvbGetBreadcrumbPostHierarchy($parent, $crumbs);
|
}
|
}
|
|
return $crumbs;
|
}
|
|
|
/**
|
* Builds a breadcrumb list of parent terms, if available
|
* @param WP_Term $term
|
* @param array $crumbs
|
*
|
* @return array
|
*/
|
function jvbGetBreadcrumbTermHierarchy(WP_Term $term, array $crumbs=[]):array
|
{
|
$url = get_term_link($term->term_id);
|
array_unshift($crumbs, [
|
'name' => $term->name,
|
'url' => $url,
|
'id' => $term->term_id,
|
]);
|
|
if ($term->parent !== 0) {
|
$parent = get_term($term->parent, $term->taxonomy);
|
if ($parent) {
|
$crumbs = jvbGetBreadcrumbTermHierarchy($parent, $crumbs);
|
}
|
}
|
return $crumbs;
|
}
|
|
function jvbGetDirectoryInfo():array
|
{
|
if (is_post_type_archive(BASE.'directory')) {
|
return [
|
'title' => 'Directory of Directories',
|
'url' => get_post_type_archive_link(BASE.'directory'),
|
'slug' => 'directory',
|
'type' => 'directory'
|
];
|
}
|
if (is_singular(BASE.'directory')) {
|
$type = get_post_meta(get_the_ID(), BASE.'for_type_slug', true);
|
|
return jvbDirectories()[$type]??[];
|
}
|
$obj = get_queried_object();
|
|
$directories = jvbDirectories();
|
if (is_tax()) {
|
$tax = jvbNoBase($obj->taxonomy);
|
return (array_key_exists($tax, $directories)) ? $directories[$tax] : [];
|
}
|
|
$type = jvbNoBase($obj->post_type);
|
return (array_key_exists($type, $directories)) ? $directories[$type] : [];
|
}
|