Pobierz adres URL wg identyfikatora bloga w wielu miejscach


11

Istota pytania brzmi: szukam takiego rozwiązania:

$blog_upload_dir_info = wp_upload_dir( $date, $blog_ID );
$blog_upload_url = $blog_upload_dir_info[ 'baseurl' ];

Gdzie $blog_IDróżni się od obecnego identyfikatora bloga. Najbardziej »rozwiązanie oczywiste« nie działa:

switch_to_blog( $blog_ID );
$blog_upload_dir_info = wp_upload_dir();
restore_current_blog();

ponieważ wp_upload_dir () opiera się na stałej, WP_CONTENT_URLktóra dynamicznie ustawia adres URL bieżącego bloga, chyba że upload_url_pathustawiono opcję .

Oczywiście mógłbym ustawić tę opcję, ale sparowałoby to mój kod z konkretnymi ustawieniami systemu, które zawierają duży potencjał »WTF?«.

Postanowiłem więc dodać tę opcję wirtualnie:

/**
 * Apply a value to the option blog_upload_url 
 * if there's not already one 
 *
 * @wp-hook option_upload_url_path
 * @param string $upload_url
 * @return string
 */
function get_real_blog_upload_url( $upload_url ) {

    if ( '' !== trim( $upload_url ) )
        return $upload_url;

    $upload_path = trim( get_option( 'upload_path' ) );
    $siteurl = get_option( 'siteurl' );
    $wp_content_dir = $siteurl . '/wp-content';

    if ( empty( $upload_path ) || 'wp-content/uploads' == $upload_path ) {
        $dir = $wp_content_dir . '/uploads';
    } elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) {
        // $dir is absolute, $upload_path is (maybe) relative to ABSPATH
        $dir = path_join( ABSPATH, $upload_path );
    } else {
        $dir = $upload_path;
    }

    if ( empty( $upload_path ) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) )
        $upload_path = $wp_content_dir . '/uploads';
    else
        $upload_path = trailingslashit( $siteurl ) . $upload_path;


    return $upload_path;
}

który jest w rzeczywistości częściowo rozwidleniem wp_upload_dir()i jako taki opiera się na stałych, co wcale nie jest dobrą praktyką . Co więcej, widelec jest zawsze sprzężony z oryginalną implementacją, a jeśli oryginalne zmiany ulegną zmianie, należy również naprawić widelec.

Ponieważ to rozwiązanie jest dalekie od doskonałości, zastanawiam się, czy istnieje lepszy sposób na uzyskanie adresów URL przesyłania według identyfikatorów blogów.


1
Istnieje inne obejście tego problemu w Plugin Multilingual Press: github.com/inpsyde/multilingual-press/blob/…
David

1
Myślę, że pomocne jest dodanie źródła jako odpowiedzi dla innych czytelników. Link nie jest stabilny i znajduje się poza odpowiedzią WPSE.
bueltge

1
@bueltge Zasadniczo się zgadzam. Ale mój komentarz dotyczący tego obejścia był nieco przesadny. Rozwiązanie jest podejściem do tego problemu, ale ma pewne ograniczenia: github.com/inpsyde/multilingual-press/issues/133 Kiedy znajdziemy rozwiązanie, oczywiście również tutaj odpowiem.
David,

Odpowiedzi:


1

Dlaczego nie po prostu użyć get_option('upload_path')po swoim switch_to_blog( $blog_ID );? Czy to robi to?


(Zbuduj pełny adres URL za pomocą get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Megan

Zajrzyj do wp_upload_dir(): Opcja upload_pathnie jest opcją domyślną i może być pusta. Ponadto można pominąć tę opcję upload_url_path. Jednak właściwym rozwiązaniem tego problemu byłoby wp_upload_dir()całkowite rozwidlenie, aby uwzględnić wszystkie możliwe ustawienia i przypadki krawędzi.
David

-1

Dla kompletności, to rozwiązanie wydaje się działać, dopóki problem nie zostanie naprawiony w rdzeniu:

add_action('switch_blog', function($new_blog, $prev_blog_id) {
    update_option( 'upload_url_path',  get_option('siteurl') . '/wp-content/uploads');
}, 10, 2);

1
Tak, to powinno działać w standardowych instalacjach WordPress. Jednak nie chciałbym tego używać ze względu na działanie zapisu DB. To sprawi, że będzie switch_to_blog()jeszcze wolniej.
David

Zakłada się również, że Twój adres URL treści to wp-content / uploads, co może nie być prawdą.
rfair404 18.04.17
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.