187 lines
6.8 KiB
PHP
187 lines
6.8 KiB
PHP
<?php
|
|
$context = Timber::context();
|
|
$term = get_queried_object();
|
|
$taxonomy = $term->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);
|