Cómo hacer para que se borren los adjuntos cuando borras una entrada

En WordPress, cuando borras una entrada, página o cualquier otro tipo de contenido, no se borran automáticamente los archivos de medios adjuntos a la misma, siguen ahí.

Esto es debido a que el hecho de que subas, por ejemplo, una imagen para mostrarla en una entrada no significa que no puedas usarla en otros contenidos.

De hecho es práctica común, y hasta recomendable, o al menos no subir la misma imagen varias veces.

Pero, como en todo, hay ocasiones en que sí que es viable, hasta recomendable, que se borren los adjuntos a una entrada al borrarla.

Es más, yo ni siquiera había caído en ello, básicamente porque ningún cliente me lo había pedido nunca, y a mi no me había surgido el asunto.

Pero mira por donde, un buen amigo me preguntó que cómo se hacía, y la verdad es que al menos sí tenía claro cómo hacerlo, por otros proyectos en que había tenido que hacer cosas parecidas, no lo mismo, pero sí parecidas.

Para empezar ¿por qué borrar una entrada, no es malo para el SEO y tal?

¿Quién ha dicho que borrar un contenido sea malo para el SEO?

Lo que es malo para el SEO es ofrecer enlaces rotos o contenido pobre a buscadores y usuarios, pero eso no significa que no puedas borrar contenidos. De hecho es incluso muchas veces recomendable.

Un exceso de URLs, sobre todo si son de thin content o hay una canibalización de palabras clave, es absolutamente perjudicial para el SEO, y deberías darle solución:

  • Mejorar el contenido de esas URLs.
  • Borrar esos contenidos y hacer una redirección a otros contenidos que dé respuesta a las mismas búsquedas.

Si tienes más interés en todo este asunto no te pierdas esta presentación que hizo Fernando Muñoz en el evento Barna Encendida que celebra SiteGround cada año…

¿Aclarado? Pero sobre todo ¿entendido?

Ya, pero, ¿por qué borrar los adjuntos?

Pues por muchos posibles motivos, pero muchos relacionados también con el SEO.

  • Borrados en directorios de empresas.
  • Borrados en webs de inmobiliarias.
  • Borrado de relaciones comerciales.
  • Borrado de contenidos muy específicos.

No tiene sentido que si borras un contenido muy concreto, con imágenes u otros archivos totalmente asociados a ese contenido, dejes ahí los adjuntos, recibiendo tráfico al que ofrecen poco o nada contenido. ¿Lo pillas?

Y luego hay cuestiones legales, de protección de marcas, o simplemente por ahorrar espacio en tu hosting, un sinfín de posibles motivos.

Vaaamos que te enrollas ¿cómo se borran adjuntos al borrar una entrada?

¡Venga vaaa!

Es que hay gente que necesita preliminares, pero vamos al grano.

Vas a ver que borrar adjuntos al borrar una entrada, o una página o cualquier tipo de contenido (CPT) es muy fácil.

Cómo borrar los adjuntos al borrar cualquier tipo de contenido

Pues solo tienes que añadir una acción que fuerce el borrado de los adjuntos a una entrada al archivo functions.php de tu tema activo o a tu plugin de personalizaciones, así:

//Borrar adjuntos al borrar la entrada
add_action( 'before_delete_post', function( $id ) {
  $attachments = get_attached_media( '', $id );
  foreach ($attachments as $attachment) {
    wp_delete_attachment( $attachment->ID, 'true' );
  }
} );

Lo que hace este código es, mediante wp_delete_attachment, lanzar el gancho de acción delete_attachment que borrará los adjuntos a las entradas/páginas/etc, y todos sus derivados, como miniaturas, tamaños, etc.

Chulo ¿eh?

El único requisito es que los adjuntos solo se borrarán cuando el contenido se haya borrado del todo, no si está en la papelera.

Así que, una de dos, o vacías la papelera frecuentemente, o cambias el periodo de vaciado automático de la papelera en el archivo wp-config.php.

¿Y si solo quiero que funcione en un tipo de contenido concreto?

Eso es lo ideal, de hecho, porque este tipo de necesidades suelen darse casi siempre para tipos de contenido concretos: proyectos, catálogos, productos, propiedades, y todo ese tipo de CPTs que añaden plugins y temas que, como te comentaba arriba, en ocasiones hay que borrar, y no tendría sentido tener por ahí sus adjuntos.

En este caso tendrías que personalizar un poco el código anterior, para especificar a qué tipos de contenido se aplicará la acción:

//Borrar adjuntos del CPT cuyo slug es 'project'
add_action( 'before_delete_post', 'delete_all_attached_media' );
function delete_all_attached_media( $post_id ) {
  if( get_post_type($post_id) == "product" ) {
    $attachments = get_attached_media( '', $post_id );
    foreach ($attachments as $attachment) {
      wp_delete_attachment( $attachment->ID, 'true' );
    }
  }
}

En este ejemplo le he indicado al gancho que solo se aplique al tipo de contenido cuyo slug es ‘product‘, vamos, un producto de WooCommerce. Luego tú lo adaptas a tu necesidad.

Oye, precioso y práctico ¿no hay un plugin por ahí que …?

A ver, métete esto en la cabeza:

Los plugins son geniales pero siempre dependerás de otros. Anímate a «tocar» código y serás más libre y sabio.

Dicho esto, sí, yo al menos he encontrado un plugin que se dedica a esta cosa de borrar los adjuntos cuando borras una entrada (o lo que sea).

Se llama Autoremove Attachments, vamos, de lo que estamos hablando.

El plugin funcionará igual que el primer código que te he compartido arriba, borrando todos los adjuntos (y derivados) al borrar permanentemente una entrada, página o cualquier otro tipo de contenido. Vamos, cuando vacíes la papelera.

En principio no discrimina entre tipos de contenido, pero puedes añadir un filtro a tu archivo de personalizaciones (functions.php o plugin personalizado aparte), así:

function autoremove_attachments_custom_rule() {
    // Global variables.
    global $post_id;
    // Variables.
    $post_type          = get_post_type( $post_id );
    $allowed_post_types = array(
        'project',
        'product',
    );
    // Default return value.
    $allowed_to_remove = false;
    // Custom rules for removing attachments.
    if ( in_array( $post_type, $allowed_post_types ) ) {
        $allowed_to_remove = true;
    }
    // Return.
    return $allowed_to_remove;
}
add_filter( 'autoremove_attachments_allowed', 'autoremove_attachments_custom_rule' );

En el filtro anterior se aplicará la funcionalidad del plugin solamente a los tipos de contenido project y product, pero puedes personalizarlo, añadiendo otros, cambiándolos, lo que necesites.

Vamos, lo mismo que en el segundo código que tienes arriba pero además tienes que instalar el plugin ¿me vas entendiendo por dónde voy?

¿Ya está?

Claro, ¿qué más quieres?

¡Que lo borres bien!

VALORA Y COMPARTE ESTE ARTÍCULO PARA MEJORAR LA CALIDAD DEL BLOG…
(6 votos, promedio: 5)
¿Te gustó este artículo? ¡No sabes lo que te estás perdiendo en YouTube!

Autor: Fernando Tellado

Fernando Tellado, apasionado de WordPress, profesor, consultor y ponente. Maquero cansino, padre de tres hijos y de una perrita Beagle, Bilbaíno de nacimiento, Español de corazón y ciudadano de donde me quieran. Mi último libro es WordPress - La guía completa. Mi blog personal es Navegando con red, donde he crecido como escritor en la red y ofrezco mis visiones acerca de la Web 2.0 y la blogosfera. Sigue a @fernandot en Twitter

Comparte esta entrada en
468 ad

Ir al contenido