'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_author_articles_amount($authorID)
{
if (empty($authorID)) return 0;
$articles = count_user_articles($authorID, 'articles');
return $articles;
}
/**
* Récupère tous les termes uniques d'une taxonomie pour une revue
*
* Cette fonction collecte tous les termes d'une taxonomie spécifique
* associés aux articles d'une revue. Elle parcourt tous les articles
* liés à la revue et retourne les termes uniques de la taxonomie donnée.
*
* @param int $revueID L'ID de la revue
* @param string $taxonomy Le nom de la taxonomie (ex: 'etiquettes', 'category')
* @return array Tableau d'objets de termes uniques
*/
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;
}
}
$uniquesTermsArray = array();
foreach (array_unique($terms) as $term) {
$termObject = get_term($term, $taxonomy);
$uniquesTermsArray[] = $termObject;
}
return $uniquesTermsArray;
}
/**
* 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_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;
}
/**
* Génère un sommaire automatique à partir du contenu d'un post
*
* Cette fonction analyse les blocs Gutenberg d'un post pour extraire
* tous les titres de niveau 2 (h2) et créer un index de navigation.
* Elle génère des ancres automatiques pour chaque titre.
*
* @param int $postID L'ID du post à analyser
* @return array Tableau associatif contenant les éléments du sommaire
* Chaque élément contient: title, anchor, level
*/
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('/