| | |
| | | $this->cache_name = 'feed'; |
| | | $this->cache_ttl = 86400; |
| | | parent::__construct(); |
| | | $this->cache->clear(); |
| | | } |
| | | |
| | | public function init():void |
| | | { |
| | | $this->cache->clear(); |
| | | $this->checker = Checker::getInstance(); |
| | | |
| | | if (jvbSiteUsesUmami()) { |
| | | if (Features::hasIntegration('umami')) { |
| | | $this->tracker = JVB()->connect('umami'); |
| | | } |
| | | |
| | | $this->cache->clear(); |
| | | $this->setupCacheConnections(); |
| | | } |
| | | |
| | |
| | | if (!$post || is_wp_error($post)) { |
| | | return []; |
| | | } |
| | | |
| | | return $cache->remember($postID, |
| | | function() use ($postID, $type, $metaType, $post, $skip) { |
| | | // |
| | | // return $cache->remember($postID, |
| | | // function() use ($postID, $type, $metaType, $post, $skip) { |
| | | $config = null; |
| | | switch ($metaType) { |
| | | case 'post': |
| | |
| | | ]; |
| | | |
| | | //Format Taxonomies |
| | | $temp = array_filter($fields, function($field) { |
| | | return $field['type'] === 'taxonomy'; |
| | | }); |
| | | foreach ($temp as $key => $config) { |
| | | if (array_key_exists($key, $out) && $out[$key] !== '') { |
| | | $IDs = array_map('absint', explode(',', $out[$key])); |
| | | $data = []; |
| | | $icon = JVB_TAXONOMY[$config['taxonomy']]['icon']??'triangle'; |
| | | foreach ($IDs as $ID) { |
| | | $term = get_term($ID, jvbCheckBase($config['taxonomy'])); |
| | | if ($term && !is_wp_error($term)) { |
| | | $data[$ID] = [ |
| | | 'id' => $ID, |
| | | 'icon' => $icon, |
| | | 'name' => $term->name, |
| | | 'url' => get_term_link($ID, jvbCheckBase($config['taxonomy'])), |
| | | ]; |
| | | if ($this->tracker) { |
| | | $data[$ID]['umami_click'] = $this->tracker->trackClick($ID, $config['taxonomy'], ['from' => $type.'_'.$postID]); |
| | | } |
| | | } |
| | | } |
| | | if (!empty($data)) { |
| | | $out['fields'][$key] = $data; |
| | | } |
| | | } |
| | | } |
| | | $out['taxonomies'] = $this->extractTaxonomies($values, $postID, $type); |
| | | |
| | | //Add images |
| | | $imgIDs = []; |
| | | $temp = array_filter($fields, function($field) { |
| | | return in_array($field['type'], [ 'upload', 'image', 'gallery']); |
| | | }); |
| | | |
| | | foreach ($temp as $key => $config) { |
| | | if (array_key_exists($key, $out) && $out[$key] !== '') { |
| | | $IDs = array_map('absint', explode(',',$out[$key])); |
| | | if (array_key_exists($key, $out['fields']) && $out['fields'][$key] !== '') { |
| | | $IDs = array_map('absint', explode(',',$out['fields'][$key])); |
| | | foreach ($IDs as $ID) { |
| | | $imgIDs[$ID] = jvbImageData($ID); |
| | | } |
| | |
| | | |
| | | $out['id'] = $postID; |
| | | $out['content'] = $type; |
| | | $out['icon'] = $config['icon']??'triangle'; |
| | | $out['icon'] = $config['icon']??jvbDefaultIcon(); |
| | | |
| | | if ($this->tracker) { |
| | | $args = ($metaType === 'post') ? ['owner_id' => $post->post_author] : []; |
| | |
| | | $out['url'] = get_the_permalink($postID); |
| | | break; |
| | | } |
| | | return $out; |
| | | } |
| | | ); |
| | | |
| | | // return $out; |
| | | // } |
| | | // ); |
| | | return $out; |
| | | } |
| | | |
| | | |
| | | |
| | | protected function initTimelineFields(string $content):void |
| | | { |
| | | $content = jvbNoBase($content); |
| | |
| | | $children = get_children(['post_parent' => $post->ID, 'orderby' => 'date', 'order' => 'ASC', 'post_status' => ['publish'], 'fields'=> 'ids']); |
| | | array_unshift($children, $post->ID); |
| | | |
| | | $item['taxonomies'] = $this->extractTaxonomies($item['fields'], $postID, jvbNoBase($post->post_type)); |
| | | |
| | | $subFields = []; |
| | | $images = []; |
| | | foreach ($children as $child) { |
| | |
| | | $f = $meta->getAll($this->timelineUniqueFields); |
| | | $f = ['id' => $child] + $f; |
| | | $subFields[] = $f; |
| | | |
| | | $item['taxonomies'] = array_merge($item['taxonomies'], $this->extractTaxonomies($f, $postID, jvbNoBase($post->post_type))); |
| | | $images[$f['post_thumbnail']] = jvbImageData((int) $f['post_thumbnail']); |
| | | } |
| | | $item['fields']['order'] = $subFields; |
| | | $item['fields']['number'] = count($children); |
| | | $item['fields']['before'] = get_post_thumbnail_id($children[0]); |
| | | $item['fields']['after'] = get_post_thumbnail_id($children[array_key_last($children)]); |
| | | |
| | | $item['fields']['timeline'] = $subFields; |
| | | $item['images'] = $item['images'] + $images; |
| | | |
| | | return $item; |
| | | } |
| | | protected function extractTaxonomies(array $fields, int $postID, string $content):array { |
| | | $taxonomies = []; |
| | | foreach ($fields as $key => $value) { |
| | | if (empty($value)) { |
| | | continue; |
| | | } |
| | | if (!array_key_exists($key, JVB_TAXONOMY)) { |
| | | continue; |
| | | } |
| | | |
| | | protected function formatTaxonomy(WP_Term $term, int $postID, string $type) |
| | | $taxConfig = JVB_TAXONOMY[$key]; |
| | | if (isset($taxConfig['public']) && $taxConfig['public'] === false) { |
| | | continue; |
| | | } |
| | | $terms = array_map('absint', explode(',', $value)); |
| | | $terms = array_filter($terms); // Remove 0 values |
| | | |
| | | if (empty($terms)) { |
| | | continue; |
| | | } |
| | | foreach($terms as $termID) { |
| | | $term = get_term($termID, jvbCheckBase($key)); |
| | | if ($term && !is_wp_error($term)) { |
| | | $taxonomies[$key][$termID] = $this->formatTaxonomy($term, $postID, $content); |
| | | } |
| | | } |
| | | } |
| | | return $taxonomies; |
| | | } |
| | | |
| | | protected function formatTaxonomy(WP_Term|int $term, int $postID, string $type) |
| | | { |
| | | return [ |
| | | 'ID' => $term->term_id, |
| | | 'title' => htmlspecialchars_decode($term->name), |
| | | 'url' => get_term_link($term->term_id, $term->taxonomy), |
| | | 'umami_click' => $this->tracker->trackTaxonomyClick($term->term_id, $term->taxonomy, [ |
| | | 'from' => $type . '_' . $postID |
| | | ]) |
| | | ]; |
| | | $cache = CacheManager::for(jvbNoBase($term->taxonomy)); |
| | | return $cache->remember( |
| | | 'feed_link_'.$term->term_id, |
| | | function () use ($term, $postID, $type) { |
| | | $base = [ |
| | | 'ID' => $term->term_id, |
| | | 'title' => htmlspecialchars_decode($term->name), |
| | | 'url' => get_term_link($term->term_id, $term->taxonomy), |
| | | ]; |
| | | if ($this->tracker) { |
| | | $base['umami_click'] =$this->tracker->trackTaxonomyClick($term->term_id, $term->taxonomy, [ |
| | | 'from' => $type . '_' . $postID |
| | | ]); |
| | | } |
| | | return $base; |
| | | } |
| | | ); |
| | | } |
| | | |
| | | protected function getAuthorData(WP_Post $post) |
| | |
| | | protected function buildRequestArgs(WP_REST_Request $request): array |
| | | { |
| | | $data = $request->get_params(); |
| | | error_log('Feed Request: ' . print_r($data, true)); |
| | | $args = [ |
| | | 'post_type' => (array_key_exists($data['content'], $this->buildFeedTypesConfig())) ? |
| | | BASE . $data['content'] : |
| | |
| | | ] |
| | | ); |
| | | } |
| | | if (array_key_exists('taxonomy', $data) && is_string($data['taxonomy'])) { |
| | | $data['taxonomy'] = json_decode($data['taxonomy'], true); |
| | | } |
| | | $args = $this->applyContextFilters($args, $data); |
| | | $args = $this->applyTaxonomyFilters($args, $data); |
| | | $args = $this->applyOrderFilters($args, $data); |
| | | $args = $this->applyDateFilters($args, $data); |
| | | |
| | | $args = $this->applyFavouritesFilter($args, $data); |
| | | error_log('Final Args: '.print_r($args, true)); |
| | | return $args; |
| | | return $this->applyFavouritesFilter($args, $data); |
| | | } |
| | | |
| | | protected function applyTaxonomyFilters(array $args, array $data): array |
| | |
| | | if ($cache_check) { |
| | | return $cache_check; // Returns 304 Not Modified |
| | | } |
| | | error_log('Feed Request Args: '.print_r($args, true)); |
| | | |
| | | $key = $this->cache->generateKey($args); |
| | | $cached = $this->cache->get($key); |
| | | if ($cached) { |
| | |
| | | // Fetch and format items |
| | | $items = $this->fetchFeedItems($args); |
| | | |
| | | error_log('Feed Got items: ' .print_r($items, true)); |
| | | |
| | | |
| | | $ttl = (str_contains($args['orderby'], 'RAND')) ? 1800 : $this->cache_ttl; |
| | | $this->cache->set($key, $items, $ttl); |
| | | |
| | |
| | | */ |
| | | protected function processHighlightedItem(array $items, array $data): array |
| | | { |
| | | error_log('Data passed to processHighlightedItem:' . print_r($data, true)); |
| | | if (empty($data['highlight'] ?? null)) { |
| | | return $items; |
| | | } |
| | |
| | | if (!array_key_exists('favourites', $filters)) { |
| | | return $args; |
| | | } |
| | | error_log('Proceeding to check for favourites:'); |
| | | global $wpdb; |
| | | |
| | | // Get post types for the current filter |
| | |
| | | |
| | | $favourites_table = $wpdb->prefix . BASE . 'favourites'; |
| | | $placeholders = implode(',', array_fill(0, count($post_types), '%s')); |
| | | error_log('CurrentUser ID: ' . print_r(get_current_user_id(), true)); |
| | | $favourited_ids = $wpdb->get_col($wpdb->prepare( |
| | | "SELECT target_id FROM {$favourites_table} |
| | | WHERE user_id = %d AND type IN ($placeholders)", |