Desactivar completamente las páginas de adjuntos
Me gustaría desactivar completamente todas las páginas de adjuntos. Busqué en Google, pero solo encuentro información sobre cómo redirigir a la publicación principal o a la página de inicio. No considero que sea una solución elegante. ¿Por qué introducir enlaces permanentes innecesarios que redirigen a la página de inicio? ¿No se podría desactivar por completo?

Puedes filtrar las reglas de reescritura predeterminadas y eliminar aquellas para adjuntos:
function cleanup_default_rewrite_rules( $rules ) {
foreach ( $rules as $regex => $query ) {
if ( strpos( $regex, 'attachment' ) || strpos( $query, 'attachment' ) ) {
unset( $rules[ $regex ] );
}
}
return $rules;
}
add_filter( 'rewrite_rules_array', 'cleanup_default_rewrite_rules' );
No olvides volver a guardar tus enlaces permanentes una vez. WordPress generará nuevas reglas sin nada relacionado con adjuntos.
Ahora, la URL de la página de adjuntos devolverá un error 404. También puedes agregar esa redirección para evitar la página 404, que es inútil en este caso. Pero no estoy seguro de cómo capturar la redirección - is_attachment() no funcionará si las reglas de reescritura fueron eliminadas.
Actualización:
WordPress seguirá ofreciendo las URLs amigables de la página de adjuntos en la biblioteca multimedia y en el diálogo de inserción de medios. También puedes filtrar esto:
function cleanup_attachment_link( $link ) {
return;
}
add_filter( 'attachment_link', 'cleanup_attachment_link' );
En este caso, incluso cuando insertes tu adjunto en una publicación y selecciones "Enlazar a la página de adjuntos", la imagen se insertará sin el enlace.

¿Sería posible configurar la reescritura para que sea la URL del archivo multimedia (enlazado a wp-content/uploads
) en lugar de una página generada automáticamente?

Sí, me gustaría tener la posibilidad de redirigir todas las páginas de adjuntos a la URL del archivo también :)

Por cierto, este código no funciona completamente. Si el adjunto se carga para una publicación o página, entonces todo funciona bien. Si solo subes un adjunto a la biblioteca de medios, su página aún se abre.

@Mario62RUS 1. No todo el mundo usa Yoast SEO. A algunos les molesta la carga adicional que trae. Es como un cáncer para tu interfaz de administración. 2. Sí, las cosas han cambiado desde la 5.0 y Gutenberg. Este código debería revisarse.

ten en cuenta que en WP 6.4 hay un interruptor para desactivar los adjuntos, esta respuesta no evita que aparezca en el mapa del sitio de WP core, no detiene los endpoints de la API REST de adjuntos que contienen la URL, no desactiva los enlaces permanentes feos de las páginas de adjuntos, ni oculta la opción en las interfaces de galería/imagen/biblioteca de medios, etc.

Si deseas deshabilitar completamente las páginas de medios, deberías usar un código de respuesta 404 en lugar de redirección. Esto se puede hacer con el siguiente código:
function wpse237762_set_404() {
if (is_attachment()) {
global $wp_query;
$wp_query->set_404();
status_header(404);
}
}
// Esto mostrará 404 en la página de adjuntos
add_filter('template_redirect', 'wpse237762_set_404');
// Esto mostrará 404 en lugar de redirigir a la página de adjuntos al manejar una barra diagonal al final
add_filter('redirect_canonical', 'wpse237762_set_404', 0);
Para mantener los enlaces a las páginas de adjuntos funcionando y redirigirlos directamente al archivo, puedes usar el siguiente código:
function wpse237762_change_attachment_link($url, $id) {
$attachment_url = wp_get_attachment_url($id);
if ($attachment_url) {
return $attachment_url;
}
return $url;
}
add_filter('attachment_link', 'wpse237762_change_attachment_link', 10, 2);
Para evitar que las páginas de adjuntos reserven slugs de páginas normales, puedes usar este código para establecer todos los nuevos slugs de adjuntos como aleatorios (UUIDv4 en este caso)
function wpse237762_unique_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
if ($post_type === 'attachment') {
return str_replace('-', '', wp_generate_uuid4());
}
return $slug;
}
add_filter('wp_unique_post_slug', 'wpse237762_unique_slug', 10, 6);
Esto evitará que una imagen llamada products.jpeg
reserve la URL https://example.com/products
. Eso resultaría en que una página llamada Productos obtenga la URL https://example.com/products-2
, lo cual obviamente no sería ideal.
He reunido este código en el plugin Disable Attachment Pages, que también incluye una herramienta para aleatorizar los slugs existentes de adjuntos para que no causen problemas en el futuro.

Advertencia. Esta línea add_filter('redirect_canonical', 'wpse237762_set_404', 0); también deshabilita las redirecciones de enlaces cortos de WordPress como tudominio.com/?p=2570

Para aquellos que no usan plugins o prefieren un método ligero. Esto podría ser de ayuda.
Este método redirige los archivos adjuntos al archivo exacto en lugar de a la página de adjuntos y es el método que utilizan algunos plugins.
Para probarlo, coloca el siguiente código en el archivo functions.php
de tu tema.
add_action( 'template_redirect', 'test_attachment_redirect', 10 );
function test_attachment_redirect() {
if( is_attachment() ) {
$url = wp_get_attachment_url( get_queried_object_id() );
wp_redirect( $url, 301 );
}
return;
}
Referencia: is_attachment wp_redirect

Esto ahora es predeterminado en WP 6.4 y se puede configurar usando la opción wp_attachment_pages_enabled
. Los cambios son posibles
- vía CLI:
wp option set wp_attachment_pages_enabled 0|1
- visitando
/wp-admin/options.php
- a través de un pequeño plugin
Cuando esta opción se establece en 0
:
- las páginas de adjuntos ya no aparecen en la GUI como una opción al usar imágenes/galerías
- las URLs de las páginas de adjuntos redirigen a sus archivos originales para usuarios conectados
- los sitemaps/endpoints REST API etc usan la URL original de las subidas
Más detalles en https://make.wordpress.org/core/2023/10/16/changes-to-attachment-pages/
