Oferta SiteGround Black Friday

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!

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en los emoticonos para valorarlo!

Promedio de puntuación 5 / 5. Total de votos: 6

Hasta ahora ¡no hay votos!. Sé el primero en valorar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en las redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Ayúdame a mejorar este contenido!

Por favor, dime, ¿cómo puedo mejorarlo?

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!

Sobre el autor

2 comentarios en “Cómo hacer para que se borren los adjuntos cuando borras una entrada”

  1. Hola Fernando, te agradezco mucho esta información, pero tengo una duda, esto también aplica para cuando hemos eliminado entradas pero no los adjuntos y estos han quedado almacenados en medios?

  2. Hola Fernando!

    Vuelto a tu blog luego de años! Esta vez queriendo eliminar los adjuntos de cientos de entradas que elimine por eso del contenido de baja calidad.

    Pues soy de los novatas que aún utiliza plugins para todo.

    He intentado colocar este código mediante el editor de wordpress, en el archivo functions.php

    Pero me sale un mensaje de error que dice «No ha sido posible comunicar con el sitio para comprobar los errores fatales, así que el cambio de PHP se ha revertido. Tendrás que subir el cambio a tu archivo PHP por otros medios, como por ejemplo usando SFTP.»

    ¿Como puedo solucionar esto?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información base sobre privacidad:
- Responsable: Fernando Tellado ([email protected])
- Fin del tratamiento: Moderación de comentarios para evitar spam
- Legitimación: Tu consentimiento
- Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal
- Derechos: Acceso, rectificación, portabilidad, olvido

 

Scroll al inicio