Eliminar entrada con todos los archivos adjuntos
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?

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)

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

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.

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

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.

¿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
