Niechciane adresy URL bibliotek multimediów w postach?

14

Podczas wyszukiwania Google w poszukiwaniu treści na naszym blogu zauważyłem z szokiem i przerażeniem, że poszczególne obrazy z Biblioteki multimediów w jakiś sposób generują własne adresy URL, które Google w jakiś sposób znajduje i indeksuje!

Na przykład ta strona:
http://blog.stackoverflow.com/2008/08/special-development-team-podcast/

Zawiera ten obraz:
http://blog.stackoverflow.com/wp-content/uploads/bio-jarrod-dixon.jpg

Co jest w porządku, ale w jakiś sposób ten obraz jest również ujawniany jako własny adres URL i „post”:
http://blog.stackoverflow.com/2008/08/special-development-team-podcast/bio-jarrod-dixon/

To jest bardzo niechciane!

Sprawdziłem ustawienia multimediów w WordPressie i przeszukałem bibliotekę multimediów, ale nie mogę znaleźć sposobu na wyłączenie tego zachowania. Jakieś pomysły?

Jeff Atwood
źródło

Odpowiedzi:

7

To, co mówisz, jest niepożądane, to po prostu normalna funkcjonalność w WordPressie i nie można go usunąć. Są jednak rzeczy, które możesz zrobić, aby wskazać niechciany adres URL na coś bardziej przydatnego.

Oto post na forum na ten temat z kilkoma interesującymi poprawkami i opisem tego, co się dzieje:

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

Załączniki są w rzeczywistości typem postu, więc zajmują wiersz w tabeli postów, podobnie jak post, zawsze będą mieć dostępny adres URL, w taki sam sposób, jak posty…

to znaczy. example.com/?p=16

16 to identyfikator posta i podobnie jak posty będą zawsze dostępne pod adresem URL takim jak powyżej. Pliki multimedialne nie są po prostu uważane za pliki, mają bardziej treściowy element, ponieważ mają zapis w tabeli postów, który im odpowiada, podobnie jak post lub strona.

Pytasz o to, jak zatrzymać automatyczne istnienie pojedynczych adresów URL załączników dla każdego elementu multimedialnego (nie jest to naprawdę możliwe, ponieważ są one zasadniczo typem postu, co oznacza, że ​​zawsze będą dla nich adresem URL).

Oto sugestia: weź dowolny plik szablonu (motywu), index.php, page.php, archive.php lub cokolwiek chcesz, utwórz kopię i zmień jej nazwę na image.php lub załącznik.php, jeśli chcesz kierować reklamy na wszystkie media . Otwórz plik, usuń pętlę, zapisz ... i załaduj jedną ze stron załączników (takich jak ta, którą podałeś wcześniej) ..

Chodzi mi o to, że wszystko, co musisz zrobić, to utworzyć plik szablonu załącznika: http://codex.wordpress.org/Template_Hierarchy
http://codex.wordpress.org/Template_Hierarchy#Attachment_display

Jeśli chcesz, teoretycznie możesz umieścić przekierowanie w szablonie załącznika, aby przekierować poszczególne widoki załączników (lub dowolną liczbę innych rzeczy, które możesz chcieć zrobić).

Ktoś właśnie to opublikował, attachment.phpktóry trafia do twojego /themesfolderu, aby przekierować:

<?php
header ('HTTP/1.1 301 Moved Permanently');
header ('Location: '.get_permalink($post->post_parent));
?>
Brady
źródło
6

Doszedłem do wniosku, że nadszedł czas, by przynajmniej spróbować swoich sił w usuwaniu stron załączników.

Oto mój pierwszy strzał ...

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

Usuwa przepisywanie załączników, aktualizuje łącza załączników, tak aby wskazywały na plik załączników (zamiast bezpośredniego linku), usuwa zmienne zapytań o załączniki, a także usuwa możliwość łączenia załączników z nieistniejącym odnośnikiem do załącznika.

Otwarty na krytykę. :)

t31os
źródło
5

Możesz wykonać przekierowanie 301 dla załączników do strony ich rodzica w następujący sposób:

<?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 );
    }       
}
Popiół
źródło
5

Wtyczka SEO firmy Yoast ma „Przekieruj adresy URL załączników do adresu URL posta nadrzędnego” w linkach bezpośrednich . Skorzystałem z tej opcji, aby rozwiązać problem. Wtyczka jest niesamowita.

Zach Shallbetter
źródło
dobry pomysł, ale nie wiem, chcę cały plugin wielofunkcyjny rozwiązać ten jeden szczególny problem ..
Jeff Atwood
0

Oto pokrewna odpowiedź na powiązane pytanie: Całkowicie wyłącz strony załączników

Ta metoda modyfikuje reguły przepisywania.

Możesz filtrować domyślne reguły przepisywania i usuwać je dla załączników:

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

Nie zapomnij raz jeszcze zapisać swoich permalinków. WordPress wygeneruje nowe reguły bez niczego związanego z załącznikami.

/wordpress//a/271089/71608

italiansoda
źródło