it-swarm.com.de

Löschen Sie den Beitrag mit allen an ihn angehängten Dateien

Auf meiner Website gibt es mehrere Autoren, die benutzerdefinierte Beiträge hinzufügen/bearbeiten/löschen und Bilder an diese Beiträge anhängen können. Das Problem ist - wenn sie ihre Beiträge löschen, bleiben die Anhänge auf dem Server. Daher möchte ich alle an den Beitrag angehängten Dateien entfernen, wenn er gelöscht wird. Kann mir jemand ein Beispiel geben, wie es gemacht wird?

5
Kovas

WP tut dies nicht standardmäßig, da es keine Garantie gibt, dass der Anhang nicht noch von einem anderen Beitrag verwendet wird.

Grundlegende Logik wäre, sich in delete_post einzuhängen, nach untergeordneten Anhängen zu fragen und wp_delete_attachment() für jeden auszuführen.

Ich habe schnell im Plugin-Repository gesucht und ein winziges Plugin gefunden, das genau das tut (scheint nicht gepflegt zu sein, testen Sie es vor der Verwendung) - Post Data Delete Advanced .

3
Rarst

Ich habe die folgende Funktion geschrieben, die die von @rarst in seiner Antwort vorgeschlagene Logik verwendet.

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

WICHTIG:Denken Sie daran,wird nur aufgerufen, wenn die Posts endgültig aus dem Papierkorb gelöscht werden!Wenn Sie dies ändern möchten Fügen Sie die folgende Zeile in Ihre wp-config.php-Datei ein:

define('EMPTY_TRASH_DAYS', 0);

Wenn diese Konstante auf 0 gesetzt ist, wird die Papierkorbfunktion deaktiviert und die Schaltfläche "Dauerhaft löschen" anstelle der Schaltfläche "Papierkorb" angezeigt. Wenn Sie auf die Schaltfläche "Dauerhaft löschen" klicken, wird das Element sofort ohne Warnmeldung gelöscht.

(Aus dem Codex )

7

Erweitere andere Antworten hier, um sie nur für einen bestimmten Beitragstyp zu verwenden.

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' );
    }
  }

}

Dadurch werden alle angehängten Medien gelöscht, wenn ein Beitrag endgültig gelöscht wird.

1
adambware