Jake Vanderwerf
3 hours ago 56a9a1ccf764ff7a6af8f8a2292cb07443cb4aa7
inc/registrar/Registrar.php
@@ -185,7 +185,7 @@
   /**
    * @var array|string
    */
   protected array|string $can_create = [];
   protected array $can_create = [];
   /**
    * @var array slugs of other user roles this role can manage
    */
@@ -750,19 +750,22 @@
      }, static::$instances);
   }
   public function getCreatable():array
   public function getCreatable(bool $based = false):array
   {
      if ($this->type !== 'user') {
         return [];
      }
      return $this->can_create;
      return $based ? array_map(function ($item) { return jvbCheckBase($item); },$this->can_create) : $this->can_create;
   }
   public function setCreatable(string|array $creatable):self
   {
      $this->can_create = $creatable;
      $this->can_create = is_string($creatable) ? [jvbNoBase($creatable)] : array_map(function ($type) {
            return jvbNoBase($type);
        }, $creatable);
      return $this;
   }
   public function getManageOthers():array
   {
      if ($this->type !== 'user'){
@@ -838,8 +841,8 @@
   }
      public function addTermCreatedMeta(int $termId):void
      {
         $meta = Meta::forTerm($termId);
         $meta->set('date_published', date('Y-m-d H:i:s'));
            update_term_meta($termId, BASE . 'date_published', date('Y-m-d H:i:s'));
            update_term_meta($termId, BASE . 'date_modified', date('Y-m-d H:i:s'));
      }
      public function handleContentTermMetaChange(int $meta_id, int $term_id, string $meta_key, $meta_value):void
      {
@@ -853,8 +856,14 @@
      }
      public function addTermUpdatedMeta(int $termId):void
      {
         $meta = Meta::forTerm($termId);
         $meta->set('date_modified', date('Y-m-d H:i:s'));
            static $processing = [];
            if (isset($processing[$termId])) return;
            $processing[$termId] = true;
            update_term_meta($termId, BASE . 'date_modified', date('Y-m-d H:i:s'));
            unset($processing[$termId]);
      }
   public function renderContent(string $content, array $block):string
   {
@@ -868,24 +877,75 @@
         Cache::for($this->slug)->flush();
      }
      $out = Cache::for($this->slug)->remember(
         get_the_ID(),
         function() {
        $per_page = 10;
        $page = $_GET['tp']??1;
            $items = get_terms([
               'taxonomy'  => jvbCheckBase($this->slug),
        $args = apply_filters('jvb_content_tax_args_'.$this->slug, [
            'taxonomy'  => $this->based,
//                'hide_empty' => true,
               'fields' => 'ids',
            ]);
            'fields' => 'ids',
            'number'     => $per_page,
            'offset'    => ($page - 1) * $per_page,
            'meta_key'  => BASE.'date_modified',
            'meta_type' => 'DATETIME',
            'orderby'   => 'meta_value'
        ]);
        $cache = Cache::for($this->slug);
        $max = get_terms([
            'taxonomy'  => $this->based,
            'fields'    => 'ids',
            'number'     => 0,
            'hide_empty'    => true
        ]);
        $max = count($max??[]);
        $totalPages = floor($max/$per_page);
        global $wp;
        $current = get_home_url(null, '/'.$wp->request);
        $pages = '';
        for ($i = 1; $i<=$totalPages; $i++) {
            $pages .= (int)$page === $i ?
                sprintf(
                    '<li class="current">%s</li>',
                    $i
                ): sprintf(
                '<li><a href="%s">%s</a></li>',
                add_query_arg('tp', $i, $current),
                $i
            );
        }
        $nav = sprintf(
            '<nav class="pagination">%s<ul>%s</ul>%s</nav>',
            $page > 1 ? '<a href="'.add_query_arg('tp', $page-1, $current).'" title="Next Page" class="btn">'.jvbIcon('arrow-circle-left').'<span class="screen-reader-text">Previous Page</span></a>' : '',
            $pages,
            $page < $totalPages ? '<a href="'.add_query_arg('tp', $page+1, $current).'" title="Next Page" class="btn">'.jvbIcon('arrow-circle-right').'<span class="screen-reader-text">Next Page</span></a>' : '',
        );
      $out = $nav. Cache::for($this->slug)->remember(
         $cache->generateKey(['type' =>'contentArchive', ... $args]),
         function() use ($args) {
            $items = get_terms($args);
            $out = [];
                $method = BASE.'render_'.$this->slug.'_content';
            if ($items && !is_wp_error($items)) {
               foreach ($items as $item) {
                  $meta = Meta::forTerm($item);
               foreach ($items as $termID) {
                        if (function_exists($method)) {
                            $out[] = $method($termID);
                            continue;
                        }
                  $meta = Meta::forTerm($termID);
                  $slug = sanitize_title($meta->get('name'));
                  $item = sprintf(
                     '<li id="%s"><h2><a href="%s">%s</a></h2><p>%s</p><ul class="item-grid">',
                     '<li id="%s"><h2><a href="%s">%s</a></h2><p>%s</p><ul class="loop scroll">',
                     $slug,
                     get_term_link($item, jvbCheckBase($this->slug))??'',
                     get_term_link($termID, $this->based)??'',
                     $meta->get('name'),
                     $meta->get('description')
                  );
@@ -895,6 +955,12 @@
                        'post_status'  => 'publish',
                        'posts_per_page'  => 3,
                        'fields' => 'ids',
                                'tax_query' => [
                                    [
                                        'taxonomy'  => $this->based,
                                        'terms'     => $termID
                                    ]
                                ]
                     ]);
                     if ($posts->have_posts()) {
                        while($posts->have_posts()) {
@@ -917,9 +983,13 @@
                  $out[] = $item;
               }
            }
            return empty($out) ? '' : '<ul class="content-term-list">'.implode('',$out).'</ul>';
                $before = apply_filters(BASE.'before_'.$this->slug.'_content','');
                $out = empty($out) ? '' : '<ul class="content-term-list">'.implode('',$out).'</ul>';
                $after = apply_filters(BASE.'after_'.$this->slug.'_content', '');
                return $before.$out.$after;
         }
      );
      ).$nav;
      error_log('Built the '.$this->slug.' page content.');
      return $content . $out;
   }
@@ -961,6 +1031,18 @@
      return self::getInstance($this->profile);
   }
    public static function getProfileTypes():array
    {
        $hasProfiles = self::getFeatured('profile_link');
        if (empty($hasProfiles)) {
            return [];
        }
        return array_filter(array_map(function($profile) {
            $instance = self::getInstance($profile);
            return $instance->getProfile()->based??false;
        }, $hasProfiles));
    }
   public function setUserSubtype(string $type):self
   {
      $this->user_subtype = sanitize_text_field($type);