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_ID
róż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_URL
która dynamicznie ustawia adres URL bieżącego bloga, chyba że upload_url_path
ustawiono 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.
źródło
Odpowiedzi:
Dlaczego nie po prostu użyć
get_option('upload_path')
po swoimswitch_to_blog( $blog_ID );
? Czy to robi to?źródło
get_blog_details
codex.wordpress.org/WPMU_Functions/get_blog_details )wp_upload_dir()
: Opcjaupload_path
nie 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łobywp_upload_dir()
całkowite rozwidlenie, aby uwzględnić wszystkie możliwe ustawienia i przypadki krawędzi.Dla kompletności, to rozwiązanie wydaje się działać, dopóki problem nie zostanie naprawiony w rdzeniu:
źródło
switch_to_blog()
jeszcze wolniej.