thalim-hal-importer
Plugin WordPress qui importe les publications du laboratoire THALIM depuis l'archive ouverte HAL (structure 254015) et les transforme en posts WordPress avec tous les champs Pods renseignés.
- Version : 2.0.0
- Auteur : THALIM Dev
- Licence : GPL v2 or later
Installation
cd wp-content/plugins
git clone gitea@figureslibres.io:valentin_le_moign/thalim-plugin-hal-importer.git thalim-hal-importer
Puis activer depuis l'admin WordPress. Dans le cadre du projet THALIM, le clonage est automatisé par bootstrap.sh du repo thalim-stack.
Utilisation
Deux points d'entrée selon le rôle :
- Admin / éditeur (cap
edit_others_posts) : Outils → HAL Import — UI complète, voit toutes les publications de la structure THALIM, peut filtrer par n'importe quel auteur. - Contributeur (cap
edit_postssansedit_others_posts) : menu top-level Importer depuis HAL — UI réduite scopée sur son propre idHAL (cf. § Mode contributeur).
Aperçu live + import
- Filtres : plage de dates (
producedDate_s) et auteur (idHAL d'un membre THALIM) - Liste les publications HAL correspondantes avec statut coloré :
- vert : déjà importée (présence du meta
hal_idcôté WP). Le statut WP est précisé (« Publié » ou « En attente »). Pour les pending, un bouton Modifier ouvre la page d'édition du post. - jaune : prête à être importée (au moins un auteur HAL matche un user WordPress)
- rouge : aucun auteur THALIM identifié → ignorée
- vert : déjà importée (présence du meta
- Colonne Action :
- Bouton Importer par ligne jaune : crée le post correspondant en
pending - Bouton global Importer N publication(s) au-dessus du tableau : import en masse de toutes les lignes jaunes du tableau courant
- Bouton Importer par ligne jaune : crée le post correspondant en
- Après chaque import, le cache du tableau est muté en place (la ligne devient verte, les stats sont ajustées) sans nouvel appel HAL
- Cache des aperçus en transient (5 min, clé hashée sur les filtres), rafraîchissable manuellement
Mode contributeur
Quand un contributeur ouvre la page :
- Précondition idHAL : si le user n'a pas renseigné son
identifiant_halsur son profil, ou si son idHAL est invalide (absent du référentielref/author), la page se bloque sur une notice avec un lien vers son profil. - Scoping côté serveur : le filtre auteur est forcé à l'idHAL du contributeur, indépendamment de tout
$_POST['hal_author_id']reçu. La cache key des aperçus est préfixée paru<user_id>|pour éviter toute collision avec le cache admin. - UI réduite : dropdown auteur masqué, panneau de validation des idHAL des autres membres masqué.
- Notice persistante rappelant que l'axe thématique est obligatoire avant publication, qu'une image à la une est attendue, etc.
- Sécurité import unitaire :
handle_import_single()vérifie que l'idHAL du contributeur figure bien dansauthIdHal_sdu doc HAL ciblé — un POST forgé sur unhal_idd'une autre publi est rejeté. - post_author forcé : l'importer reçoit
force_post_author = get_current_user_id()(6e param deimport()) pour que le contributeur soit l'auteur WP du post même s'il est 2e co-auteur dansauthIdHal_s. - Le statut
pendingnatif de l'importer aligne nativement avec la restriction WP "contributeur = pas de publication directe" — un éditeur ou admin valide ensuite le post.
Validation des idHAL des membres
Le panneau dépliable « Utilisateurs WordPress avec identifiant HAL » liste tous les users dont le meta identifiant_hal est rempli et vérifie chaque idHAL contre le référentiel auteur HAL (ref/author). Les idHAL absents du référentiel sont colorés en rouge et comptés dans l'en-tête du panneau. Résultat mis en cache 24h (transient invalidé naturellement quand la liste des users change).
Features désactivées (code conservé, feature flag à false)
- Card Configuration + bouton Test API :
Thalim_HAL_Admin_Page::CONFIG_PANEL_ENABLED - Import en masse via CSV (legacy SPIP) :
Thalim_HAL_Admin_Page::CSV_IMPORT_ENABLED. Permettait l'upload d'un CSV dehal_id+ d'un fichier de contexte SPIP (axes/tags/programmes/owner par publication), traités par batchs de 100 avec rapport CSV final. Le code vit dansincludes/trait-admin-page-csv-legacy.php.
Basculer le flag à true dans class-admin-page.php pour réactiver.
Mapping des types HAL → catégories WordPress
DOC_TYPE_MAP dans includes/class-importer.php :
| Type HAL | Description | Catégorie WP |
|---|---|---|
ART |
Article | 16 |
COUV |
Chapitre d'ouvrage | 16 |
OUV |
Ouvrage | 15 |
COMM |
Communication | 13 |
ISSUE |
Direction de numéro | 16 |
PROCEEDINGS |
Direction d'ouvrage / actes | 15 |
THESE |
Thèse | 14 |
HDR |
HDR | 14 |
SON |
Son | 19 |
VIDEO |
Vidéo | 19 |
COMM, THESE, HDR, SON, VIDEO sont traités comme événements et utilisent le champ Pods date_de_debut. Les autres utilisent datetime.
Champs HAL → champs WP
À l'import, chaque publication remplit :
- Identification :
hal_id,hal_url(URI HAL),lien_externe_1(PDF si dispo) avec titreDocument HAL // HAL Document - Titre :
post_title(issu de HAL) - Catégorie : triple écriture (term assignment + meta
categorie+ meta_pods_categorie) - Auteurs HAL → membres : matching via
authIdHal_s↔ user metaidentifiant_hal. Stockage en triple-pattern Pods (membresadd_post_meta +_pods_membres) - Date :
date_de_debutoudatetimeselon le type, optionnellement backdaté surproducedDate_s - Métadonnées :
journal,editeur,sous-titre(book/conference title),lieu(city/country pour PROCEEDINGS),reference_bibliographique(citationFull_s) - Fonction :
fonction_auteur(varie selon doc type : « Auteur du chapitre // Chapter author », « Direction de numéro // Editor-in-Chief », etc.) - Axes thématiques : cascade
spip_context→ co-auteurs THALIM → owner. Source effective stockée dans$importer->last_axes_source - Programmes de recherche et étiquettes : depuis
spip_context(import CSV uniquement)
Dédoublonnage
L'import vérifie le meta hal_id avant chaque insertion : une publication ne peut pas être importée deux fois. get_imported_post($hal_id) renvoie l'id et le post_status du post correspondant — utilisé dans l'aperçu pour distinguer Publié / En attente.
Prérequis
- WordPress 6.0+
- PHP 8.2+ (constantes dans les traits)
- Plugin Pods (le pod
postet le champ useridentifiant_hal) - IDs de catégorie WordPress conformes au mapping (8/13/14/15/16/19) — codés en dur dans
DOC_TYPE_MAP
Structure
.
├── thalim-hal-importer.php # point d'entrée, constantes, bootstrap
└── includes/
├── class-hal-api.php # client API HAL (fetch_publications, fetch_by_hal_ids, validate_hal_ids)
├── class-admin-page.php # UI Tools > HAL Import (aperçu + import unitaire/masse)
├── class-importer.php # mapping HAL → posts WP (triple-storage, axes cascade)
├── trait-admin-page-config.php # card Configuration + Test API (désactivé)
└── trait-admin-page-csv-legacy.php # import bulk CSV legacy SPIP (désactivé)
API HAL
- Recherche publications :
https://api.archives-ouvertes.fr/search/(structure THALIM254015) - Référentiel auteurs :
https://api.archives-ouvertes.fr/ref/author/(validation des idHAL) - Documentation : https://api.archives-ouvertes.fr/docs