web-dev-qa-db-fra.com

Supprimer le post avec tous les fichiers attachés

Sur mon site, j'ai plusieurs auteurs qui peuvent ajouter/modifier/supprimer des publications personnalisées et télécharger (joindre) des images à ces publications. Le problème est que, lorsqu'ils suppriment leurs publications, les pièces jointes restent sur le serveur. Donc, je voudrais me débarrasser de tous les fichiers joints à la publication lorsque celle-ci est supprimée. Quelqu'un peut-il partager et illustrer comment c'est fait?

5
Kovas

WP ne le fait pas par défaut, car rien ne garantit que la pièce jointe n'est pas encore utilisée par une autre publication.

La logique de base consisterait à se connecter à delete_post, à rechercher des pièces jointes enfants et à exécuter wp_delete_attachment() sur chaque.

J'ai fait une recherche rapide dans le référentiel de plug-in et suis arrivé à un minuscule plug-in qui ne fait que ça (semble ne plus être maintenu, donc testez avant de l'utiliser) - Post Data Delete Advanced .

3
Rarst

J'ai écrit la fonction suivante qui utilise la logique suggérée par @rarst dans sa réponse.

add_action( 'before_delete_post', function( $id ) {
  $attachments = get_attached_media( '', $id );
  foreach ($attachments as $attachment) {
    wp_delete_attachment( $attachment->ID, 'true' );
  }
} );

IMPORTANT: Gardez à l'esprit il ne sera appelé que lorsque les messages seront définitivement supprimés de la corbeille!} [ Si vous souhaitez modifier ce comportement, incluez le ligne suivante dans votre fichier wp-config.php:

define('EMPTY_TRASH_DAYS', 0);

Si cette constante est définie sur 0, la fonctionnalité de corbeille sera désactivée et le bouton "Supprimer définitivement" apparaîtra au lieu du bouton "Corbeille". Si vous cliquez sur le bouton "Supprimer définitivement", l'élément sera immédiatement supprimé sans message d'alerte.

(Du Codex )

7

Développez d'autres réponses ici pour une utilisation avec un type de message spécifique uniquement.

add_action( 'before_delete_post', 'delete_all_attached_media' );

function delete_all_attached_media( $post_id ) {

  if( get_post_type($post_id) == "post" ) {
    $attachments = get_attached_media( '', $post_id );

    foreach ($attachments as $attachment) {
      wp_delete_attachment( $attachment->ID, 'true' );
    }
  }

}

Cela supprimera tous les médias attachés quand un message est définitivement supprimé.

1
adambware