Haga que WordPress wp_delete_attachment elimine archivos de una carpeta personalizada predefinida

3 minutos de lectura

avatar de usuario
Richard Tinkler

Hemos creado un tipo de publicación personalizada que permite a nuestro cliente cargar archivos en una carpeta fuera de la carpeta de carga estándar de WordPress (wp-content/upload-assets). Estos archivos deben manejarse por separado de la carpeta wp-content/uploads estándar y es por eso que NO PODEMOS usar

define( 'UPLOADS', 'mycustomfolder' );

en el wp-config.php.

En su lugar, usamos esto para cambiar temporalmente la carpeta de cargas a wp-content/upload-assets:

add_filter('upload_dir', 'my_upload_dir');
$uploaded_file = wp_handle_upload($_FILES['xxxx_image'], $upload_overrides);
remove_filter('upload_dir', 'my_upload_dir');

Estamos usando esto para eliminar todos los archivos adjuntos de una publicación en particular:

add_filter('upload_dir', 'my_upload_dir');
$attachments = get_posts( array(
            'post_type'      => 'attachment',
            'posts_per_page' => -1,
            'post_status'    => 'any',
            'post_parent'    => $pid
) );

foreach ( $attachments as $attachment ) {
   if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
      echo 'Attachment could not be deleted.';
   }
}
remove_filter('upload_dir', 'my_upload_dir');

wp_delete_attachment también debería eliminar todos los archivos asociados del disco, pero no funciona porque nuestros archivos están en nuestra carpeta personalizada (wp-content/upload-assets).

Aquí está el código para nuestra función my_upload_dir:

function my_upload_dir($upload) {
    $upload['subdir']   = '';
    $upload['basedir']  = WP_CONTENT_DIR;
    $upload['baseurl']  = WP_CONTENT_URL;
    $upload['path']     = $upload['basedir'] . '/upload-assets';
    $upload['url']      = $upload['baseurl'] . '/upload-assets';
    return $upload;
}

¿Cómo hacemos que wp_delete_attachment elimine los archivos en nuestra carpeta personalizada wp-content/upload-assets?

  • Primero eche un vistazo a la GUID de archivos adjuntos si realmente están en la carpeta personalizada.

    – Rechonchos

    30 de junio de 2016 a las 10:54

  • @Ervald – Sí. ¡Definitivamente en la carpeta personalizada!

    -Richard Tinkler

    30 de junio de 2016 a las 11:17


  • ¿Tiene los permisos correctos para esa carpeta igual que los predeterminados?

    – Rechonchos

    30 de junio de 2016 a las 11:23

  • @Ervald – Sí. Puedo eliminar manualmente usando desvincular para que los permisos estén bien.

    -Richard Tinkler

    30 de junio de 2016 a las 12:05

  • Teniendo este mismo problema… ¿Conseguiste encontrar una solución?

    – Swen

    11 de enero de 2018 a las 11:44

avatar de usuario
chipdey deepti

Hola, puede hacerlo de esta manera si desea eliminar el archivo, pero no eliminará todos los metacampos, taxonomía, comentarios, etc. asociados con el archivo adjunto.

Espero que esto ayude

foreach ( $attachments as $attachment ) {
  if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
    $file = get_attached_file( $attachment->ID );
    $file = str_replace( "uploads", "upload-assets", $file);
     wp_delete_file( $file );
   }
 }

No he probado este código, pero espero que funcione

Permaneciendo en el dominio de la pregunta actual, puede usar el filtro “get_attached_file” para modificar directamente la cadena de ruta del archivo utilizada para tomar la ruta del archivo que se eliminará. Agregue específicamente esta función a su functions.php

function sr_update_uploads_directory( $file )
{
    return str_replace( "uploads", "upload-assets", $file) // Change path to upload-assets from uploads
}
add_filter( 'get_attached_file', 'sr_update_uploads_directory' );

No tengo tiempo para probar actualmente. Entonces, discúlpame por eso. Espero eso ayude. 🙂

¿Ha sido útil esta solución?