Files
thalim-theme/inc/pods-taxonomy-sync.php

76 lines
2.9 KiB
PHP

<?php
/**
* Synchronise les champs pick → taxonomie du pod `post` vers les vraies
* relations de termes WordPress (wp_term_relationships) après chaque save.
*
* Problème : `programmes_de_recherche`, `etiquettes` et `axes_thematiques` sont
* des champs pick `pick_object = taxonomy` configurés avec `pick_sync_taxonomy = 0`.
* Quand on les édite dans l'admin, Pods stocke la relation dans SES tables
* (postmeta + wp_podsrel) mais NE crée PAS l'assignation de terme WordPress.
* Or les pages d'archive de ces taxonomies (`taxonomy.php`, `tag.php`) et le
* nuage de mots-clés interrogent la vraie taxonomie via tax_query / get_terms :
* un post assigné uniquement via le champ Pods n'y apparaît pas.
* (Le champ `categorie` n'est PAS concerné : lui a `pick_sync_taxonomy = 1`.)
*
* L'importeur HAL, lui, écrit déjà le terme natif (wp_set_object_terms) ; le
* trou est côté sauvegarde admin. Ce hook comble ce trou pour toutes les
* origines de save.
*
* Stratégie : APPEND-ONLY. On n'ajoute que les termes présents dans le champ
* Pods mais absents de la taxonomie native. On ne retire jamais de terme —
* ainsi aucun risque de détruire des assignations posées par ailleurs (ex.
* post_tag issus du matching HAL). La contrepartie (un terme retiré du champ
* Pods reste en taxonomie native) est un moindre mal, très rare ici.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Champs pick→taxonomie du pod `post` à synchroniser (clé meta => taxonomy WP).
* `categorie` est volontairement absent (déjà synchronisé par Pods).
*/
function thalim_pod_tax_sync_fields(): array {
return [
'programmes_de_recherche' => 'programme_de_recherche',
'etiquettes' => 'post_tag',
'axes_thematiques' => 'axe_thematique',
];
}
add_action( 'save_post', 'thalim_sync_pods_taxonomy_relations', 99, 2 );
function thalim_sync_pods_taxonomy_relations( $post_id, $post ) {
if ( ! ( $post instanceof WP_Post ) || 'post' !== $post->post_type ) {
return;
}
if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) ) {
return;
}
foreach ( thalim_pod_tax_sync_fields() as $field => $taxonomy ) {
if ( ! taxonomy_exists( $taxonomy ) ) {
continue;
}
// Valeurs du champ Pods (source de vérité) : une ligne postmeta par term_id.
$ids = array_values( array_unique( array_filter(
array_map( 'intval', (array) get_post_meta( $post_id, $field ) )
) ) );
if ( empty( $ids ) ) {
continue;
}
// Termes déjà assignés en taxonomie native.
$current = wp_get_object_terms( $post_id, $taxonomy, [ 'fields' => 'ids' ] );
$current = is_wp_error( $current ) ? [] : array_map( 'intval', $current );
// N'ajouter que les manquants (append), ne jamais retirer.
$missing = array_diff( $ids, $current );
if ( ! empty( $missing ) ) {
wp_set_object_terms( $post_id, array_values( $missing ), $taxonomy, true );
}
}
}