Un article qui a été mis à la poubelle est supprimé physiquement de la base de
données 24 heures après par un mécanisme d’optimisation de la base. Toutefois
les pièces jointes de cet article ne sont pas supprimées par SPIP. En effet, les
concepteurs de SPIP indiquent dans leur forum qu’il est possible d’insérer dans
le texte d’un article un lien vers une pièce jointe d’un autre article et que
dans ce cas la suppression de la pièce jointe serait préjudiciable à l’article
qui contient le lien. Ainsi, on risque d’avoir un volume croissant de pièces
jointes devenues inutiles.
Aussi, j’ai modifié une partie du code du fichier ecrire/inc_optimiser.php3 de
SPIP afin d’obtenir le fonctionnement suivant :
a) si les pièces jointes à l’article, qui a été mis à la poubelle, ne sont pas
utilisées dans le texte d’autres articles (lien ou ou ), alors l’article et ses
pièces jointes sont supprimés au moins 24 heures après.
b) si les pièces jointes à l’article, qui a été mis à la poubelle, sont
utilisées dans le texte d’autres articles (lien ou ou ), alors l’article et ses
pièces jointes ne sont pas supprimés. En effet, si l’article était supprimé, on
n’aurait plus la possibilité de supprimer manuellement ses pièces jointes.
Dans ecrire/inc_optimiser.php3
Remplacer les lignes suivantes (50 à 55) :
//
// Articles
//
$query = "DELETE FROM spip_articles WHERE statut='poubelle' AND maj < $mydate";
spip_query($query);
par le code suivant :
//
// Articles
//
//---------------- Début ajout ----------------
// On désactive l’ancien code
// $query = "DELETE FROM spip_articles WHERE statut='poubelle' AND maj <
$mydate";
// spip_query($query);
// pour effacer les documents joints aux articles à supprimer
// lister les articles à supprimer
$query = "SELECT id_article FROM spip_articles WHERE statut='poubelle' AND maj <
$mydate";
$result = spip_query($query);
while ($row = spip_fetch_array($result)) $ciarticles[] = $row['id_article'];
if ($ciarticles) {
$ciarticles = join(",", $ciarticles);
// lister les documents joints aux articles à supprimer
$query = "SELECT id_document FROM spip_documents_articles WHERE
id_article IN ($ciarticles)";
$result = spip_query($query);
while ($row = spip_fetch_array($result))
{
$iddocument = $row['id_document'];
$utile = false;
// vérifier si les documents ne sont pas utilisés dans le texte
d'autres articles
$querydoc = "SELECT id_article FROM spip_articles WHERE
statut!='poubelle' AND (texte LIKE '%<doc$iddocument|%' OR texte LIKE
'%<emb$iddocument|%' OR texte LIKE '%<img$iddocument|%')";
$resultdoc = spip_query($querydoc);
if ($row = @spip_fetch_array($resultdoc)) {
$cidocschindler[] = $iddocument;
} else {
$cidocuments[] = $iddocument;
}
}
// supprime les documents joints aux articles à supprimer sauf s'ils sont
utilisés dans le texte d'autres articles
if ($cidocuments) {
$cidocuments = join(",", $cidocuments);
$query = "SELECT id_document, id_vignette, fichier FROM
spip_documents WHERE id_document IN ($cidocuments)";
$result = spip_query($query);
while ($row = spip_fetch_array($result)) {
$fichier = $row['fichier'];
$fichier = "../".$fichier;
$id_document = $row['id_document'];
$id_vignette = $row['id_vignette'];
spip_query("DELETE FROM spip_documents WHERE
id_document=$id_document");
spip_query("UPDATE spip_documents SET id_vignette=0 WHERE
id_vignette=$id_document");
spip_query("DELETE FROM spip_documents_articles WHERE
id_document=$id_document");
@unlink($fichier);
if ($id_vignette > 0) {
$query = "SELECT id_vignette, fichier FROM
spip_documents WHERE id_document=$id_vignette";
$result = spip_query($query);
if ($row = spip_fetch_array($result)) {
$fichier = $row['fichier'];
@unlink($fichier);
}
spip_query("DELETE FROM spip_documents WHERE
id_document=$id_vignette");
spip_query("DELETE FROM spip_documents_articles WHERE
id_document=$id_vignette");
}
}
}
}
if ($cidocschindler) {
$cidocschindler = join(",", $cidocschindler);
$query = "SELECT id_article FROM spip_documents_articles
WHERE id_document IN ($cidocschindler)";
$result = spip_query($query);
while ($row = spip_fetch_array($result))
$ciartschindler[] = $row['id_article'];
$ciartschindler = join(",", $ciartschindler);
$query = "DELETE FROM spip_articles WHERE
statut='poubelle' AND maj < $mydate AND id_article NOT IN ($ciartschindler)";
spip_query($query);
} else {
$query = "DELETE FROM spip_articles WHERE
statut='poubelle' AND maj < $mydate";
spip_query($query);
}
//--------------- Fin ajout --------------------