| | |
| | | <?php |
| | | namespace JVBase\registry; |
| | | |
| | | use JVBase\meta\MetaManager; |
| | | use JVBase\meta\MetaRegistry; |
| | | use JVBase\managers\CacheManager; |
| | | use JVBase\utility\Checker; |
| | | use Exception; |
| | | use WP_Error; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\meta\Registry; |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | |
| | | if ($this->config['is_content'] ?? false) { |
| | | $this->setupContentTaxonomyHooks(); |
| | | } |
| | | $this->registerHooks(); |
| | | } |
| | | |
| | | public function register(): void |
| | |
| | | $post_types = array_map(fn($type) => BASE . $type, $this->config['for_content'] ?? []); |
| | | register_taxonomy($this->taxonomy, $post_types, $args); |
| | | |
| | | $this->maybeAddRewriteRule($args['rewrite']); |
| | | if (!empty($this->fields)) { |
| | | $meta_registry = new MetaRegistry($this->fields, $this->slug, 'term'); |
| | | $meta_registry = new Registry($this->fields, $this->slug, 'term'); |
| | | $meta_registry->registerMetaFields(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Add custom rewrite rule for hierarchical taxonomy slugs (e.g., post-type/by/taxonomy-slug) |
| | | */ |
| | | protected function maybeAddRewriteRule(array $rewrite_config): void |
| | | { |
| | | $slug = $rewrite_config['slug'] ?? $this->slug; |
| | | |
| | | // Only add custom rule if slug contains slashes (hierarchical path) |
| | | if (!str_contains($slug, '/')) { |
| | | return; |
| | | } |
| | | |
| | | add_rewrite_rule( |
| | | "^{$slug}/([^/]+)/?$", |
| | | 'index.php?' . $this->taxonomy . '=$matches[1]', |
| | | 'top' |
| | | ); |
| | | } |
| | | |
| | | private function buildLabels(string $singular, string $plural): array |
| | | { |
| | | return [ |
| | |
| | | // Prepare data for insertion/update |
| | | $data = [ |
| | | 'term_id' => $term_id, |
| | | 'name' => $term->name, |
| | | 'name' => html_entity_decode($term->name), |
| | | 'slug' => $term->slug, |
| | | 'updated_at' => current_time('mysql') |
| | | ]; |
| | | |
| | | // Get meta manager for this term |
| | | $meta = new MetaManager($term_id, 'term'); |
| | | $meta = Meta::forTerm($term_id); |
| | | $values = $meta->getAll(array_keys($custom_fields)); |
| | | |
| | | // Process each custom field |
| | |
| | | { |
| | | return jvbContentTaxonomiesTableFields($this->slug)['fields'] ?? []; |
| | | } |
| | | |
| | | protected function registerHooks():void |
| | | { |
| | | $actions = ['created_term', 'edited_term', 'delete_term']; |
| | | $taxonomy = $this->taxonomy; |
| | | foreach ($actions as $action) { |
| | | add_action($action, function($term_id, $tt_id, $tax) use ($taxonomy, $action) { |
| | | if ($tax !== $taxonomy) return; |
| | | |
| | | $term = get_term($term_id, $tax); |
| | | jvbUpdateCacheTimestamp('term', $term); |
| | | |
| | | // Clear taxonomy cache |
| | | CacheManager::invalidateGroup($taxonomy); |
| | | CacheManager::invalidateGroup('terms'); |
| | | CacheManager::invalidateGroup('termCheck'); |
| | | |
| | | // Clear cache for associated content types |
| | | $checker = Checker::getInstance(); |
| | | $content_types = $checker->getContentForTaxonomy($taxonomy); |
| | | |
| | | foreach ($content_types as $content_type) { |
| | | CacheManager::invalidateGroup($content_type); |
| | | } |
| | | |
| | | do_action("jvb_taxonomy_cache_invalidated_{$taxonomy}", $term, $action); |
| | | }, 10, 3); |
| | | } |
| | | } |
| | | } |