Jake Vanderwerf
2026-08-25 3d25ad7de4fdbb3eba2cde2a62422e6be5d79a0a
inc/managers/SEO/BreadcrumbManager.php
@@ -2,6 +2,7 @@
namespace JVBase\managers\SEO;
use JVBase\managers\Cache;
use JVBase\managers\DirectoryManager;
use JVBase\registrar\Registrar;
use JVBase\base\Site;
use WP_Post;
@@ -20,15 +21,17 @@
class BreadcrumbManager
{
   private Cache $cache;
   private Cache $termCache;
   private Cache $postCache;
   private Cache $userCache;
   private static ?self $instance = null;
   private function __construct()
   {
      $this->cache = Cache::for('breadcrumbs', MONTH_IN_SECONDS)->connect('post')->connect('taxonomy')->connect('user');
      if (JVB_TESTING) {
         $this->cache->flush();
      }
      $this->cache->flush();
      $this->cache = Cache::for('breadcrumbs');
      $this->termCache = Cache::for('breadcrumbs_tax', 'term');
      $this->postCache = Cache::for('breadcrumbs_post', 'post');
      $this->userCache = Cache::for('breadcrumbs_user', 'user');
   }
   public static function getInstance(): self
@@ -53,12 +56,18 @@
      $key = match(true) {
         is_singular() => get_queried_object_id(),
         is_tax() => get_queried_object()->taxonomy,
         is_tax() => get_queried_object()->term_id,
         is_post_type_archive() => get_queried_object()->name,
         default => 'home'
      };
      $cache = match(true) {
         is_singular()  => $this->postCache,
         is_tax()    => $this->termCache,
         is_author()    => $this->userCache,
         default        => $this->cache
      };
      return $this->cache->remember(
      return $cache->remember(
         $key,
         function() {
            $crumbs = $this->buildCrumbs();
@@ -111,9 +120,9 @@
            $content = is_array($registrar->registrar->for) ? $registrar->registrar->for[0] : $registrar->registrar->for;
            $contentRegistrar = Registrar::getInstance($content);
            if($contentRegistrar && $contentRegistrar->hasFeature('show_directory')) {
               $directory = JVB()->directories();
               if ($directory && !empty($directory->directories($content)??[])){
            if(Site::has('is_directory') && $contentRegistrar && $contentRegistrar->hasFeature('show_directory')) {
               $directory = DirectoryManager::getInstance();
               if (!empty($directory->directories($content)??[])){
                  $crumbs[] = [
                     'name'   => $directory->directories($content)['title'],
                     'url' =>$directory->directories($content)['url']
@@ -135,7 +144,7 @@
      // Add directory if exists
      if ($registrar && $registrar->hasFeature('show_directory')) {
         $directory = JVB()->directories();
         $directory = DirectoryManager::getInstance();
         if ($directory && !empty($directory->directories($tax)??[])) {
            $crumbs[] = [
               'name'   => $directory->directories($tax)['title'],
@@ -162,14 +171,14 @@
      }
      // Handle directory posts specially
      if (JVB()->directories() && JVB()->directories()->isDirectory()) {
      if (Site::has('is_directory') && DirectoryManager::getInstance()->isDirectory()) {
         $pos = jvbGetDirectoryInfo();
         if (!empty($pos)) {
            // Special case for map
            if ($pos['title'] == 'Map') {
               $crumbs[] = [
                  'name' => 'Tattoo Shops',
                  'url'  => JVB()->directories()->directories(BASE.'shop')['url']
                  'url'  => DirectoryManager::getInstance()->directories(BASE.'shop')['url']
               ];
            }
@@ -203,8 +212,8 @@
      $registrar = Registrar::getInstance($name);
      if($registrar && $registrar->hasFeature('show_directory') && JVB()->directories()) {
         $directory = JVB()->directories();
      if($registrar && $registrar->hasFeature('show_directory') && DirectoryManager::getInstance()) {
         $directory = DirectoryManager::getInstance();
         if ($directory && !empty($directory->directories($name)??[])){
            $crumbs[] = [
@@ -215,7 +224,7 @@
      } elseif (Site::has('is_directory') && $name === 'directory') {
         $crumbs[] = [
            'name'   => JVB()->directories()->referAs(true),
            'name'   => DirectoryManager::getInstance()->referAs(true),
            'url' => get_post_type_archive_link($type)
         ];
      } elseif ($registrar) {
@@ -224,11 +233,22 @@
            'url' => get_post_type_archive_link($type)
         ];
      } else {
         $postTypeObject = get_post_type_object($type);
         $crumbs[] = [
            'name'   => $postTypeObject->label,
            'url' => get_post_type_archive_link($type)
         ];
         if (function_exists('is_shop') && is_shop()) {
            $ID = get_option( 'woocommerce_shop_page_id' );
            $crumbs[] = [
               'name'   => get_the_title($ID),
               'url' => get_the_permalink($ID)
            ];
         } else {
            $postTypeObject = get_post_type_object($type);
            $crumbs[] = [
               'name'   => $postTypeObject->label,
               'url' => get_post_type_archive_link($type)
            ];
         }
      }
      return $crumbs;
@@ -371,17 +391,6 @@
      ];
   }
   /**
    * Invalidate breadcrumb cache for specific object
    */
   public function invalidateCache(?int $objectId = null): void
   {
      if ($objectId) {
         $this->cache->forget($objectId);
      } else {
         $this->cache->flush();
      }
   }
   public function addTaxToCrumbs(array $crumbs, string|array $taxonomy):array
   {