Jake Vanderwerf
4 hours ago 56a9a1ccf764ff7a6af8f8a2292cb07443cb4aa7
inc/registrar/Registrar.php
@@ -48,11 +48,13 @@
   public ?string $rewrite_taxonomy = null;
   public bool $add_image_column = false;
   protected static array $allFlags = [
      //Shared Flags
      'favouritable', 'karma', 'show_feed', 'show_directory', 'approve_new', 'has_responses', 'invitable',
      //Post Flags
      'hide_single', 'redirect_to_author', 'is_calendar', 'single_image', 'is_timeline', 'is_gallery', 'is_faq', 'is_glossary', 'rewrite_taxonomy',
      'hide_single', 'redirect_to_author', 'is_calendar', 'single_image', 'is_timeline', 'is_gallery', 'is_faq', 'is_glossary', 'rewrite_taxonomy', 'add_image_column',
      //Taxonomy Flags
      'is_content', 'is_ownable', 'verify_entry', 'track_changes', 'associate_user_content',
      //User Flags
@@ -140,12 +142,12 @@
   /**
    * @var bool Whether users/content need to request the owner for admission
    */
   protected bool $verify_entry;
   protected bool $verify_entry = false;
   protected ?MakeVerification $verifyEntryHandler = null;
   /**
    * @var bool Whether we should track post movements from term to term (ie. artists in tattoo shops)
    */
   protected bool $track_changes;
   protected bool $track_changes = false;
   protected ?MakeTrackChanges $trackChangesHandler = null;
   /**
@@ -183,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
    */
@@ -686,6 +688,10 @@
         if ($this->registrar) {
            $this->registrar->register();
         }
         if ($this->add_image_column) {
            add_filter("manage_{$this->based}_posts_columns", [$this, 'addImageColumn']);
            add_action("manage_{$this->based}_posts_custom_column", [$this, 'showImageColumn'], 10, 2);
         }
      } elseif ($this->type === 'term') {
         if ($this->is_content) {
            if ($this->verify_entry) {
@@ -744,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'){
@@ -832,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
      {
@@ -847,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
   {
@@ -862,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')
                  );
@@ -889,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()) {
@@ -911,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;
   }
@@ -955,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);
@@ -962,6 +1050,23 @@
   }
   public function getUserSubtype():string|false
   {
      return $this->user_subtype?:false;
      return $this->user_subtype??false;
   }
   public function addImageColumn(array $columns):array
   {
      $keys = array_keys($columns);
      $index = array_search('cb', $keys);
      if ($index !== false) {
         $pos = $index+1;
         $columns = array_slice($columns, 0, $pos, true) + ['jvb_featured_image' => 'Image'] + array_slice($columns, $pos, null, true);
      }
      return $columns;
   }
   public function showImageColumn(string $column, int $postID):void
   {
      if ($column === 'jvb_featured_image') {
         echo get_the_post_thumbnail($postID, 'tiny');
      }
   }
}