web-dev-qa-db-fra.com

URL indésirables de la bibliothèque multimédia dans les publications?

En cherchant un peu dans Google à chercher du contenu sur notre blog, j'ai été choqué et horrifié par le fait que certaines images de la médiathèque génèrent leurs propres URL que Google est en train de trouver et d'indexer!

Par exemple cette page:
http://blog.stackoverflow.com/2008/08/special-development-team-podcast/

Contient cette image:
http://blog.stackoverflow.com/wp-content/uploads/bio-jarrod-dixon.jpg

Ce qui est correct, mais d’une manière ou d’une autre, cette image est également exposée sous sa propre URL et "post":
http://blog.stackoverflow.com/2008/08/special-development-team-podcast/bio-jarrod-dixon/

C'est extrêmement indésirable!

J'ai vérifié les paramètres de média dans WordPress et parcouru la médiathèque, mais je ne trouve pas le moyen de désactiver ce comportement. Des idées?

13
Jeff Atwood

Cette chose que vous dites indésirable n’est qu’une fonctionnalité normale sous WordPress et elle ne peut pas être supprimée. Cependant, vous pouvez faire quelque chose pour pointer l'URL indésirable vers quelque chose de plus utile.

Voici un article de forum sur ce problème avec quelques corrections intéressantes et une description de ce qui se passe:

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

Les pièces jointes sont en fait un type de publication. Elles prennent donc une ligne dans la table des publications, comme une publication. Elles auront toujours une URL disponible, de la même manière que les publications.

c'est à dire. example.com/?p=16

16 est l'ID de l'article et, comme les articles, ils seront toujours disponibles via une URL comme ci-dessus. Les fichiers multimédias ne sont pas simplement considérés comme des fichiers, ils ont un contenu plus important, comme élément, en ce sens qu’ils ont dans la table des articles un enregistrement qui leur correspond, comme le fait un article ou une page.

Ce que vous demandez, c'est comment arrêter l’existence automatique d’URL de pièces jointes individuelles pour chaque élément de média (ce n’est pas vraiment possible, car c’est essentiellement un type de publication, ce qui signifie qu’ils seront toujours une URL pour eux).

Voici une suggestion cependant, prenez tout fichier modèle (thème), index.php, page.php, archive.php ou ce que vous préférez, créez une copie et renommez-le en image.php ou attachment.php si vous souhaitez cibler tous les médias. . Ouvrez le fichier, supprimez la boucle, sauvegardez ... et chargez l'une des pages en pièce jointe (comme celle que vous avez fournie précédemment) ..

Mon point étant, tout ce que vous avez à faire est de créer un fichier modèle de pièce jointe: http://codex.wordpress.org/Template_Hierarchy
http://codex.wordpress.org/Template_Hierarchy#Attachment_display

Si vous le souhaitez, vous pouvez théoriquement insérer une redirection dans le modèle de pièce jointe afin de rediriger les vues de pièces jointes individuelles (ou tout autre chose que vous souhaiteriez effectuer).

Quelqu'un a posté juste cela, un attachment.php qui va dans votre dossier /themes pour rediriger:

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

J'ai pensé qu'il était temps que j'essaye au moins d'effacer les pages de pièces jointes.

Voici mon premier coup au but ...

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;
}

Supprime les réécritures des pièces jointes, met à jour les liens des pièces jointes de manière à pointer vers le fichier de pièce jointe (au lieu de son permalien), supprime les vars de requête de pièce jointe et supprime également la possibilité de lier des pièces jointes au permalien désormais inexistant des pièces jointes.

Ouvert à la critique. :)

6
t31os

Vous pouvez effectuer une redirection 301 pour les pièces jointes vers la page de leur parent comme suit:

<?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 );
    }       
}
5
Ashfame

Le plug-in Yoast SEO a "Rediriger les URL de pièce jointe en URL de publication parent" sous permaliens . J'ai utilisé cette option pour résoudre le problème. Le plugin est incroyable.

5
Zach Shallbetter

Ceci est une réponse connexe à partir d'une question connexe: Désactive complètement les pages de pièces jointes

Cette méthode modifie les règles de réécriture.

Vous pouvez filtrer les règles de réécriture par défaut et les supprimer pour les pièces jointes:

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'oubliez pas de ré-enregistrer vos permaliens une fois. WordPress générera de nouvelles règles sans aucun lien avec les pièces jointes.

https://wordpress.stackexchange.com/a/271089/71608

0
italiansoda