Segue função:
/**
* Redireciona páginas de anexo para o conteúdo correspondente (post, página, CPT ou taxonomia)
* que tenha o mesmo slug. Isso resolve conflitos de URL de forma abrangente.
* * Versão 2.0 - Universal
*/
add_action( 'template_redirect', 'corrigir_redirect_anexo_para_conteudo_geral', 10 );
function corrigir_redirect_anexo_para_conteudo_geral() {
// A função só executa em páginas de anexo.
if ( ! is_attachment() ) {
return;
}
global $post; // Pega o objeto do anexo atual.
$slug = $post->post_name;
// 1. PRIMEIRO, PROCURAMOS POR QUALQUER TIPO DE POST PÚBLICO
// Isso inclui 'post', 'page' e qualquer Custom Post Type (como 'produto', 'evento', etc.).
$args = [
'name' => $slug,
'post_type' => get_post_types( ['public' => true] ), // Pega todos os post types públicos
'post_status' => 'publish',
'posts_per_page' => 1
];
$post_query = new WP_Query($args);
if ( $post_query->have_posts() ) {
$post_query->the_post();
$link = get_permalink();
wp_reset_postdata(); // Restaura os dados do post original
wp_redirect( $link, 301 );
exit;
}
// 2. SE NENHUM POST FOR ENCONTRADO, PROCURAMOS POR UMA TAXONOMIA
// Isso inclui 'category', 'post_tag' e qualquer taxonomia personalizada.
$term = get_term_by( 'slug', $slug, '' ); // O último parâmetro vazio busca em TODAS as taxonomias
if ( $term && ! is_wp_error( $term ) ) {
$link = get_term_link( $term );
if ( $link && ! is_wp_error( $link ) ) {
wp_redirect( $link, 301 );
exit;
}
}
}