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;
        }
    }
}
Sitemap
Posts
🎊🥳🎈🎉

Mensagem enviada com sucesso!

Em breve retornaremos o seu contato.