REFACTOR optimizing injecting id to h2 by injecting in php instead of javascript
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
017555b92e
commit
71ee6d1bb6
|
|
@ -13,6 +13,7 @@ function dynamiques_article_save_post($post_id)
|
||||||
|
|
||||||
if ($related_revue_ID && is_numeric($related_revue_ID) && $related_revue_ID !== '') {
|
if ($related_revue_ID && is_numeric($related_revue_ID) && $related_revue_ID !== '') {
|
||||||
dynamiques_article_include_article_in_revue_articles_array($current_article_ID, $related_revue_ID);
|
dynamiques_article_include_article_in_revue_articles_array($current_article_ID, $related_revue_ID);
|
||||||
|
update_post_meta($current_article_ID, 'revue_issue_number', get_field('issue_number', $related_revue_ID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
add_action('acf/save_post', 'dynamiques_article_save_post', 20);
|
add_action('acf/save_post', 'dynamiques_article_save_post', 20);
|
||||||
|
|
@ -55,3 +56,66 @@ function dynamiques_article_remove_articles_from_all_revues($current_article_ID)
|
||||||
update_field('articles', $revue_articles, $revue_ID);
|
update_field('articles', $revue_articles, $revue_ID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injecte automatiquement des IDs aux titres H2 dans le contenu
|
||||||
|
* pour permettre la navigation par ancres
|
||||||
|
*/
|
||||||
|
function dynamiques_render_article_inject_ids_to_headings($content)
|
||||||
|
{
|
||||||
|
// Ne traiter que si on est dans une page de contenu
|
||||||
|
if (!is_singular() || !in_the_loop()) {
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utiliser la fonction native WordPress pour créer le slug
|
||||||
|
function create_slug($text)
|
||||||
|
{
|
||||||
|
$slug = sanitize_title($text);
|
||||||
|
|
||||||
|
// S'assurer que l'ancre n'est pas vide
|
||||||
|
if (empty($slug)) {
|
||||||
|
$slug = 'anchor';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $slug;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utiliser DOMDocument pour parser le HTML
|
||||||
|
$dom = new DOMDocument();
|
||||||
|
|
||||||
|
// Supprimer les avertissements pour les entités HTML
|
||||||
|
libxml_use_internal_errors(true);
|
||||||
|
|
||||||
|
// Encoder le contenu en UTF-8 et l'ajouter au DOM
|
||||||
|
$dom->loadHTML('<?xml encoding="UTF-8">' . $content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
|
||||||
|
|
||||||
|
// Restaurer les erreurs
|
||||||
|
libxml_clear_errors();
|
||||||
|
|
||||||
|
// Chercher tous les H2 et H3
|
||||||
|
$headings = $dom->getElementsByTagName('h2');
|
||||||
|
|
||||||
|
// Traiter les H2
|
||||||
|
foreach ($headings as $heading) {
|
||||||
|
if (!$heading->hasAttribute('id')) {
|
||||||
|
$text = $heading->textContent;
|
||||||
|
$slug = create_slug($text);
|
||||||
|
$heading->setAttribute('id', $slug);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Récupérer le HTML modifié
|
||||||
|
$modified_content = $dom->saveHTML();
|
||||||
|
|
||||||
|
// Nettoyer l'encodage XML ajouté
|
||||||
|
$modified_content = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(['<?xml encoding="UTF-8">', '<?xml encoding="utf-8"?>'], '', $modified_content));
|
||||||
|
|
||||||
|
return $modified_content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Appliquer le filtre sur le contenu
|
||||||
|
add_filter('the_content', 'dynamiques_render_article_inject_ids_to_headings', 20);
|
||||||
|
|
|
||||||
|
|
@ -10,55 +10,3 @@ export function handleSmoothScrollToTitle(targetId: string): void {
|
||||||
behavior: 'smooth',
|
behavior: 'smooth',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fonction équivalente à sanitize_title() de WordPress
|
|
||||||
function sanitizeTitle(title: string): string {
|
|
||||||
// Convertir en minuscules
|
|
||||||
let slug = title.toLowerCase();
|
|
||||||
|
|
||||||
// Normaliser les caractères (supprimer les accents) - comme WordPress
|
|
||||||
slug = slug.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
||||||
|
|
||||||
// Remplacer les ligatures (comme WordPress remove_accents)
|
|
||||||
slug = slug.replace(/œ/g, 'oe').replace(/æ/g, 'ae');
|
|
||||||
|
|
||||||
// Remplacer les points par des tirets (comme WordPress)
|
|
||||||
slug = slug.replace(/\./g, '-');
|
|
||||||
|
|
||||||
// Remplacer les caractères spéciaux
|
|
||||||
slug = slug.replace(/[«»"'?!:;,()[\]{}/\\|&@#$%*+=<>~`^°…—–−]/g, '');
|
|
||||||
|
|
||||||
// Remplacer leespaces et caractères de contrôle par des tirets
|
|
||||||
slug = slug.replace(/[\s\t\n\r]+/g, '-');
|
|
||||||
|
|
||||||
// Supprimer les caractères non alphanumériques restants (sauf tirets)
|
|
||||||
slug = slug.replace(/[^a-z0-9\-]/g, '');
|
|
||||||
|
|
||||||
// Remplacer les tirets multiples par un seul tiret
|
|
||||||
slug = slug.replace(/-+/g, '-');
|
|
||||||
|
|
||||||
// Supprimer les tirets en début et fin
|
|
||||||
slug = slug.replace(/^-+|-+$/g, '');
|
|
||||||
|
|
||||||
// S'assurer que l'ancre n'est pas vide
|
|
||||||
if (!slug) {
|
|
||||||
slug = 'anchor';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Limiter la longueur (comme sanitize_title() de WordPress - 200 caractères)
|
|
||||||
if (slug.length > 200) {
|
|
||||||
slug = slug.substring(0, 200);
|
|
||||||
slug = slug.replace(/-+$/, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
return slug;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function injectIdToNativeTitles(): void {
|
|
||||||
const titles = document.querySelectorAll('.content-area h2, .content-area h3');
|
|
||||||
titles.forEach((title) => {
|
|
||||||
const titleText = title.textContent || '';
|
|
||||||
const slug = sanitizeTitle(titleText);
|
|
||||||
title.setAttribute('id', slug);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user