REFACTOR Ajout de la synchronisation des tags entre articles et revues au save post
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Antoine M 2026-01-13 15:00:10 +01:00
parent 2205302048
commit d6c10baf0c

View File

@ -47,4 +47,88 @@ function dynamiques_taxonomy_init()
);
register_taxonomy('etiquettes', array('articles', 'revues'), $args);
}
add_action('init', 'dynamiques_taxonomy_init', 0);
add_action(hook_name: 'init', callback: 'dynamiques_taxonomy_init', priority: 0);
/**
* SYNCHRONISATION DES TAGS ('ETIQUETTES') ENTRE ARTICLES ET REVUES.
*
* - À l'enregistrement d'un Article (hook `save_post_articles`), on récupère la Revue liée
* via le champ ACF `related_revue`, puis on ajoute ses tags à ceux de la Revue,
*
* - À l'enregistrement d'une Revue (hook `save_post_revues`), on récupère tous les Articles liés à la revue
* via le champ ACF `articles` et on propage leurs étiquettes vers la Revue en réutilisant
* la fonction précédente pour chaque Article.
*
* Détails d'implémentation :
* - Conversion des objets WP_Term en IDs via `wp_list_pluck`.
* - Gestion des cas vides / non valides (false, WP_Error) avant fusion.
* - Affectation finale avec `wp_set_object_terms`.
*/
function dynamiques_apply_current_article_tags_to_related_revue($article_ID)
{
if (!$article_ID) return;
$related_revue_ID = get_field(selector: 'related_revue', post_id: $article_ID);
if (!$related_revue_ID) return;
$article_terms = get_the_terms($article_ID, 'etiquettes');
$revue_terms = get_the_terms($related_revue_ID, 'etiquettes');
$article_ids = is_array($article_terms) ? wp_list_pluck($article_terms, 'term_id') : [];
$revue_ids = is_array($revue_terms) ? wp_list_pluck($revue_terms, 'term_id') : [];
$revue_updated_terms_ids = array_values(array_unique(array_merge($revue_ids, $article_ids)));
wp_set_object_terms(object_id: $related_revue_ID, terms: $revue_updated_terms_ids, taxonomy: 'etiquettes');
}
add_action(hook_name: 'save_post_articles', callback: 'dynamiques_apply_current_article_tags_to_related_revue', priority: 99, accepted_args: 3);
function dynamiques_update_revue_tags_from_related_articles_on_save_post($post_ID)
{
if (get_post_type($post_ID) !== 'revues') {
return;
}
$related_articles = get_field(selector: 'articles', post_id: $post_ID);
if (!$related_articles) return;
foreach ($related_articles as $article) {
dynamiques_apply_current_article_tags_to_related_revue($article->ID);
}
}
add_action(hook_name: 'save_post_revues', callback: 'dynamiques_update_revue_tags_from_related_articles_on_save_post', priority: 99, accepted_args: 1);
function retetest()
{
$revue_ID = 687;
$revue_terms = get_the_terms($revue_ID, 'etiquettes');
$revue_term_ids = (is_array($revue_terms) && !is_wp_error($revue_terms))
? wp_list_pluck($revue_terms, 'term_id')
: [];
// Option A: ne pas lancer la requête si vide
if (empty($revue_term_ids)) {
return; // ou autre logique
}
$query = new WP_Query([
'post_type' => 'revues',
'posts_per_page' => -1,
'tax_query' => [[
'taxonomy' => 'etiquettes',
'field' => 'term_id',
'terms' => $revue_term_ids,
'operator' => 'IN', // ou 'AND' si tu veux toutes les étiquettes
]],
]);
}
add_action('init', 'retetest');