Dapatkan URL unggah dengan ID blog di multisite

11

Inti dari pertanyaannya adalah, saya mencari solusi seperti ini:

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

Di mana $blog_IDberbeda dengan ID blog saat ini. Solusi «WP-paling jelas« gagal:

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

sebagai wp_upload_dir () bergantung pada konstanta WP_CONTENT_URLyang secara dinamis mengatur URL blog saat ini kecuali jika opsi upload_url_pathdisetel.

Tentu saja, saya dapat mengatur opsi ini, tetapi ini akan memasangkan kode saya ke pengaturan sistem konkret yang mencakup banyak »WTF?« - potensial.

Jadi saya memutuskan untuk menambahkan opsi ini secara virtual:

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

yang notabene sebagian bercabang wp_upload_dir()dan karenanya bergantung pada konstanta yang sama sekali bukan praktik yang baik . Selain itu, garpu selalu digabungkan dengan implementasi asli dan jika perubahan asli, kita juga harus memperbaiki garpu.

Jadi karena solusi ini jauh dari sempurna, saya bertanya-tanya apakah ada cara yang lebih baik untuk mendapatkan URL unggah dengan ID blog.

David
sumber
1
Ada solusi lain untuk masalah ini di Plugin Multilingual Press: github.com/inpsyde/multilingual-press/blob/…
David
1
Saya pikir sangat membantu jika Anda menambahkan sumber sebagai jawaban untuk pembaca lain. Tautan tidak stabil dan di luar Jawaban WPSE.
bueltge
1
@ Bueltge Pada dasarnya saya setuju. Tapi komentar saya yang mengandalkan solusi ini agak terlalu terburu-buru. Solusinya adalah pendekatan untuk masalah ini, tetapi memiliki beberapa keterbatasan: github.com/inpsyde/multilingual-press/issues/133 Ketika kami menemukan solusi, saya tentu akan menjawabnya di sini juga.
David

Jawaban:

1

Mengapa tidak menggunakan saja get_option('upload_path')setelah Anda switch_to_blog( $blog_ID );? Apakah itu berhasil?

Megan
sumber
(Bangun URL lengkap dengan menggunakan get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Megan
Lihat ke dalam wp_upload_dir(): Opsi upload_pathini bukan opsi default dan mungkin kosong. Lebih lanjut itu bisa dihilangkan dengan opsi upload_url_path. Namun, solusi yang tepat untuk masalah ini adalah dengan memotong wp_upload_dir()sepenuhnya untuk menutup semua pengaturan yang mungkin dan case tepi ini.
David
-1

Demi kelengkapan, solusi ini tampaknya berfungsi sampai masalah ini diperbaiki pada intinya:

add_action('switch_blog', function($new_blog, $prev_blog_id) {
    update_option( 'upload_url_path',  get_option('siteurl') . '/wp-content/uploads');
}, 10, 2);
Arbelzapf
sumber
1
Ya, itu seharusnya bekerja di instalasi WordPress standar. Namun, saya tidak ingin menggunakan ini karena aksi tulis DB. Ini akan membuat switch_to_blog()lebih lambat.
David
Ini juga mengasumsikan bahwa url konten Anda sebenarnya wp-content / upload, yang mungkin tidak terjadi.
rfair404