192 lines
4.4 KiB
PHP
192 lines
4.4 KiB
PHP
<?php
|
|
|
|
function getRevueAuthors($revueID)
|
|
{
|
|
$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' => '=',
|
|
),
|
|
),
|
|
));
|
|
$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('/<h2[^>]*>/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('/<h2[^>]*>/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();
|
|
}
|