76 lines
2.9 KiB
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 );
|
|
}
|
|
}
|
|
}
|