Jake Vanderwerf
2 days ago 235ce5716edc2f7cbe80fdccf26eac7269587839
inc/managers/DirectoryManager.php
@@ -6,6 +6,7 @@
}
use JVBase\registrar\Registrar;
use JVBase\base\Site;
use WP_Block;
use WP_Query;
@@ -37,14 +38,14 @@
      jvb_register_do_once('buildDirectories', [$this, 'activate']);
      add_action('init', [$this, 'registerDirectories']);
        add_action('render_block', [$this, 'renderBlock'], 99999, 3);
        add_filter('pre_render_block', [$this, 'renderBlock'], 20, 3);
    }
    public function registerDirectories():void
    {
      $singular = (array_key_exists('directory_label', JVB_SITE)) ? JVB_SITE['directory_label'][0] : 'Directory';
      $plural = (array_key_exists('directory_label', JVB_SITE)) ? JVB_SITE['directory_label'][1] : 'Directories';
      $singular = Site::getDirectorySingular()??'Directory';
      $plural = Site::getDirectoryPlural()??'Directories';
      $config = [
         'labels' => [
            'name'               => $plural,
@@ -84,25 +85,26 @@
   public function getDirectories():array
   {
      $directories = get_option(BASE.'directories');
      if (!$directories) {
         $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';
@@ -130,15 +132,36 @@
         }
         $config = $registrar->getConfig('directory');
         $title = $config['title'];
         //Bail early if we've already created the page
         $existing = new WP_Query([
            'post_type' => BASE.'directory',
            'name'   => sanitize_title($title),
            'posts_per_page'  => 1,
         ]);
         if ($existing->have_posts()) {
            $existing = $existing->posts[0];
            $created[$directory] = $existing->ID;
            $directories[$directory] = [
               'slug'   => $existing->post_name,
               'title'  => $existing->post_title,
               'ID'  => $existing->ID,
               'url' => get_the_permalink($existing->ID),
               'page'   => $existing->post_title,
               'description'=> $existing->post_excerpt,
               'type'   => $type,
               'extra'  => $config[$directory]['directory_extra']??[],
            ];
            continue;
         }
         $excerpt = implode(' ', $config['description']??[]);
         $ID = wp_insert_post([
            'post_type'    => BASE.'directory',
            'post_title'   => $title,
            'post_status'  => 'publish',
            'post_excerpt' => $excerpt,
            'slug'         => sanitize_title($title)
            'post_name'       => sanitize_title($title)
         ]);
         if (!is_wp_error($ID)) {
            add_post_meta($ID, self::$type, $type);
@@ -186,7 +209,7 @@
         }
      }
//        if (Features::forSite()->has('has_map')) {
//        if (Site::has('has_map')) {
//            $ID = wp_insert_post([
//                'post_type'     => BASE.'directory',
//                'post_title'    => 'Map',
@@ -206,7 +229,6 @@
//                ];
//            }
//        }
        if (!empty($created)) {
            update_option(BASE.'directory_ids', $created);
        }
@@ -218,6 +240,7 @@
   protected function buildDirectoryList():array
   {
      $saved = get_option(BASE.'directory_list', []);
      if (empty($saved)) {
         $all = new WP_Query([
            'post_type' => BASE.'directory',
@@ -302,7 +325,7 @@
        string $name = '',
        string $url = '',
        string $ID = '',
        $extra = false
        ?array $extra = null
    ):array {
        if ($name == '') {
            $name = get_the_title();
@@ -351,7 +374,7 @@
               $config = Registrar::getInstance($slug);
               $aOpen = '<a href="'.$directory['url'].'" title="See our list of '.$directory['title'].'">';
               $aClose = '</a>';
               $cache .= '<li class="directory col start">
               $cache .= '<li class="directory col left">
                  '. $aOpen.jvbIcon($config->getIcon() !== '' ? $config->getIcon() :'list-dashes').$directory['title'].$aClose;
               if (!empty($directory['description'])) {
                  $cache .= '<div class="description">';
@@ -390,7 +413,7 @@
      );
        if ($current !== '' && array_key_exists($current, $this->directories())) {
            $open = ($open) ? ' open' : '';
            $cache = '<details'.$open.'><summary class="row btw">Other '.$this->referAs(true).':</summary>'.
            $cache = '<details'.$open.'><summary class="row x-btw">Other '.$this->referAs(true).':</summary>'.
                     str_replace('id="'.$current.'"', 'id="'.$current.'" class="current"', $cache)
                     .'</details>';
        }
@@ -415,12 +438,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 = [];
@@ -443,7 +474,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();
@@ -591,7 +622,7 @@
         $children =$this->renderListChunk($taxonomy, $term->term_id);
         $out .= '<li>';
         if ($children !== '') {
            $out .= '<details class="term"><summary class="row btw"><a href="'.get_term_link($term->term_id, $term->taxonomy).'" title="See more '.html_entity_decode($term->name).'">'.$term->name.'</a></summary>';
            $out .= '<details class="term"><summary class="row x-btw"><a href="'.get_term_link($term->term_id, $term->taxonomy).'" title="See more '.html_entity_decode($term->name).'">'.$term->name.'</a></summary>';
            $out .= $children;
            $out .= '</details>';
         } else {
@@ -646,22 +677,23 @@
        $out = '<ul class="list-none">';
        foreach ($list as $letter => $items) {
            $out .= '<li id="starts-with-'.$letter.'" class="row a-start btw nowrap"><h3>'.strtoupper($letter).'</h3><ul>';
            $out .= '<li id="starts-with-'.$letter.'" class="row top x-btw nowrap"><h3>'.strtoupper($letter).'</h3><ul>';
            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);
            if (empty($item_html)) {
               $item_html = '<li class="row btw">
               $item_html = '<li class="row x-btw">
                    <a href="'.$item['url'].'" title="More about '.$item['name'].'">
                        '.$item['name'].'</a>'.$extra.'
                </li>';
@@ -675,7 +707,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;
@@ -710,10 +742,7 @@
   public function referAs($plural = false):string
   {
      if (!empty(JVB_SITE) && array_key_exists('directory_label', JVB_SITE)) {
         return ($plural) ? JVB_SITE['directory_label'][1] : JVB_SITE['directory_label'][0];
      }
      return ($plural) ? 'Directories' : 'Directory';
      return ($plural) ? Site::getDirectoryPlural()??'Directories' : Site::getDirectorySingular()??'Directory';
   }
   /*****************************************************