195 lines
6.4 KiB
PHP
195 lines
6.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Fonction déclenchée lors de la sauvegarde d'un article via ACF
|
|
*
|
|
* Cette fonction gère la relation entre les articles et les revues :
|
|
* - Assure qu'un article n'appartient qu'à une seule revue à la fois
|
|
* - Met à jour un post meta qui duplique le numero de revue contenu dans l'acf 'revue' pour simplifier les recherches pivots
|
|
* - Retire l'article de toutes les autres revues s'il est assigné à une nouvelle revue
|
|
*
|
|
* @param int $post_id L'ID du post en cours de sauvegarde
|
|
* @return void
|
|
*/
|
|
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;
|
|
|
|
// Récupérer la revue associée à cet article
|
|
$related_revue_ID = get_field('related_revue', $current_article_ID);
|
|
|
|
// Si aucune revue n'est associée, effacer le numéro dans le meta, et enlever cet article de l'index de toutes les revues
|
|
if (!$related_revue_ID) {
|
|
update_post_meta($current_article_ID, 'revue_issue_number', null);
|
|
dynamiques_article_remove_articles_from_all_revues($current_article_ID);
|
|
}
|
|
|
|
// Si une revue est associée, effectuer les mises à jour nécessaires
|
|
if ($related_revue_ID && is_numeric($related_revue_ID) && $related_revue_ID !== '') {
|
|
// Retirer l'article de toutes les autres revues (que celle sélectionnée)
|
|
dynamiques_article_remove_articles_from_all_other_revues($current_article_ID, $related_revue_ID);
|
|
// Ajouter l'article à la revue sélectionnée
|
|
dynamiques_article_include_article_in_revue_articles_array($current_article_ID, $related_revue_ID);
|
|
// Mettre à jour le numéro d'issue de l'article
|
|
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);
|
|
|
|
|
|
/**
|
|
* Ajoute un article dans le tableau des articles d'une revue
|
|
*
|
|
* Cette fonction permet d'inclure un article spécifique dans la liste des articles
|
|
* d'une revue donnée. Elle récupère la liste actuelle des articles de la revue,
|
|
* y ajoute le nouvel article et met à jour le champ ACF 'articles' de la revue.
|
|
*
|
|
* @param int $current_article_ID L'ID de l'article à ajouter
|
|
* @param int $related_revue_ID L'ID de la revue dans laquelle ajouter l'article
|
|
* @return void
|
|
*/
|
|
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);
|
|
|
|
// S'assurer qu'on a un tableau valide
|
|
if (!is_array($related_revues_articles)) {
|
|
$related_revues_articles = [];
|
|
}
|
|
|
|
// Ajouter l'article à la liste
|
|
$related_revues_articles[] = $current_article;
|
|
|
|
// Mettre à jour le champ ACF 'articles' de la revue
|
|
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',
|
|
),
|
|
),
|
|
));
|
|
|
|
if ($revues_containing_article->have_posts()) {
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
function dynamiques_article_remove_articles_from_all_other_revues($current_article_ID, $related_revue_ID)
|
|
{
|
|
|
|
$revues_containing_article = new WP_Query(array(
|
|
'post_type' => 'revues',
|
|
'post__not_in' => array($related_revue_ID),
|
|
'meta_query' => array(
|
|
array(
|
|
'key' => 'articles',
|
|
'value' => '"' . $current_article_ID . '"',
|
|
'compare' => 'LIKE',
|
|
),
|
|
),
|
|
));
|
|
|
|
if ($revues_containing_article->have_posts()) {
|
|
|
|
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';
|
|
}
|
|
|
|
// Ajouter un préfixe si l'ancre commence par un chiffre
|
|
if (preg_match('/^[0-9]/', $slug)) {
|
|
$slug = 'anchor-' . $slug;
|
|
}
|
|
|
|
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);
|