Șterge postarea împreună cu toate fișierele atașate
Pe site-ul meu am mai mulți autori care pot adăuga/edita/șterge postări personalizate și pot încărca (atașa) imagini la aceste postări. Problema este că atunci când ei șterg postările, atașamentele rămân pe server. Astfel, aș dori să elimin toate fișierele atașate postării atunci când aceasta este ștearsă. Poate cineva să împărtășească un exemplu despre cum se face acest lucru?

Am scris următoarea funcție care folosește logica sugerată de @rarst în răspunsul său.
add_action( 'before_delete_post', function( $id ) {
$attachments = get_attached_media( '', $id );
foreach ($attachments as $attachment) {
wp_delete_attachment( $attachment->ID, 'true' );
}
} );
IMPORTANT: Rețineți că va fi apelată doar când articolele sunt șterse definitiv din coșul de gunoi! Dacă doriți să modificați acest comportament, includeți următoarea linie în fișierul wp-config.php
:
define('EMPTY_TRASH_DAYS', 0);
Dacă această constantă este setată la 0, funcționalitatea coșului de gunoi va fi dezactivată și butonul 'Șterge definitiv' va apărea în locul butonului 'Coș de gunoi'. Dacă apăsați butonul 'Șterge definitiv', elementul va fi șters imediat fără niciun mesaj de avertizare.
(Din Codex)

A funcționat pentru mine - Am adăugat o verificare pentru a aplica acest lucru doar pe un anumit tip de postare și totul a funcționat perfect.

WP nu face acest lucru implicit, deoarece nu există nicio garanție că fișierul atașat nu este încă utilizat de alt articol.
Logica de bază ar fi să folosești hook-ul delete_post
, să interoghezi pentru fișierele atașate copil și să rulezi wp_delete_attachment()
pentru fiecare.
Am făcut o căutare rapidă în depozitul de plugin-uri și am găsit un mic plugin care face exact asta (pare neîntreținut, așa că testează înainte de utilizare) - Post Data Delete Advanced.

Doar ca o observație, urmând logica ta de bază, am avut succes când am folosit before_delete_post
în loc de delete_post
. Probabil că până când delete_post
este executat, metadatele postului au fost deja eliminate (care sunt necesare pentru ca wp_delete_attachment
să funcționeze corect).

Extinzând alte răspunsuri de aici pentru utilizarea doar cu un anumit tip de postare.
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' );
}
}
}
Acest cod va șterge toate fișierele media atașate atunci când o postare este ștearsă definitiv.

Dacă cineva încă caută o soluție simplă, poate încerca următorul plugin care funcționează atât cu articolele/paginile obișnuite, cât și cu tipurile personalizate de postări - Șterge Postarea cu Atașamente
