directories = $this->getDirectories(); if (empty($this->directories)) { return; } $this->cache = CacheManager::for('directory', WEEK_IN_SECONDS); foreach(['content','taxonomy','user'] as $key) { if (array_key_exists($key, $this->directories)) { $this->cache->connectTo($key); } } add_action('init', [$this, 'registerDirectories']); jvb_register_do_once('directories_registered', [$this, 'activate']); add_action('render_block', [$this, 'renderBlock'], 99999, 3); } public function registerDirectories() { $plural = 'Directories'; $singular = 'Directory'; register_post_type(BASE.'directory', array( 'labels' => [ 'name' => $plural, 'singular_name' => $singular, 'menu_name' => $plural, 'add_new' => "Add New {$singular}", 'add_new_item' => "Add New {$singular}", 'edit_item' => "Edit {$singular}", 'new_item' => "New {$singular}", 'view_item' => "View {$singular}", 'search_items' => "Search {$plural}", 'not_found' => "No {$plural} found", 'not_found_in_trash' => "No {$plural} found in Trash" ], 'menu_icon' => jvbCSSIcon('sort-ascending'), 'public' => true, 'publicly_queryable' => true, 'show_in_menu' => true, 'show_in_admin_bar' => false, 'has_archive' => true, 'rewrite' => array( 'slug' => 'directory', 'with_front' => false ), 'capability_type' => 'post', 'supports' => array('title', 'editor', 'content', 'excerpt', 'custom-fields') )); } public function getDirectories():array { $directories = get_option(BASE.'directories'); if (!$directories) { $directories = []; //content if(Features::anyContentHas('show_directory')) { foreach (JVB_CONTENT as $key => $config) { if (Features::forContent($key)->has('show_directory')) { $directories[$key] = 'content'; } } } if(Features::anyTaxonomyHas('show_directory')) { foreach (JVB_TAXONOMY as $key=>$config) { if (Features::forTaxonomy($key)->has('show_directory')) { $directories[$key] = 'taxonomy'; } } } if (Features::anyUserHas('show_directory')) { foreach(JVB_USER as $key=>$config) { if (Features::forUser($key)->has('show_directory')) { $directories[$key] = 'user'; } } } update_option(BASE.'directories', $directories); } return $directories; } protected function getConfigFromType(string $type):array { if (!array_key_exists($type, $this->directories)) { return []; } return match ($this->directories[$type]) { 'content' => JVB_CONTENT[$type], 'taxonomy' => JVB_TAXONOMY[$type], 'user' => JVB_USER[$type], default => [], }; } public function activate() { $created = []; $directories = []; foreach($this->directories as $directory => $type) { $config = $this->getConfigFromType($directory); $title = $config['directory']??$config['plural']; $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) ]); if (!is_wp_error($ID)) { add_post_meta($ID, self::$type, $type); add_post_meta($ID, self::$slug, $directory); $created[$directory] = (int)$ID; $slug = sanitize_title($title); $directories[$directory] = [ 'slug' => $slug, 'title' => $title, 'ID' => $ID, 'url' => get_home_url(null, '/directory/'.$slug), 'page' => $title, 'description' =>$config[$directory]['description']??[], 'type' => $type, 'extra' => $config[$directory]['directory_extra'] ??[], ]; } $isGrouped = match ($type) { 'content' => Features::forContent($directory)->has('isGrouped'), 'taxonomy' => Features::forTaxonomy($directory)->has('isGrouped'), 'user' => Features::forUser($directory)->has('isGrouped'), default => false, }; if ($isGrouped) { $title = $title.', but Grouped'; $slug = sanitize_title($title).'-grouped'; $excerpt = $config['groupedDescription']??'Too many options? This is grouped by type.'; $ID = wp_insert_post([ 'post_type' => BASE.'directory', 'post_title' => $title, 'post_status' => 'publish', 'post_excerpt' => $excerpt, 'slug' => $slug, ]); if (!is_wp_error($ID)) { add_post_meta($ID, self::$type, $type); add_post_meta($ID, self::$slug, $directory.'-grouped'); add_post_meta($ID, BASE.'grouped_directory', 'yup'); $created[$directory.'-grouped'] = (int)$ID; $directories[$directory.'-grouped'] = [ 'slug' => $slug, 'title' => $title, 'ID' => $ID, 'url' => get_home_url(null, '/directory/'.$slug), 'page' => $title, 'description' =>$config[$directory]['description']??[], 'type' => $type, 'extra' => $config[$directory]['directory_extra'] ??[], ]; } } } if (Features::forSite()->has('has_map')) { $ID = wp_insert_post([ 'post_type' => BASE.'directory', 'post_title' => 'Map', 'post_status'=> 'publish', 'slug' => 'map', ]); if (!is_wp_error($ID)) { add_post_meta($ID, self::$type, 'map'); $created['map'] = (int)$ID; $directories['map'] = [ 'slug' => 'map', 'title' => 'Map', 'ID' => $ID, 'url' => get_home_url(null, '/directory/map'), 'page' => 'Map', 'type' => 'term', ]; } } if (!empty($created)) { update_option(BASE.'directory_ids', $created); } if (!empty($directories)) { update_option(BASE.'directory_list', $directories); } } public function getDirectoryPageIDs():array { if (empty($this->directoryPageIDs)) { $this->directoryPageIDs = get_option(BASE.'directory_ids', []); } return $this->directoryPageIDs; } public function getDirectoryList():array { if (empty($this->directoryList)) { $this->directoryList = get_option(BASE.'directory_list', []); } return $this->directoryList; } public static function getConfig(int $ID):array { $type = get_post_meta($ID, self::$type, true); $slug = get_post_meta($ID, self::$slug, true); return match ($type) { 'content' => JVB_CONTENT[$slug], 'taxonomy' => JVB_TAXONOMY[$slug], 'user' => JVB_USER[$slug], default => [], }; } public function letters():array { return [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' ]; } public function alphabetizeMe( array $list, string $name = '', string $url = '', string $ID = '', $extra = false ):array { if ($name == '') { $name = get_the_title(); } if ($url == '') { $url = get_the_permalink(); } if ($ID == '') { $ID = get_the_ID(); } $first = strtolower(mb_substr($name, 0, 1)); $list[$first][] = array( 'name' => $name, 'url' => $url, 'id' => $ID, 'extra' => $extra, ); return $list; } public function directories(string $search = 'all'):array { $directories = $this->getDirectories(); if ($search === 'all') { return $directories; } return $directories[$search]??[]; } public function isDirectory():bool { return (is_post_type_archive(BASE.'directory') || is_singular(BASE.'directory')); } private function renderArchive(): string { $this->getDirectoryList(); return $this->cache->remember( 'archive', function() { $cache = '
You like lists? We\'ve got \'em!
'.$description.'
'; } $cache .= ''.$p.'
'; } $out .= 'We don\'t have anything here yet.
'; } else { $out .= $this->renderLettersIndex($list); $out .= $this->renderLettersList($list, $slug); } $out .= ''.$p.'
'; } $out .= 'We don\'t have anything here yet.
'; } $out .= $this->renderIndex($slug, true); return $out; } ); } protected function renderListChunk(string $taxonomy, int $parent):string { $get = get_terms([ 'taxonomy' => jvbCheckBase(str_replace('-grouped', '', $taxonomy)), 'hide_empty' => true, 'orderby' => 'name', 'order' => 'ASC', 'parent' => $parent ]); if (!$get || is_wp_error($get)) { return ''; } $out = '