Eliminare un post con tutti i file allegati
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?
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)

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

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.

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
).

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.

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
