diff --git a/includes/utilities.php b/includes/utilities.php index f09df60..d5d254a 100644 --- a/includes/utilities.php +++ b/includes/utilities.php @@ -250,3 +250,243 @@ function apply_footnotes_urls_to_content($content) return $content; } add_filter('the_content', 'apply_footnotes_urls_to_content', 10); + + + + +/** + * 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_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 + ); +} + +/** + * Génère les métadonnées Open Graph pour le partage sur les réseaux sociaux + */ +function generate_og_meta_tags() +{ + global $post; + + // URL canonique + $og_url = is_home() ? home_url() : get_permalink(); + + // Titre + if (is_home() || is_front_page()) { + $og_title = get_bloginfo('name'); + $og_description = get_bloginfo('description'); + } elseif (is_single() || is_page()) { + $og_title = get_the_title(); + $og_description = get_the_excerpt(); + + // Pour les articles, améliorer la description avec les métadonnées + if (empty($og_description) && get_post_type() === 'articles') { + // Essayer d'utiliser le champ de référence de citation si disponible + $cite_reference = get_field('cite_reference'); + if (!empty($cite_reference)) { + $og_description = strip_tags($cite_reference); + } + } + + // Fallback vers le contenu si toujours vide + if (empty($og_description)) { + $og_description = wp_trim_words(strip_tags(get_the_content()), 30); + } + } elseif (is_category()) { + $og_title = single_cat_title('', false) . ' - ' . get_bloginfo('name'); + $og_description = category_description(); + } elseif (is_tag()) { + $og_title = single_tag_title('', false) . ' - ' . get_bloginfo('name'); + $og_description = tag_description(); + } elseif (is_archive()) { + $og_title = get_the_archive_title() . ' - ' . get_bloginfo('name'); + $og_description = get_the_archive_description(); + } else { + $og_title = wp_get_document_title(); + $og_description = get_bloginfo('description'); + } + + // Nettoyer la description + $og_description = wp_strip_all_tags($og_description); + $og_description = str_replace(array("\r", "\n", "\t"), ' ', $og_description); + $og_description = wp_trim_words($og_description, 30); + + // Image + $og_image = ''; + if (is_single() || is_page()) { + if (has_post_thumbnail()) { + $og_image = get_the_post_thumbnail_url(null, 'large'); + } + } + + // Image par défaut si aucune image n'est trouvée + if (empty($og_image)) { + // Essayer d'utiliser le logo personnalisé du site + $custom_logo = wp_get_attachment_image_src(get_theme_mod('custom_logo'), 'large'); + if ($custom_logo) { + $og_image = $custom_logo[0]; + } else { + // Utiliser l'icône du site + $og_image = get_site_icon_url(512); + // Si pas d'icône de site, utiliser une image par défaut du thème + if (empty($og_image)) { + $og_image = get_template_directory_uri() . '/resources/img/covers/carhop-articles-page-cover.svg'; + } + } + } + + // Type de contenu + $og_type = is_single() ? 'article' : 'website'; + + // Nom du site + $site_name = get_bloginfo('name'); + + // Auteur (pour les articles) + $og_author = ''; + $article_authors = array(); + if (is_single()) { + $post_type = get_post_type(); + if ($post_type === 'articles') { + // Pour les articles, utiliser le champ ACF 'authors' + $authors = get_field('authors'); + if ($authors && is_array($authors)) { + foreach ($authors as $author) { + $first_name = get_field('first_name', $author->ID) ?: ''; + $last_name = get_field('last_name', $author->ID) ?: ''; + $author_name = trim($first_name . ' ' . $last_name); + if (empty($author_name)) { + $author_name = $author->post_title; + } + $article_authors[] = $author_name; + } + $og_author = implode(', ', $article_authors); + } + } + + // Fallback vers l'auteur WordPress standard + if (empty($og_author)) { + $og_author = get_the_author_meta('display_name'); + } + } + + // Date de publication (pour les articles) + $published_time = ''; + $modified_time = ''; + if (is_single()) { + $published_time = get_the_date('c'); + $modified_time = get_the_modified_date('c'); + } + + // Générer les balises meta + $meta_tags = array(); + + // Open Graph + $meta_tags[] = ''; + $meta_tags[] = ''; + $meta_tags[] = ''; + $meta_tags[] = ''; + $meta_tags[] = ''; + + if (!empty($og_image)) { + $meta_tags[] = ''; + $meta_tags[] = ''; + } + + if (!empty($og_author)) { + $meta_tags[] = ''; + } + + if (!empty($published_time)) { + $meta_tags[] = ''; + } + + if (!empty($modified_time)) { + $meta_tags[] = ''; + } + + // Ajouter les tags/sections pour les articles + if (is_single() && get_post_type() === 'articles') { + $article_tags = get_the_tags(); + if ($article_tags) { + foreach ($article_tags as $tag) { + $meta_tags[] = ''; + } + } + + // Ajouter la section/revue si disponible + $related_revue = get_field('related_revue'); + if ($related_revue) { + $meta_tags[] = ''; + } + } + + // Twitter Cards + $meta_tags[] = ''; + $meta_tags[] = ''; + $meta_tags[] = ''; + + if (!empty($og_image)) { + $meta_tags[] = ''; + } + + // Meta description standard + $meta_tags[] = ''; + + // Canonical URL + $meta_tags[] = ''; + + return implode("\n\t", $meta_tags); +}