'articles', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'related_revue', 'value' => $revueID, 'compare' => '=', ), ), )); $authors = array(); foreach ($revueRelatedArticles->posts as $article) { $currentArticleAuthors = get_field('authors', $article->ID); if (empty($currentArticleAuthors) || !is_array($currentArticleAuthors)) continue; foreach ($currentArticleAuthors as $authorID) { $authors[] = $authorID; } } return array_unique($authors); } function get_revue_terms($revueID, $taxonomy) { $revueRelatedArticles = new WP_Query(array( 'post_type' => 'articles', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'related_revue', 'value' => $revueID, 'compare' => '=', ), ), )); $terms = array(); foreach ($revueRelatedArticles->posts as $article) { $currentArticleTerms = get_the_terms($article->ID, $taxonomy); if (empty($currentArticleTerms) || !is_array($currentArticleTerms)) continue; foreach ($currentArticleTerms as $term) { $terms[] = $term->term_id; } } foreach (array_unique($terms) as $term) { $termObject = get_term($term, $taxonomy); $uniquesTermsArray[] = $termObject; } return $uniquesTermsArray; } function count_user_articles($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 build_sommaire_from_content($postID) { $blocks = parse_blocks(get_the_content($postID)); $titleBlocks = array_filter( $blocks, function ($block) { // Vérifier si c'est un bloc heading if ($block['blockName'] !== 'core/heading') { return false; } // Extraire le niveau depuis le HTML si les attributs sont vides if (empty($block['attrs']['level'])) { // Chercher seulement h2 dans le HTML if (preg_match('/]*>/i', $block['innerHTML'], $matches)) { return true; } return false; } // Utiliser le niveau des attributs s'il existe return $block['attrs']['level'] === 2; } ); $outputIndex = []; foreach ($titleBlocks as $block) { $title = strip_tags($block['innerHTML']); // Extraire le niveau depuis le HTML ou les attributs $level = $block['attrs']['level'] ?? null; if (!$level && preg_match('/]*>/i', $block['innerHTML'], $matches)) { $level = 2; } if ($level !== 2) continue; $anchor = $block['attrs']['idName'] ?? sanitize_title($title); // Ajouter un préfixe si l'ancre commence par un chiffre if (!empty($anchor) && preg_match('/^[0-9]/', $anchor)) { $anchor = 'anchor-' . $anchor; } $outputIndex[] = [ 'title' => $title, 'anchor' => $anchor, 'level' => $level, ]; } return $outputIndex; } function build_footnotes_index_from_content($content) { if (empty($content)) { return []; } $footnotes = []; $dom = new DOMDocument(); // On supprime les erreurs de parsing pour le HTML5 @$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $links = $dom->getElementsByTagName('a'); foreach ($links as $key => $link) { if ($link->hasAttribute('class') && strpos($link->getAttribute('class'), 'footnote-reference') !== false) { $footnote_content = $link->getAttribute('footnote-content'); if (!empty($footnote_content)) { $footnotes[] = array( 'key' => $key + 1, 'anchorID' => $key + 1, 'content' => $footnote_content ); } } } return $footnotes; } add_filter('the_content', 'apply_footnotes_urls_to_content', 10); function apply_footnotes_urls_to_content($content) { $post_type = get_post_type(); if ($post_type !== 'articles' && !is_admin()) return $content; $footnotes = build_footnotes_index_from_content($content); $dom = new DOMDocument(); @$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $links = $dom->getElementsByTagName('a'); foreach ($links as $key => $link) { if ($link->hasAttribute('class') && strpos($link->getAttribute('class'), 'footnote-reference') !== false) { $link->setAttribute('id', 'footnote-' . ($key + 1)); } } return $dom->saveHTML(); }