URLs de biblioteca de mídia indesejados nas postagens?

14

Ao pesquisar um pouco o Google em busca de conteúdo em nosso blog, notei, para minha surpresa e horror, que imagens individuais da Biblioteca de Mídia estão de alguma forma gerando seus próprios URLs que o Google está encontrando e indexando de alguma forma!

Por exemplo, esta página:
http://blog.stackoverflow.com/2008/08/special-development-team-podcast/

Contém esta imagem:
http://blog.stackoverflow.com/wp-content/uploads/bio-jarrod-dixon.jpg

O que é bom, mas de alguma forma essa imagem também é exposta como seu próprio URL e "post":
http://blog.stackoverflow.com/2008/08/special-development-team-podcast/bio-jarrod-dixon/

Isso é extremamente indesejável!

Verifiquei as configurações de mídia no WordPress e naveguei pela Biblioteca de mídia, mas não consigo descobrir uma maneira de desativar esse comportamento. Alguma ideia?

Jeff Atwood
fonte

Respostas:

7

O que você está dizendo é indesejável é apenas uma funcionalidade normal no WordPress e não pode ser removido. No entanto, existem coisas que você pode fazer para apontar a URL indesejada para algo mais útil.

Aqui está uma postagem no fórum sobre esse problema, com algumas correções interessantes e uma descrição do que está acontecendo:

http://wordpress.org/support/topic/disable-attachment-posts-without-remove-the-medias

Os anexos são na verdade um tipo de postagem; portanto, eles ocupam uma linha na tabela de postagens, como sempre, eles sempre terão um URL disponível, da mesma maneira que as postagens fazem.

ie example.com/?p=16

16 é o ID da postagem, e as postagens semelhantes estarão sempre disponíveis por um URL como o acima. Os arquivos de mídia não são simplesmente considerados arquivos, eles têm um elemento mais semelhante ao conteúdo, pois possuem um registro na tabela de postagens que corresponde a eles, assim como uma postagem ou página.

O que você está perguntando é como interromper a existência automática de URLs de anexo individuais para cada item de mídia (não é realmente possível porque eles são essencialmente um tipo de postagem, o que significa que sempre será um URL para eles).

Aqui está uma sugestão: pegue qualquer arquivo de modelo (tema), index.php, page.php, archive.php ou o que você quiser, crie uma cópia e renomeie-a para image.php ou attachment.php, se desejar direcionar todas as mídias . Abra o arquivo, remova o loop, salve ... e carregue uma das páginas de anexo (como a que você forneceu antes) ..

O que quero dizer é que tudo que você precisa fazer é criar um arquivo de modelo de anexo: http://codex.wordpress.org/Template_Hierarchy
http://codex.wordpress.org/Template_Hierarchy#Attachment_display

Se você quisesse, em teoria, você poderia colocar um redirecionamento no modelo de anexo para que as visualizações de anexo individuais sejam redirecionadas (ou qualquer outra coisa que você queira fazer).

Alguém postou exatamente isso, um attachment.phpque entra na sua /themespasta para redirecionar:

<?php
header ('HTTP/1.1 301 Moved Permanently');
header ('Location: '.get_permalink($post->post_parent));
?>
Brady
fonte
6

Achei que já era hora de, pelo menos, tentar limpar minhas páginas de anexo.

Aqui está minha primeira chance ...

add_filter( 'attachment_fields_to_edit', 'wpse_25144_attachment_fields_to_edit', 10000, 2 );

function wpse_25144_attachment_fields_to_edit( $form_fields, $post ) {

    $url_type = get_option( 'image_default_link_type' );

    if( 'post' == $url_type ) {
        update_option( 'image_default_link_type', 'file' );
        $url_type = 'file';
    }

    $form_fields['url'] = array(
        'label'      => __('Link URL'),
        'input'      => 'html',
        'html'       => wpse_25144_image_link_input_fields( $post, $url_type ),
        'helps'      => __('Enter a link URL or click above for presets.')
    );

    return $form_fields;
}

function wpse_25144_image_link_input_fields($post, $url_type = '') {

    $file = wp_get_attachment_url($post->ID);

    if( empty( $url_type ) )
        $url_type = get_user_setting( 'urlbutton', 'file' );

    $url = '';
    if( $url_type == 'file' )
        $url = $file;

    return "
    <input type='text' class='text urlfield' name='attachments[$post->ID][url]' value='" . esc_attr($url) . "' /><br />
    <button type='button' class='button urlnone' title=''>" . __('None') . "</button>
    <button type='button' class='button urlfile' title='" . esc_attr($file) . "'>" . __('File URL') . "</button>
";
}

add_filter( 'query_vars', 'wpse_25144_query_vars', 10000, 2 );

function wpse_25144_query_vars( $wp_query_vars ) {

    foreach( $wp_query_vars as $i => $qv ) {
        if( in_array( $qv, array( 'attachment', 'attachment_id' ) ) )
            unset( $wp_query_vars[$i] );
    }
    return $wp_query_vars;
}

add_filter( 'attachment_link', 'wpse_25144_attachment_link', 10000, 2 );

function wpse_25144_attachment_link( $link, $id ) {

    $link = wp_get_attachment_url( $id );
    return $link;
}

add_filter( 'rewrite_rules_array', 'wpse_25144_rewrite_rules_array', 10000 );

function wpse_25144_rewrite_rules_array( $rewriteRules ) {

    foreach( $rewriteRules as $pattern => $query_string ) {
        if( false === strpos( $pattern, 'attachment' ) && false === strpos( $query_string, 'attachment' ) )
            continue;
        unset( $rewriteRules[$pattern] );
    }

    return $rewriteRules;
}

Remove a reescrita do anexo, atualiza os links do anexo para apontar para o arquivo do anexo (em vez do link permanente), remove os vars de consulta do anexo e também a capacidade de vincular anexos ao link permanente do anexo, agora inexistente.

Aberto à crítica. :)

t31os
fonte
5

Você pode fazer um redirecionamento 301 para anexos à página de seus pais assim:

<?php
/*
Plugin Name: Redirect Attachments to Parent (301)
Plugin URI: http://wordpress.stackexchange.com/questions/25144/unwanted-media-library-urls-in-posts
Description: Redirect any attachemnt pages to their parent's page with 301 redirection
Author: Ashfame
Version: 0.1
Author URI: http://www.ashfame.com/
*/

add_action( 'template_redirect', 'attachment_post_type_redirection' );

function attachment_post_type_redirection() {
    global $wp_query;       
    if ( is_attachment() ) {            
        wp_redirect( get_permalink( $wp_query->post->post_parent ), 301 );
    }       
}
Ashfame
fonte
5

O plug - in SEO do Yoast tem "Redirecionar URLs de anexo para URL de postagem principal" em links permanentes . Eu usei essa opção para resolver o problema. O plugin é incrível.

Zach Shallbetter
fonte
boa idéia, mas não sei se quero um multi-função de plugin inteiro para resolver este problema específico ..
Jeff Atwood
0

Esta é uma resposta relacionada a uma pergunta relacionada: Desative completamente as páginas de anexo

Este método modifica regras de reescrita.

Você pode filtrar as regras de reescrita padrão e removê-las dos anexos:

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' );  

Não se esqueça de salvar novamente seus permalinks uma vez. O WordPress irá gerar novas regras sem nada relacionado a anexos.

/wordpress//a/271089/71608

italiansoda
fonte