Jake Vanderwerf
2026-01-01 3acb42faee66868a76e653a34ef35de13ddf734f
inc/helpers/breadcrumbs.php
@@ -1,225 +1,127 @@
<?php
/**
 * Breadcrumb Helper Functions
 *
 * These are backwards-compatible wrappers around BreadcrumbManager
 * Use BreadcrumbManager directly for new code
 */
use JVBase\managers\CacheManager;
use JVBase\utility\Features;
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)->connectTo('all');
    $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()) {
      $tax = jvbNoBase($obj->taxonomy);
      $config = Features::getConfig($tax, 'term');
      if (count($config['for_content']) === 1) {
         $contentConfig = JVB_CONTENT[$config['for_content'][0]];
         $crumbs[] = [
            'name'   => $contentConfig['breadcrumb']??$contentConfig['plural'],
            'url' => get_post_type_archive_link(jvbCheckBase($config['for_content'][0])),
         ];
         $crumbs[] = [
            'name'   => 'By '.$config['singular'],
            'url' => false,
         ];
      }
      if (Features::forTaxonomy($tax)->has('directory')){
         $directory = jvbDirectories($tax);
         $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] : [];
}