FIX Correction des problèmes de réorganisation inintentionnel du tableau des posts lors de la sauvegarde darticles
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Nonimart 2025-09-18 11:43:29 +02:00
parent 620ff09eb6
commit c4bc0b9557

View File

@ -1,40 +1,77 @@
<?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);
dynamiques_article_remove_articles_from_all_revues($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(
@ -46,14 +83,45 @@ function dynamiques_article_remove_articles_from_all_revues($current_article_ID)
),
));
foreach ($revues_containing_article->posts as $revue) {
$revue_ID = $revue->ID;
$revue_articles = get_field('articles', $revue_ID);
if ($revues_containing_article->have_posts()) {
$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);
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);
}
}
}