Șterge postarea împreună cu toate fișierele atașate

26 iun. 2011, 22:09:02
Vizualizări: 21.2K
Voturi: 7

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?

0
Toate răspunsurile la întrebare 4
2
16

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)

6 oct. 2017 23:14:52
Comentarii

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.

Stender Stender
6 dec. 2017 12:08:30

Nu funcționează în cazul meu, postarea este ștearsă și atașamentul este eliminat din biblioteca media, dar fișierul cu celelalte dimensiuni ale sale există în continuare în folder.

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

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.

27 iun. 2011 00:54:50
Comentarii

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

henrywright henrywright
15 aug. 2014 19:21:49

La fel și aici... după ce am făcut câteva teste, am observat că atunci când ștergi un post, datele 'post_parent' sunt eliminate de la toate atașamentele asociate.

Luis Rivera Luis Rivera
28 sept. 2019 20:05:47
0

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.

21 mai 2019 21:14:24
0

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

17 nov. 2021 09:30:07