Corrections Pods (sous-types custom-simple, sync pick→taxonomie), agenda accueil et gras/italique single
This commit is contained in:
75
inc/pods-taxonomy-sync.php
Normal file
75
inc/pods-taxonomy-sync.php
Normal file
@@ -0,0 +1,75 @@
|
||||
<?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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user