carhop__dynamiques-theme__P.../includes/article.php
Nonimart 71ee6d1bb6
Some checks failed
continuous-integration/drone/push Build is failing
REFACTOR optimizing injecting id to h2 by injecting in php instead of javascript
2025-08-21 15:05:57 +02:00

122 lines
3.5 KiB
PHP

<?php
function dynamiques_article_save_post($post_id)
{
$current_article_ID = $post_id;
$post_type = get_post_type($post_id);
if ($current_article_ID && $post_type !== 'articles') return;
$related_revue_ID = get_field('related_revue', $current_article_ID);
dynamiques_article_remove_articles_from_all_revues($current_article_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);
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);
function dynamiques_article_include_article_in_revue_articles_array($current_article_ID, $related_revue_ID)
{
$current_article = get_post($current_article_ID);
$related_revues_articles = get_field('articles', $related_revue_ID);
if (!is_array($related_revues_articles)) {
$related_revues_articles = [];
}
$related_revues_articles[] = $current_article;
update_field('articles', $related_revues_articles, $related_revue_ID);
}
function dynamiques_article_remove_articles_from_all_revues($current_article_ID)
{
$revues_containing_article = new WP_Query(array(
'post_type' => 'revues',
'meta_query' => array(
array(
'key' => 'articles',
'value' => '"' . $current_article_ID . '"',
'compare' => 'LIKE',
),
),
));
foreach ($revues_containing_article->posts as $revue) {
$revue_ID = $revue->ID;
$revue_articles = get_field('articles', $revue_ID);
$revue_articles = array_filter($revue_articles, function ($article) use ($current_article_ID) {
return (is_object($article) && isset($article->ID)) ? $article->ID != $current_article_ID : $article != $current_article_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);