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.

David
źródło
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?

Megan
źródło
(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);
Arbelzapf
źródło
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