/** * The Template for displaying all single posts * * Methods for TimberHelper can be found in the /lib sub-directory * * @package WordPress * @subpackage Timber * @since Timber 0.1 */ $context = Timber::context(); $timber_post = Timber::get_post(); $context['post'] = $timber_post; if (get_post_type() == 'team') { $context['subnav'] = new Timber\Menu('about_subnav'); } if (get_post_type() == 'event') { $context['more_events'] = get_upcoming_events($timber_post->ID); } if (get_post_type() == 'whitepaper') { if (get_field('next_page_link')) { $context['next_page'] = new Timber\Post(get_field('next_page_link')); } } if (get_post_type() == 'school') { // Get taxonomy terms $context['taxonomies'] = array(); $context['taxonomies']['grade_levels']['name'] = "Grade Levels"; $context['taxonomies']['grade_levels']['terms'] = get_the_terms($timber_post->ID, 'school-grade-level'); $context['taxonomies']['learning_models']['name'] = "Learning Models"; $context['taxonomies']['learning_models']['terms'] = get_the_terms($timber_post->ID, 'school-learning-model'); $context['taxonomies']['governance_types']['name'] = "Governance"; $context['taxonomies']['governance_types']['terms'] = get_the_terms($timber_post->ID, 'school-governance-type'); // Get confidence levels with icons $confidence_levels_raw = get_the_terms($timber_post->ID, 'school-confidence-level'); $confidence_levels = array(); if ($confidence_levels_raw && !is_wp_error($confidence_levels_raw)) { foreach ($confidence_levels_raw as $term) { $term_data = array( 'term_id' => $term->term_id, 'name' => $term->name, 'slug' => $term->slug, ); // Get ACF icon field for this term $icon = get_field('icon', 'school-confidence-level_' . $term->term_id); if ($icon) { // Handle different ACF field types if (is_array($icon) && isset($icon['url'])) { // Image field - return URL $term_data['icon'] = $icon['url']; } elseif (is_array($icon) && isset($icon['value'])) { // Select field with value $term_data['icon'] = $icon['value']; } elseif (is_numeric($icon)) { // Image ID - get URL $icon_url = wp_get_at 'full'); if ($icon_url) { $term_data['i } } else { // Text field or direct value (URL) $term_data['icon'] = } } $confidence_levels[] = $term_data; } } $context['taxonomies']['confidence_levels']['name'] = $context['taxonomies']['confidence_levels']['terms'] = $confidence_levels; } // Related content — Pinecone semantic recommendations (all // Locked to the cached _gs_related_ids meta only -- NOT recomputed live on // pageview. A live per-post Pinecone query on every cache miss was driving // 12k+ calls/day (mostly crawler traffic walking the whole archive) and // burning the monthly Pinecone egress quota. Re-populate _gs_related_ids via // a whole-catalog cache refresh (batch backfill / reindex) when it needs to // change -- never by falling through to a live query here. $related_ids = get_post_meta( get_the_ID(), '_gs_related_ids', true ); if ( ! empty( $related_ids ) && is_array( $related_ids ) ) { $context['related_content'] = get_posts( [ 'post__in' => $related_ids, 'post_type' => [ 'post', 'episode', 'whitepaper', 'school' ], 'post_status' => 'publish', 'posts_per_page' => 4, 'orderby' => 'post__in', ] ); } elseif ( class_exists( 'SearchWP_Related' ) ) { $searchwp_related = new SearchWP_Related(); $keywords = get_post_meta( get_the_ID(), $searchwp_related->meta_key, true ); $context['related_content'] = $searchwp_related->get( [ 's' => $keywords, 'engine' => 'related_content', 'posts_per_page' => 4, ] ); } else { $context['related_content'] = []; } if ( post_password_required( $timber_post->ID ) ) { Timber::render( 'single-password.twig', $context ); } else { Timber::render( array( 'single-' . $timber_post->ID . '.twig', 'single-' . $timber_post->post_type . '.twig', 'single-' . $timber_post->sl'.twig', 'single.twig' ), $context ); }