carhop__carhop-theme__DEV/includes/utilities.php

422 lines
11 KiB
PHP

<?php
/**
* Fonctions utilitaires pour le calcul du temps de lecture
*/
function calculate_reading_time($content)
{
$content = strip_tags($content);
// Compter les mots (en français, on compte environ 200 mots par minute)
$word_count = str_word_count($content);
$reading_time = ceil($word_count / 200);
return $reading_time;
}
function test()
{
$tags = get_terms(array(
'taxonomy' => 'etiquettes',
'hide_empty' => false,
));
return $tags;
}
function get_archive_page_icon_html($post_type)
{
switch ($post_type) {
case 'analyses-etudes':
return '<img class="page_icon" src="' . get_template_directory_uri() . '/resources/img/icons/icon-analyses-etudes.svg" alt="Analyses et études" />';
case 'revues':
return '<img class="page_icon" src="' . get_stylesheet_directory_uri() . '/resources/img/icons/revues.svg" alt="Revues" />';
case 'expositions':
return '<img class="page_icon" src="' . get_template_directory_uri() . '/resources/img/icons/icon-expositions.svg" alt="Expositions" />';
case 'outils-pedagogiques':
return '<img class="page_icon" src="' . get_template_directory_uri() . '/resources/img/icons/icon-outils-pedagogiques.svg" alt="Outils pédagogiques" />';
case 'actualites':
return '<img class="page_icon" src="' . get_template_directory_uri() . '/resources/img/icons/icon-actualites.svg" alt="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 '<span class="page_subtitle">Accédez à nos recherches et publications thématiques.</span>';
case 'outils-pedagogiques':
return '<span class="page_subtitle">Des ressources pour apprendre et transmettre autrement.</span>';
case 'expositions':
return '<span class="page_subtitle">Découvrez nos expositions passées et actuelles.</span>';
case 'revues':
return '<span class="page_subtitle">Accédez à nos revues et publications</span> ';
case 'actualites':
return '<span class="page_subtitle">Suivez nos projets, événements et publications.</span> ';
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);
if (empty($post_authors)) continue;
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 (empty($author_ids)) {
return array();
}
return get_posts(array(
'post_type' => 'auteurs',
'post__in' => array_values($author_ids),
'posts_per_page' => -1,
'orderby' => 'title',
'order' => 'ASC',
));
}
function get_current_post_numerotation($post_id)
{
$current_blog_id = get_current_blog_id();
if ($current_blog_id === 1) {
return get_post_meta($post_id, 'post_numerotation', true);
}
if ($current_blog_id === 2) {
$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;
}
return null;
}