Eliminare un post con tutti i file allegati

26 giu 2011, 22:09:02
Visualizzazioni: 21.2K
Voti: 7

Sul mio sito ho diversi autori che possono aggiungere/modificare/eliminare post personalizzati e caricare (allegare) immagini a questi post. Il problema è che quando eliminano i loro post, gli allegati rimangono sul server. Vorrei quindi eliminare tutti i file allegati al post quando questo viene cancellato. Qualcuno può condividere un esempio di come si fa?

0
Tutte le risposte alla domanda 4
2
16

Ho scritto la seguente funzione che utilizza la logica suggerita da @rarst nella sua risposta.

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

IMPORTANTE: Tieni presente che verrà chiamata solo quando i post vengono eliminati definitivamente dal cestino! Se vuoi modificare questo comportamento, includi la seguente riga nel tuo file wp-config.php:

define('EMPTY_TRASH_DAYS', 0);

Se questa costante è impostata a 0, la funzionalità del cestino sarà disabilitata e apparirà il pulsante 'Elimina definitivamente' invece del pulsante 'Cestino'. Se clicchi sul pulsante 'Elimina definitivamente', l'elemento verrà immediatamente eliminato senza alcun messaggio di avviso.

(Dal Codex)

6 ott 2017 23:14:52
Commenti

Ha funzionato per me - Ho aggiunto un controllo per applicarlo solo a un tipo di post specifico e tutto ha funzionato perfettamente.

Stender Stender
6 dic 2017 12:08:30

Non funziona nel mio caso, il post viene eliminato e l'allegato viene rimosso dalla libreria multimediale, ma il file con le altre dimensioni esiste ancora nella cartella.

Sam Tyurenkov Sam Tyurenkov
10 apr 2020 01:47:45
2

WP non lo fa di default poiché non c'è alcuna garanzia che l'allegato non sia ancora utilizzato da qualche altro articolo.

La logica di base sarebbe quella di agganciarsi a delete_post, interrogare per gli allegati figli ed eseguire wp_delete_attachment() su ciascuno.

Ho fatto una rapida ricerca nel repository dei plugin e ho trovato un piccolo plugin che fa esattamente questo (sembra non più mantenuto, quindi testare prima dell'uso) - Post Data Delete Advanced.

27 giu 2011 00:54:50
Commenti

Solo per informazione, seguendo la tua logica di base, ho avuto successo usando before_delete_post invece di delete_post. Forse quando viene eseguito delete_post, i metadati del post sono già stati rimossi (e sono necessari per il corretto funzionamento di wp_delete_attachment).

henrywright henrywright
15 ago 2014 19:21:49

Anche qui... dopo aver eseguito alcuni test ho notato che quando elimini un post, i dati 'post_parent' vengono rimossi da tutti gli allegati correlati.

Luis Rivera Luis Rivera
28 set 2019 20:05:47
0

Estensione delle altre risposte qui presenti per l'utilizzo con un solo tipo specifico di post.

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

}

Questo codice eliminerà tutti i media allegati quando un post viene eliminato definitivamente.

21 mag 2019 21:14:24
0

Se stai ancora cercando una soluzione semplice, prova il seguente plugin che funziona con post/pagine normali e tipi di post personalizzati - Elimina Post con Allegati

17 nov 2021 09:30:07