Refactoring : sécurité (XSS), découpage en modules inc/* et js/admin/*, IDs résolus par slug, perf (caches, cron Gravatar, assets auto-hébergés), tests

This commit is contained in:
2026-06-10 21:30:25 +02:00
parent e6b73df516
commit 9280c3b9ce
44 changed files with 3209 additions and 2907 deletions

90
inc/config.php Normal file
View File

@@ -0,0 +1,90 @@
<?php
/**
* Configuration centralisée des identifiants du site.
*
* Les term_ids auto-incrémentés peuvent changer lors d'une réimportation de
* base ; partout où c'est possible on résout par slug (stable) avec cache
* statique par requête. Les quelques maps indexées par term_id documentent
* explicitement leur dépendance à l'installation.
*/
/**
* Résout un term_id par slug (catégories, rôles, etc.), avec cache statique.
* Renvoie 0 si le terme n'existe pas — les appelants doivent tolérer 0
* (clause tax_query vide, comparaison toujours fausse…).
*/
function thalim_term_id_by_slug( string $slug, string $taxonomy = 'category' ): int {
static $cache = [];
$key = $taxonomy . ':' . $slug;
if ( ! isset( $cache[ $key ] ) ) {
$term = get_term_by( 'slug', $slug, $taxonomy );
$cache[ $key ] = ( $term && ! is_wp_error( $term ) ) ? (int) $term->term_id : 0;
}
return $cache[ $key ];
}
/**
* Catégories « structurelles » du site, résolues par slug.
* Clés logiques → slug en base. Utiliser thalim_cat_id('seance') etc.
*/
function thalim_cat_id( string $key ): int {
static $slugs = [
// racines / rubriques
'laboratoire' => 'le-laboratoire',
'manifestations' => 'manifestations-scientifiques',
'publications' => 'publications-et-productions',
'mediation' => 'mediation-scientifique',
'ressources' => 'ressources',
// catégories techniques
'seance' => 'seance-de-seminaire',
'non-classe' => 'non-classe',
'vie-du-labo' => 'vie-du-labo-intranet',
'newsletter' => 'newsletter',
'message-labo' => 'message-du-laboratoire',
// sous-catégories utilisées dans la logique métier
'seminaires' => 'seminaires',
'colloques' => 'colloques-et-journees-detudes',
'communications' => 'communications',
'soutenances' => 'soutenances',
'ouvrages' => 'ouvrages',
'articles' => 'articles',
'revues' => 'revues-et-collections',
'multimedia' => 'multimedia',
'evenements-culturels' => 'evenements-culturels',
'medias' => 'medias',
'gazette' => 'gazette',
'podcast' => 'podcast-de-thalim',
'captations' => 'captations',
'appels' => 'appels-a-contribution',
];
if ( ! isset( $slugs[ $key ] ) ) return 0;
return thalim_term_id_by_slug( $slugs[ $key ], 'category' );
}
/**
* Rôles (taxonomy `role`) techniques, exclus de la recherche de membres.
*/
function thalim_excluded_role_ids(): array {
return array_values( array_filter( [
thalim_term_id_by_slug( 'a-ranger', 'role' ),
thalim_term_id_by_slug( 'archive', 'role' ),
] ) );
}
/**
* Clé couleur stable d'une catégorie racine, indexée sur le term_id (immuable)
* plutôt que sur le slug (que l'admin peut régénérer en renommant la catégorie).
* Renvoie la clé canonique attendue par les classes CSS .gradient--{clé} /
* .category--{clé} (_postcard.scss, _single.scss, _category.scss).
* Fallback sur le slug live pour toute racine hors des 5 rubriques connues.
*/
function thalim_category_color_slug( $root_term_id, $fallback_slug = '' ) {
$map = [
1 => 'le-laboratoire',
3 => 'manifestations-scientifiques',
4 => 'publications-et-productions',
5 => 'mediation-scientifique',
6 => 'ressources',
];
return $map[ (int) $root_term_id ] ?? $fallback_slug;
}