| | |
| | | <?php |
| | | /** |
| | | * Breadcrumb Helper Functions |
| | | * |
| | | * These are backwards-compatible wrappers around BreadcrumbManager |
| | | * Use BreadcrumbManager directly for new code |
| | | */ |
| | | |
| | | use JVBase\managers\CacheManager; |
| | | use JVBase\managers\SEO\BreadcrumbManager; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | /** |
| | | * Outputs the breadcrumb list as an array |
| | | * Get breadcrumb array for current page |
| | | * |
| | | * @deprecated Use BreadcrumbManager::getInstance()->getCrumbs() instead |
| | | * @return array |
| | | */ |
| | | function jvbGetCrumbs():array |
| | | function jvbGetCrumbs(): array |
| | | { |
| | | $cache = CacheManager::for('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('house'), |
| | | '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 BreadcrumbManager::getInstance()->getCrumbs(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Build and return breadcrumb navigation HTML |
| | | * |
| | | * @deprecated Use BreadcrumbManager::getInstance()->renderNavigation() instead |
| | | * @return string |
| | | */ |
| | | function jvbBuildBreadcrumbs():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; |
| | | return BreadcrumbManager::getInstance()->renderNavigation(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Builds a breadcrumb list of post parents, if available |
| | | * Build post hierarchy for breadcrumbs |
| | | * |
| | | * @deprecated Use BreadcrumbManager directly - this is now a private method |
| | | * @param WP_Post $post |
| | | * @param array $crumbs |
| | | * |
| | | * @return array |
| | | */ |
| | | function jvbGetBreadcrumbPostHierarchy(WP_Post $post, array $crumbs = []):array |
| | | function jvbGetBreadcrumbPostHierarchy(WP_Post $post, array $crumbs = []): array |
| | | { |
| | | // This functionality is now private in BreadcrumbManager |
| | | // If you need this, use the full getCrumbs() method instead |
| | | trigger_error('jvbGetBreadcrumbPostHierarchy is deprecated. Use BreadcrumbManager::getInstance()->getCrumbs()', E_USER_DEPRECATED); |
| | | |
| | | array_unshift($crumbs, [ |
| | | 'name' => $post->post_title, |
| | | 'url' => get_the_permalink($post->ID), |
| | | 'id' => $post->ID, |
| | | ]); |
| | | 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); |
| | | } |
| | | } |
| | | if ($post->post_parent !== 0) { |
| | | $parent = get_post($post->post_parent); |
| | | if ($parent) { |
| | | $crumbs = jvbGetBreadcrumbPostHierarchy($parent, $crumbs); |
| | | } |
| | | } |
| | | |
| | | return $crumbs; |
| | | return $crumbs; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Builds a breadcrumb list of parent terms, if available |
| | | * Build term hierarchy for breadcrumbs |
| | | * |
| | | * @deprecated Use BreadcrumbManager directly - this is now a private method |
| | | * @param WP_Term $term |
| | | * @param array $crumbs |
| | | * @return array |
| | | */ |
| | | function jvbGetBreadcrumbTermHierarchy(WP_Term $term, array $crumbs = []): array |
| | | { |
| | | // This functionality is now private in BreadcrumbManager |
| | | trigger_error('jvbGetBreadcrumbTermHierarchy is deprecated. Use BreadcrumbManager::getInstance()->getCrumbs()', E_USER_DEPRECATED); |
| | | |
| | | $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 && !is_wp_error($parent)) { |
| | | $crumbs = jvbGetBreadcrumbTermHierarchy($parent, $crumbs); |
| | | } |
| | | } |
| | | |
| | | return $crumbs; |
| | | } |
| | | |
| | | /** |
| | | * Get directory info (kept for now as it's not breadcrumb-specific) |
| | | * |
| | | * @return array |
| | | */ |
| | | function jvbGetBreadcrumbTermHierarchy(WP_Term $term, array $crumbs=[]):array |
| | | function jvbGetDirectoryInfo(): array |
| | | { |
| | | $url = get_term_link($term->term_id); |
| | | array_unshift($crumbs, [ |
| | | 'name' => $term->name, |
| | | 'url' => $url, |
| | | 'id' => $term->term_id, |
| | | ]); |
| | | 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 ($term->parent !== 0) { |
| | | $parent = get_term($term->parent, $term->taxonomy); |
| | | if ($parent) { |
| | | $crumbs = jvbGetBreadcrumbTermHierarchy($parent, $crumbs); |
| | | } |
| | | } |
| | | return $crumbs; |
| | | } |
| | | if (is_singular(BASE.'directory')) { |
| | | $type = get_post_meta(get_the_ID(), BASE.'for_type_slug', true); |
| | | return JVB()->directories()?->getDirectoryList()[$type] ?? []; |
| | | } |
| | | |
| | | 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); |
| | | $obj = get_queried_object(); |
| | | $directories = JVB()->directories()?->directories(); |
| | | if (is_tax()) { |
| | | $tax = jvbNoBase($obj->taxonomy); |
| | | return array_key_exists($tax, $directories) ? $directories[$tax] : []; |
| | | } |
| | | |
| | | 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] : []; |
| | | $type = jvbNoBase($obj->post_type); |
| | | return array_key_exists($type, $directories) ? $directories[$type] : []; |
| | | } |