135 lines
5.3 KiB
PHP
135 lines
5.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Plugin Name: Dynamiques — Taxonomies
|
|
* Description: Gestion des taxonomies de dynamiques
|
|
* Author: Antoine M. @ Deligraph
|
|
* Text Domain: dynamiques-taxonomies
|
|
*/
|
|
|
|
|
|
// Register Custom Taxonomy
|
|
function dynamiques_taxonomy_init()
|
|
{
|
|
|
|
$labels = array(
|
|
'name' => _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(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');
|