Eliminar entrada con todos los archivos adjuntos

26 jun 2011, 22:09:02
Vistas: 21.2K
Votos: 7

En mi sitio tengo múltiples autores que pueden añadir/editar/eliminar entradas personalizadas y subir (adjuntar) imágenes a esas entradas. El problema es que cuando eliminan sus entradas, los archivos adjuntos permanecen en el servidor. Por lo tanto, me gustaría eliminar todos los archivos adjuntos a la entrada cuando esta sea eliminada. ¿Alguien puede compartir un ejemplo de cómo se hace?

0
Todas las respuestas a la pregunta 4
2
16

Escribí la siguiente función que utiliza la lógica sugerida por @rarst en su respuesta.

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

IMPORTANTE: Ten en cuenta que ¡solo se llamará cuando las publicaciones se eliminen permanentemente de la papelera! Si deseas cambiar este comportamiento, incluye la siguiente línea en tu archivo wp-config.php:

define('EMPTY_TRASH_DAYS', 0);

Si esta constante se establece en 0, la funcionalidad de la papelera se desactivará y aparecerá el botón 'Eliminar permanentemente' en lugar del botón 'Papelera'. Si haces clic en el botón 'Eliminar permanentemente', el elemento se borrará inmediatamente sin ningún mensaje de alerta.

(Del Codex)

6 oct 2017 23:14:52
Comentarios

Funcionó para mí - Agregué una verificación para aplicar esto solo en un tipo de publicación específico, y todo funcionó perfectamente.

Stender Stender
6 dic 2017 12:08:30

No funciona en mi caso, la publicación se elimina y el adjunto se borra de la biblioteca de medios, pero el archivo con sus otros tamaños todavía existe en la carpeta.

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

WP no hace esto por defecto ya que no hay garantía de que el adjunto no esté siendo utilizado por alguna otra publicación.

La lógica básica sería engancharse a delete_post, consultar los adjuntos hijos y ejecutar wp_delete_attachment() en cada uno.

Hice una búsqueda rápida en el repositorio de plugins y encontré un pequeño plugin que hace exactamente eso (parece no estar mantenido, así que prueba antes de usar) - Post Data Delete Advanced.

27 jun 2011 00:54:50
Comentarios

Solo para notar, siguiendo tu lógica básica, tuve éxito al usar before_delete_post en lugar de delete_post. Quizás para cuando se ejecuta delete_post, los metadatos del post ya han sido eliminados (los cuales son necesarios para que wp_delete_attachment funcione correctamente).

henrywright henrywright
15 ago 2014 19:21:49

Lo mismo aquí... después de realizar algunas pruebas me he dado cuenta de que cuando eliminas el post, los datos de 'post_parent' son eliminados de todos los archivos adjuntos relacionados.

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

Ampliando otras respuestas aquí para usar solo con un tipo de publicación específico.

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

}

Esto eliminará todos los archivos adjuntos cuando una publicación sea borrada permanentemente.

21 may 2019 21:14:24
0

¿Alguien todavía busca una solución sencilla? Entonces prueba el siguiente plugin, funciona con publicaciones/páginas normales y tipos de publicaciones personalizados - Eliminar Publicación con Adjuntos

17 nov 2021 09:30:07