| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\JVB; |
| | | use JVBase\managers\CacheManager; |
| | | use WP_Post; |
| | | use WP_Error; |
| | | use Exception; |
| | |
| | | class UserTermsManager |
| | | { |
| | | private string $table_name; |
| | | private CacheManager $cache; |
| | | private Cache $cache; |
| | | private string $cacheGroup = 'user_terms_'; |
| | | private int $ttl = DAY_IN_SECONDS; // 1 day default |
| | | protected \wpdb $wpdb; |
| | |
| | | */ |
| | | public function clearUserCache(int $user_id, string|null $taxonomy = null):void |
| | | { |
| | | $cache = CacheManager::for($user_id.'_term_relationships'); |
| | | if ($taxonomy) { |
| | | $cache->delete(jvbNoBase($taxonomy)); |
| | | } else { |
| | | $cache->invalidate(); |
| | | } |
| | | $cache = Cache::for($user_id.'_term_relationships', DAY_IN_SECONDS)->connect('post', true)->connect('taxonomy', true); |
| | | $cache->flush(); |
| | | } |
| | | |
| | | // Update term usage when a post is saved |
| | |
| | | private function fetchUserTerms(int $user_id, string $taxonomy, array $args):array |
| | | { |
| | | $taxonomy = jvbCheckBase($taxonomy); |
| | | $cache = CacheManager::for($user_id.'_term_relationships'); |
| | | $cache = Cache::for($user_id.'_term_relationships', DAY_IN_SECONDS)->connect('post', true)->connect('taxonomy', true); |
| | | $key = $cache->generateKey(array_merge( |
| | | [ |
| | | 'user' => $user_id, |
| | | 'taxonomy' => $taxonomy, |
| | | ], |
| | | $args |
| | |
| | | }, $terms); |
| | | } |
| | | |
| | | /** |
| | | * @param int $user_id |
| | | * |
| | | * @return bool |
| | | */ |
| | | public function warmCache(int $user_id):bool |
| | | { |
| | | // Get all taxonomies |
| | | $taxonomies = getTaxonomies(['_builtin' => false], 'names'); |
| | | |
| | | foreach ($taxonomies as $taxonomy) { |
| | | if (str_starts_with($taxonomy, BASE)) { |
| | | // Pre-cache the most common queries |
| | | $common_args = [ |
| | | // Most frequently used terms |
| | | [ |
| | | 'orderby' => 'count', |
| | | 'order' => 'DESC', |
| | | 'limit' => 20, |
| | | 'include_parents' => true |
| | | ], |
| | | // Recently used terms |
| | | [ |
| | | 'orderby' => 'last_used', |
| | | 'order' => 'DESC', |
| | | 'limit' => 20, |
| | | 'include_parents' => true |
| | | ], |
| | | // Alphabetical list |
| | | [ |
| | | 'orderby' => 'name', |
| | | 'order' => 'ASC', |
| | | 'limit' => 0, |
| | | 'include_parents' => true |
| | | ], |
| | | // Direct terms only (no parents) |
| | | [ |
| | | 'orderby' => 'count', |
| | | 'order' => 'DESC', |
| | | 'limit' => 0, |
| | | 'only_direct' => true |
| | | ] |
| | | ]; |
| | | |
| | | foreach ($common_args as $args) { |
| | | // Force skip_cache to ensure we get fresh data |
| | | $args['skip_cache'] = true; |
| | | |
| | | // Warm the cache by executing the query |
| | | $this->getUserTerms($user_id, $taxonomy, $args); |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | } |