taxonomy; $context['term'] = Timber::get_term($term); $context['taxonomy_slug'] = $taxonomy; $context['term_id'] = $term->term_id; $context['parent_slug'] = ''; $tax_object = get_taxonomy($taxonomy); $context['taxonomy_label'] = $tax_object ? $tax_object->labels->singular_name : $taxonomy; $excluded_ids = [12, 31]; // Séance de séminaire, Non classé if ( ! is_user_logged_in() ) $excluded_ids[] = 9; // Vie du labo // Read filter query params $active_axe = isset($_GET['axe']) ? intval($_GET['axe']) : 0; $active_date_from = isset($_GET['date_from']) ? sanitize_text_field($_GET['date_from']) : ''; $active_date_to = isset($_GET['date_to']) ? sanitize_text_field($_GET['date_to']) : ''; $active_cat_id = isset($_GET['filter_cat']) ? intval($_GET['filter_cat']) : 0; $filter_autres = isset($_GET['filter_autres']) ? 1 : 0; $context['active_axe'] = $active_axe; $context['active_date_from'] = $active_date_from; $context['active_date_to'] = $active_date_to; $context['active_category_id'] = $filter_autres ? 'autres' : $active_cat_id; $context['active_cat_id'] = $active_cat_id; $context['filter_autres'] = $filter_autres; // Determine active rubrique from active category (parent if subcategory, itself if top-level) $active_rubrique_id = 0; if ($active_cat_id) { $active_cat_obj = get_category($active_cat_id); $active_rubrique_id = ($active_cat_obj && $active_cat_obj->parent) ? $active_cat_obj->parent : $active_cat_id; } $context['active_rubrique'] = $active_rubrique_id; // Base params shared across all filter links (preserves active filters when navigating) $base_filter_params = array_filter([ 'axe' => $active_axe ?: null, 'date_from' => $active_date_from ?: null, 'date_to' => $active_date_to ?: null, ]); // Build tax_query — combine all clauses with AND $tax_query = [ 'relation' => 'AND', // Terme de la taxonomie courante [ 'taxonomy' => $taxonomy, 'field' => 'term_id', 'terms' => [$term->term_id], ], // Exclure les séances de séminaire (catégorie 12) [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => [12], 'operator' => 'NOT IN', ], ]; if ($active_cat_id) { $tax_query[] = [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => [$active_cat_id], 'include_children' => !$filter_autres, ]; } // On axe_thematique pages, the current term IS the active axe (for display only — taxonomy query handles filtering) $axe_taxonomy_mode = ($taxonomy === 'axe_thematique'); if ($axe_taxonomy_mode) { $active_axe = $term->term_id; $context['active_axe'] = $active_axe; } // Build remaining query args (meta/date) $extra_query_args = []; if ($active_axe && !$axe_taxonomy_mode) { $extra_query_args['meta_query'] = [[ 'key' => 'axes_thematiques', 'value' => $active_axe, 'type' => 'NUMERIC', ]]; } if ($active_date_from || $active_date_to) { $extra_query_args['thalim_event_date_filter'] = ['from' => $active_date_from, 'to' => $active_date_to]; } // Axes thématiques filter $axes_groups = thalim_get_axes_filter_groups(); $current_axes = $axes_groups[0]['terms'] ?? []; $context['filter_axes'] = $current_axes; $context['axe_taxonomy_mode'] = $axe_taxonomy_mode; $context['axe_stay_on_page'] = !$axe_taxonomy_mode; // Build rubrique/catégorie filter links pointing back to the current taxonomy URL $current_term_url = get_term_link($term); $all_cats = get_categories(['taxonomy' => 'category', 'hide_empty' => false, 'exclude' => $excluded_ids]); $filter_parents = []; foreach ($all_cats as $cat) { if ($cat->parent == 0) { $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); $filter_parents[] = [ 'id' => $cat->term_id, 'name' => thalim_cat_name($cat), 'slug' => $cat->slug, 'link' => add_query_arg($params, $current_term_url), ]; } } $context['filter_parents'] = $filter_parents; $filter_categories = []; if ($active_rubrique_id) { foreach ($all_cats as $cat) { if ($cat->parent == $active_rubrique_id) { $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); $filter_categories[] = [ 'id' => $cat->term_id, 'name' => thalim_cat_name($cat), 'slug' => $cat->slug, 'link' => add_query_arg($params, $current_term_url), ]; } } } // Add "Autres" entry if active rubrique has posts directly assigned to it if ($active_rubrique_id && !empty($filter_categories)) { $lang = thalim_current_language(); $direct_check = new WP_Query([ 'post_type' => 'post', 'posts_per_page' => 1, 'fields' => 'ids', 'no_found_rows' => true, 'lang' => '', 'tax_query' => [ 'relation' => 'AND', [ 'taxonomy' => $taxonomy, 'field' => 'term_id', 'terms' => [$term->term_id], ], [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => [$active_rubrique_id], 'include_children' => false, ], ], ]); if ($direct_check->have_posts()) { $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $active_rubrique_id, 'filter_autres' => 1])); $filter_categories[] = [ 'id' => 'autres', 'name' => $lang === 'en' ? 'Other' : 'Autres', 'slug' => 'autres', 'link' => add_query_arg($params, $current_term_url), ]; } } $context['filter_categories'] = $filter_categories; $posts = Timber::get_posts(array_merge([ 'post_type' => 'post', 'tax_query' => $tax_query, 'posts_per_page' => 12, 'orderby' => 'date', 'order' => 'DESC', 'lang' => '', 'thalim_event_date_order' => true, ], $extra_query_args)); $context['cards'] = thalim_get_cards_data($posts); $context['posts'] = $posts; // Custom Pods presentation fields (not the WP built-in description) $tax_lang = thalim_current_language(); $pres_fr = get_term_meta($term->term_id, 'presentation', true) ?: ''; $pres_en = get_term_meta($term->term_id, 'presentation_en', true) ?: ''; $context['term_presentation'] = wpautop( ( $tax_lang === 'en' && $pres_en ) ? $pres_en : $pres_fr ); Timber::render('taxonomy.twig', $context);