| | |
| | | namespace JVBase\managers\SEO; |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\DirectoryManager; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\base\Site; |
| | | use WP_Post; |
| | |
| | | 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 = 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 |
| | |
| | | } |
| | | |
| | | |
| | | switch (true) { |
| | | $key = match(true) { |
| | | is_singular() => get_queried_object_id(), |
| | | 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 |
| | | }; |
| | | |
| | | case is_singular(): |
| | | $key = get_queried_object_id(); |
| | | break; |
| | | case is_post_type_archive(): |
| | | $obj = get_queried_object(); |
| | | $key = $obj->name; |
| | | break; |
| | | case is_tax(): |
| | | $obj = get_queried_object(); |
| | | $key = $obj->taxonomy; |
| | | break; |
| | | case is_home(): |
| | | $obj = get_queried_object(); |
| | | $key = $obj->post_type; |
| | | break; |
| | | default: |
| | | $key = 'home'; |
| | | break; |
| | | } |
| | | |
| | | return $this->cache->remember( |
| | | return $cache->remember( |
| | | $key, |
| | | function() { |
| | | $crumbs = $this->buildCrumbs(); |
| | |
| | | ]; |
| | | |
| | | $obj = get_queried_object(); |
| | | if (is_null($obj)) { |
| | | return $crumbs; |
| | | } |
| | | if (is_tax()) { |
| | | $crumbs = $this->addTaxonomyCrumbs($crumbs, $obj); |
| | | } elseif (is_singular() || is_home()) { |
| | |
| | | $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'] |
| | |
| | | |
| | | |
| | | // Add directory if exists |
| | | if ($registrar && $registrar->hasFeature('directory')) { |
| | | $directory = JVB()->directories(); |
| | | if ($directory && !empty($directory->directories($tax))) { |
| | | if ($registrar && $registrar->hasFeature('show_directory')) { |
| | | $directory = DirectoryManager::getInstance(); |
| | | if ($directory && !empty($directory->directories($tax)??[])) { |
| | | $crumbs[] = [ |
| | | 'name' => $directory['title'], |
| | | 'url' => $directory['url'] |
| | | 'name' => $directory->directories($tax)['title'], |
| | | 'url' =>$directory->directories($tax)['url'] |
| | | ]; |
| | | } |
| | | } |
| | |
| | | $crumbConfig = $registrar->getConfig('breadcrumbs'); |
| | | } |
| | | |
| | | if($registrar && $registrar->hasFeature('show_directory')) { |
| | | $directory = JVB()->directories(); |
| | | if ($directory && !empty($directory->directories($content)??[])){ |
| | | $crumbs[] = [ |
| | | 'name' => $directory->directories($content)['title'], |
| | | 'url' =>$directory->directories($content)['url'] |
| | | ]; |
| | | } |
| | | } |
| | | |
| | | // 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'] |
| | | ]; |
| | | } |
| | | |
| | |
| | | |
| | | $registrar = Registrar::getInstance($name); |
| | | |
| | | if($registrar && $registrar->hasFeature('show_directory')) { |
| | | $directory = JVB()->directories(); |
| | | if($registrar && $registrar->hasFeature('show_directory') && DirectoryManager::getInstance()) { |
| | | $directory = DirectoryManager::getInstance(); |
| | | |
| | | if ($directory && !empty($directory->directories($name)??[])){ |
| | | $crumbs[] = [ |
| | | 'name' => $directory->directories($name)['title'], |
| | |
| | | ]; |
| | | } |
| | | } 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) { |
| | |
| | | '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; |
| | |
| | | ]; |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | { |