_x('Étiquettes', 'Taxonomy General Name', 'text_domain'), 'singular_name' => _x('Étiquette', 'Taxonomy Singular Name', 'text_domain'), 'menu_name' => __('Étiquettes', 'text_domain'), 'all_items' => __('Toutes les étiquettes', 'text_domain'), 'parent_item' => __('Étiquette parente', 'text_domain'), 'parent_item_colon' => __('Étiquette parente:', 'text_domain'), 'new_item_name' => __('Nouvelle étiquette', 'text_domain'), 'add_new_item' => __('Ajouter une étiquette', 'text_domain'), 'edit_item' => __('Modifier l\'étiquette', 'text_domain'), 'update_item' => __('Mettre à jour l\'étiquette', 'text_domain'), 'view_item' => __('Voir l\'étiquette', 'text_domain'), 'separate_items_with_commas' => __('Séparer les étiquettes avec des virgules', 'text_domain'), 'add_or_remove_items' => __('Ajouter ou supprimer des étiquettes', 'text_domain'), 'choose_from_most_used' => __('Choisir parmi les plus utilisées', 'text_domain'), 'popular_items' => __('Étiquettes populaires', 'text_domain'), 'search_items' => __('Rechercher des étiquettes', 'text_domain'), 'not_found' => __('Non trouvé', 'text_domain'), 'no_terms' => __('Aucune étiquette', 'text_domain'), 'items_list' => __('Liste des étiquettes', 'text_domain'), 'items_list_navigation' => __('Navigation dans la liste des étiquettes', 'text_domain'), ); $args = array( 'show_in_rest' => true, 'labels' => $labels, 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_admin_column' => true, 'show_in_nav_menus' => true, 'show_tagcloud' => true, 'meta_box_cb' => false, ); register_taxonomy('etiquettes', array('articles', 'revues'), $args); } add_action('init', 'dynamiques_taxonomy_init', 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('related_revue', $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($related_revue_ID, $revue_updated_terms_ids, 'etiquettes'); } add_action('save_post_articles', 'dynamiques_apply_current_article_tags_to_related_revue', 99, 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('articles', $post_ID); if (!$related_articles) return; foreach ($related_articles as $article) { dynamiques_apply_current_article_tags_to_related_revue($article->ID); } } add_action('save_post_revues', 'dynamiques_update_revue_tags_from_related_articles_on_save_post', 99, 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');