Suppression automatique des pièces jointes des articles mis à la poubelle

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Ce code permet de supprimer automatiquement les pièces jointes des articles mis à la poubelle sauf si ces pièces jointes sont utilisées par d’autres articles.

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/optimiser.php3 de SPIP version 1.6 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/optimiser.php3

Remplacer les lignes suivantes (38 à 43) :

//
// 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 --------------------

Discussion

Une discussion

  • 2

    Tres interessant !
    Quelqu’un aurait-il la meme chose pour les rubriques ?
    Merci !

    • J’ai essayé d’utiliser ce code avec la version 1.7.2 et il ne me semble pas que cela fonctionne (images ajoutées aux articles non supprimées).Est-ce que ce code fonctionne avec les versions de supérieures supérieure à la 1.6 ??

    • Equipement

      Comme je l’ai indiqué, j’ai modifié une partie du code du fichier ecrire/optimiser.php3 de SPIP version 1.6. Je n’ai effectué aucun test sur d’autres versions de SPIP.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom