'etiquettes', 'hide_empty' => false, )); return $tags; } function get_archive_page_icon_html($post_type) { switch ($post_type) { case 'analyses-etudes': return 'Analyses et études'; case 'revues': return 'Revues'; case 'expositions': return 'Expositions'; case 'outils-pedagogiques': return 'Outils pédagogiques'; case 'actualites': return 'Actualités'; default: return ''; } } function page_has_subtitle($page_id) { $has_page_subtitle = get_field('page_subtitle', $page_id) ? true : false; return $has_page_subtitle; } function get_archive_page_subtitle_html($post_type) { switch ($post_type) { case 'analyses-etudes': return 'Accédez à nos recherches et publications thématiques.'; case 'outils-pedagogiques': return 'Des ressources pour apprendre et transmettre autrement.'; case 'expositions': return 'Découvrez nos expositions passées et actuelles.'; case 'revues': return 'Accédez à nos revues et publications '; case 'actualites': return 'Suivez nos projets, événements et publications. '; default: return ''; } } function handle_posts_numerotation_remapping($post_type) { if (!is_admin()) { return; } $query = new WP_Query(array( 'post_type' => $post_type, 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'ASC', )); $numerotation = 0; while ($query->have_posts()) { $query->the_post(); $numerotation++; update_post_meta(get_the_ID(), 'post_numerotation', $numerotation); } } function hasPostTypeNumerotation($post_type) { switch ($post_type) { case 'articles': case 'analyses-etudes': case 'expositions': case 'outils-pedagogiques': case 'recherches': case 'revues': return true; default: return false; } } /** * Retourne une WP_Query avec la dernière analyse et la dernière étude (une de chaque type). * Utilisable comme une query classique (->posts, ->post_count, etc.). */ function get_last_analyses_etudes_posts() { $latest_analyse = get_posts(array( 'posts_per_page' => 1, 'post_status' => 'publish', 'post_type' => 'analyses-etudes', 'orderby' => 'date', 'order' => 'DESC', 'tax_query' => array( array( 'taxonomy' => 'type-analyse-etude', 'field' => 'slug', 'terms' => 'analyse', ), ), )); $latest_etude = get_posts(array( 'posts_per_page' => 1, 'post_status' => 'publish', 'post_type' => 'analyses-etudes', 'orderby' => 'date', 'order' => 'DESC', 'tax_query' => array( array( 'taxonomy' => 'type-analyse-etude', 'field' => 'slug', 'terms' => 'etude', ), ), )); $post_ids = array_merge( array_map(function ($p) { return $p->ID; }, $latest_analyse), array_map(function ($p) { return $p->ID; }, $latest_etude) ); $post_ids = array_filter(array_unique($post_ids)); if (empty($post_ids)) { return new WP_Query(array( 'post_type' => 'analyses-etudes', 'posts_per_page' => 0, )); } return new WP_Query(array( 'post_type' => 'analyses-etudes', 'post__in' => $post_ids, 'orderby' => 'post__in', 'posts_per_page' => count($post_ids), )); } /** * Récupère le nombre de likes d'un post * * Cette fonction utilitaire récupère le compteur de likes stocké * dans les métadonnées d'un post. Retourne 0 si aucun like n'existe. * * @param int $post_id L'ID du post * @return int Le nombre de likes (0 si aucun) */ function get_post_likes_count($post_id) { $likes_count = get_post_meta($post_id, 'likes_count', true); return $likes_count ? intval($likes_count) : 0; } /** * Affiche le nombre de likes d'un post avec formatage * * Cette fonction utilitaire formate l'affichage du compteur de likes * avec une icône optionnelle et la gestion du pluriel. * * @param int $post_id L'ID du post * @param bool $show_icon Afficher l'icône cœur (défaut: true) * @return string Le texte formaté (ex: "❤️ 5 likes" ou "3 like") */ function display_likes_count($post_id, $show_icon = true) { $likes_count = get_post_likes_count($post_id); $icon = $show_icon ? '❤️ ' : ''; return $icon . $likes_count . ' like' . ($likes_count > 1 ? 's' : ''); } /** * Construit les URL de partage pour un post * * Cette fonction génère les URL de partage pour un post spécifique. * Elle retourne un tableau associatif contenant les URL de partage pour Facebook, Twitter-X et LinkedIn. * * @return array Tableau associatif contenant les URL de partage */ function build_share_urls() { $post_id = get_the_ID(); $postUrl = get_permalink($post_id); $postTitle = get_the_title($post_id); $facebookUrl = 'https://www.facebook.com/sharer.php?u=' . $postUrl; $twitterUrl = 'https://twitter.com/intent/tweet?text=' . $postTitle . '&url=' . get_the_permalink(get_the_id()); $linkedInUrl = 'https://www.linkedin.com/feed/?shareActive=true&text=' . $postTitle . ' ' . $postUrl; return array( 'Facebook' => $facebookUrl, 'Twitter-X' => $twitterUrl, 'Linkedin' => $linkedInUrl, 'postUrl' => $postUrl ); } function get_author_publications_amount($authorID) { if (empty($authorID)) return 0; if (get_current_blog_id() === 1) { $posts = count_user_posts_by_author($authorID, array('expositions', 'outils-pedagogiques', 'analyses-etudes')); return $posts; } if (get_current_blog_id() === 2) { $posts = count_user_posts_by_author($authorID, 'articles'); return $posts; } return; } /** * Compte le nombre d'articles d'un utilisateur pour un type de post donné * * Cette fonction compte combien d'articles d'un type spécifique * sont associés à un utilisateur donné via le champ custom 'authors'. * * @param int $userID L'ID de l'utilisateur * @param string $postType Le type de post à compter (ex: 'articles') * @return int Le nombre d'articles trouvés */ function count_user_posts_by_author($userID, $postType) { $args = array( 'post_type' => $postType, 'meta_query' => array( array( 'key' => 'authors', 'value' => '"' . $userID . '"', 'compare' => 'LIKE', ), ), ); $query = new WP_Query($args); return $query->found_posts; } function get_activity_title_from_acf_layout_label($label) { switch ($label) { case 'public_cible': return __('Public cible', 'carhop'); case 'lieu': return __('Lieu', 'carhop'); case 'date': return __('Date', 'carhop'); case 'duree': return __('Durée', 'carhop'); case 'prix': return __('Prix', 'carhop'); default: return ''; } } function get_post_type_supports_type($post_type) { switch ($post_type) { case 'activites': case 'analyses-etudes': return true; default: return false; } } function get_post_specific_type_terms($post_id) { $post_type = get_post_type($post_id); $terms = null; switch ($post_type) { case 'activites': $terms = get_the_terms($post_id, 'type-activite'); return $terms; case 'analyses-etudes': $terms = get_the_terms($post_id, 'type-analyse-etude'); return $terms; } return $terms; } function get_carhop_members_by_comity() { switch_to_blog(1); $comities_field_object = get_field_object('field_699737b48c0d2'); $comities = $comities_field_object ? $comities_field_object['choices'] : []; $members_organised_by_comity = []; foreach ($comities as $comity_value => $comity_label) { $members_posts_for_comity[$comity_value] = new WP_Query(array( 'post_type' => 'equipe', 'posts_per_page' => -1, 'meta_key' => 'last_name', 'orderby' => 'meta_value', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'comity', 'value' => $comity_value, 'compare' => 'LIKE', ), ), )); $members_organised_by_comity[$comity_value] = array( 'name' => $comity_value, 'label' => $comity_label, 'members' => array_values($members_posts_for_comity[$comity_value]->posts), 'count' => count($members_posts_for_comity[$comity_value]->posts), ); } restore_current_blog(); return $members_organised_by_comity; } /** * Retourne les auteurs (posts du CPT "auteurs") réellement liés * aux posts donnés via le champ ACF "authors". * * @param array $post_ids Liste d'IDs de posts * @param string $acf_field_name Nom du champ ACF (par défaut "authors") * @return array|WP_Post[] Liste de posts "auteurs" */ function get_authors_linked_to_posts(array $post_ids) { if (empty($post_ids)) { return array(); } $author_ids = array(); foreach ($post_ids as $post_id) { $post_authors = get_field('authors', $post_id); $has_main_author = get_field('has_main_author', $post_id); $post_main_author = get_field('main_author', $post_id); if (!empty($post_authors)) { foreach ($post_authors as $author) { $author_id = is_object($author) ? $author->ID : (int) $author; if ($author_id) { $author_ids[$author_id] = $author_id; // set pour éviter les doublons } } } if ($has_main_author && is_object($post_main_author) && isset($post_main_author->ID)) { $author_ids[$post_main_author->ID] = $post_main_author->ID; } } if (empty($author_ids)) { return array(); } return get_posts(array( 'post_type' => 'auteurs', 'post__in' => array_values($author_ids), 'posts_per_page' => -1, 'order' => 'ASC', 'meta_key' => 'last_name', 'orderby' => 'meta_value', )); } function get_current_post_numerotation($post_id) { $current_blog_id = get_current_blog_id(); $current_post_type = get_post_type($post_id); if ($current_blog_id === 1) { return get_post_meta($post_id, 'post_numerotation', true); } if ($current_blog_id === 2 && $current_post_type === 'articles') { $related_revue = get_field('related_revue', $post_id); $related_revue_issue_number = $related_revue ? get_field('issue_number', $related_revue) : null; return $related_revue_issue_number; } if ($current_blog_id === 2 && $current_post_type === 'revues') { return get_field('issue_number', $post_id); } return null; }