Jake Vanderwerf
2026-08-30 87237f15618e2320967b9380c360b89f7323d2e9
inc/managers/DirectoryManager.php
@@ -5,6 +5,8 @@
   exit;
}
use JVBase\Instance;
use JVBase\integrations\services\Umami;
use JVBase\registrar\Registrar;
use JVBase\base\Site;
use WP_Block;
@@ -12,6 +14,7 @@
class DirectoryManager
{
   use Instance;
    protected array $directories;
    protected array $directoryPageIDs;
   protected array $directoryList;
@@ -20,7 +23,7 @@
    protected static string $slug = BASE.'for_type_slug';
    protected Cache $cache;
    public function __construct($perPage = 100)
    private function __construct($perPage = 100)
    {
      $this->directories = $this->getDirectories();
        if (empty($this->directories)) {
@@ -28,19 +31,22 @@
        }
      $this->perPage = $perPage;
        $this->cache = Cache::for('directory', WEEK_IN_SECONDS);
      $this->cache->connect('post', true)
         ->connect('taxonomy', true)
         ->connect('user', true);
      if (JVB_TESTING) {
         $this->cache->flush();
      }
      jvb_register_do_once('buildDirectories', [$this, 'activate']);
      add_action('init', [$this, 'registerDirectories']);
        add_filter('render_block', [$this, 'renderBlock'], 998, 3);
        add_filter('pre_render_block', [$this, 'renderBlock'], 20, 3);
      add_action('save_post', [$this, 'flushCache']);
      add_action('edit_terms', [$this, 'flushCache']);
    }
   public function flushPostCache(int $postID):void
   {
      //TODO: We can probably use a bit more finesse here.
      $this->cache->flush();
   }
    public function registerDirectories():void
    {
@@ -90,21 +96,21 @@
         $directories = [];
         //content
         $content = Registrar::getFeatured('show_directory', 'post');
         $content = Registrar::withFeature('show_directory', 'post');
         if(!empty($content)) {
            foreach ($content as $key) {
               $directories[$key] = 'content';
            }
         }
         $taxonomies = Registrar::getFeatured('show_directory', 'term');
         $taxonomies = Registrar::withFeature('show_directory', 'term');
         if(!empty($taxonomies)) {
            foreach ($taxonomies as $key) {
               $directories[$key] = 'taxonomy';
            }
         }
         $users = Registrar::getFeatured('show_directory', 'user');
         $users = Registrar::withFeature('show_directory', 'user');
         if(!empty($users)) {
            foreach ($users as $key) {
               $directories[$key] = 'user';
@@ -325,7 +331,7 @@
        string $name = '',
        string $url = '',
        string $ID = '',
        $extra = false
        ?array $extra = null
    ):array {
        if ($name == '') {
            $name = get_the_title();
@@ -438,12 +444,20 @@
   return $this->cache->remember(
      $cacheKey,
      function() use ($slug, $type, $registrar, $config, $paged) {
         $out = '<h1>' . $this->directoryTitle($registrar) . '</h1>';
         $out = '<h1>' . $config['title'] . '</h1>';
         $out .= '<div class="description">';
         foreach ($config['description'] ?? [] as $p) {
            $out .= '<p>' . $p . '</p>';
         }
         $out .= '</div>';
         $link = match($registrar->getType()) {
            'post'   => get_post_type_archive_link($registrar->getBased()),
            'term'   => false,
            'user'   => get_post_type_archive_link($registrar->getProfile()->getBased()),
            default => false,
         };
         $out .= $link ? '<ul class="buttons"><li><a href="'.$link.'">See All</a></li></ul>' : '';
         $out .= $this->renderIndex($slug);
         $list = [];
@@ -466,7 +480,7 @@
               $get = new WP_Query($args);
                  $hasExtra = $registrar->hasFeature('directory_extra');
                  $hasExtra = !empty($config['directory_extra']??[]);
                  if ($get->have_posts()) {
                     while ( $get->have_posts() ) {
                        $get->the_post();
@@ -665,7 +679,7 @@
    public function renderLettersList(array $list, string $type):string
    {
        $umami = JVB()->connect('umami');
        $umami = Umami::getInstance();
        $out = '<ul class="list-none">';
        foreach ($list as $letter => $items) {
@@ -673,12 +687,13 @@
            foreach ($items as $item) {
                $extra = '';
                if (!empty($item['extra'])) {
                    $extra = '<span>';
                    $extra = '<ul class="term-list row">';
                    foreach ($item['extra'] as $ext) {
                  $icon = Registrar::getInstance($ext['type'])->getIcon();
                        $umamiType = ($ext['type'] === BASE.'shop') ? 'click_shop' : 'click_taxonomy';
                        $extra .= '<a href="'.$ext['url'].'"'.$umami->trackContentClick($item['id'],$umamiType, ['source_type' => 'directory']).'>'.$ext['name'].'</a>';
                        $extra .= '<li><a href="'.$ext['url'].'"'.$umami->trackContentClick($item['id'],$umamiType, ['source_type' => 'directory']).'>'.jvbIcon($icon).$ext['name'].'</a></li>';
                    }
                    $extra .= '</span>';
                    $extra .= '</ul>';
                }
            $item_html = apply_filters('jvb_directory_render_item', '', $item, $type, $extra);
@@ -698,7 +713,7 @@
        return $out;
    }
    public function renderBlock(string $content, array $block, WP_Block $instance)
    public function renderBlock(?string $content, array $block, ?WP_Block $instance)
    {
        if (!is_post_type_archive(BASE.'directory') && !is_singular(BASE.'directory')) {
            return $content;
@@ -707,7 +722,6 @@
            return $content;
        }
      error_log('Still working on directory manager...');
        // For archive page
        if (is_post_type_archive(BASE.'directory') && $block['blockName'] === 'core/group') {
            return ($block['attrs']['tagName']??'' === 'main') ? '<main>'.$this->renderArchive().'</main>' : $content;